国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Hibernate Shards 數(shù)據(jù)的水平、垂直切割(二)- Hibernate Shards基本演示
準(zhǔn)備
1. 以Hibernate Shards 數(shù)據(jù)的水平、垂直切割(一)- Hibernate測(cè)試環(huán)境的項(xiàng)目為基礎(chǔ)
2. Hibernate Shards使用了commons logging,下載個(gè)項(xiàng)目最新的release版本。這里用的版本為1.1.1
3. 在Hibernate Shards 數(shù)據(jù)的水平、垂直切割(一)- Hibernate測(cè)試環(huán)境中,我們?cè)趍ysql中建立了一個(gè)hbshards數(shù)據(jù)庫(kù),為了測(cè)試shards再建立一個(gè)hbshards2的數(shù)據(jù)庫(kù),contact表的結(jié)構(gòu)一樣
4. 將Hibernate Shards發(fā)布包中的hibernate-shards.jar放到lib目錄
    項(xiàng)目引用添加hibernate-shards.jar
    將commons logging發(fā)布包中的commons-logging-1.1.1.jar放到lib目錄
    CLASSPATH中添加hibernate-shards.jar、commons-logging-1.1.1.jar

Hibernate Shards測(cè)試項(xiàng)目
出于結(jié)構(gòu)上的簡(jiǎn)單考慮,定義一個(gè)ShardableEntity的接口,讓ContactEntity實(shí)現(xiàn)這個(gè)接口:
public interface ShardableEntity {    public String getIdentifier();}public class ContactEntity implements ShardableEntity {    public String getIdentifier(){        return this._id;    }    //other code omitted is the same with previous post}
映射文件ContactEntity.hbm.xml與上一篇文章中的一樣
因?yàn)槲覀冃枰獙ontact的數(shù)據(jù)以切片的形式存入2個(gè)數(shù)據(jù)庫(kù)中,因此需要配置這2個(gè)數(shù)據(jù)庫(kù)的信息。Hibernate Shards通過(guò)定義2個(gè)hibernate的配置文件解決這個(gè)問(wèn)題:
shard0.hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC     "-//Hibernate/Hibernate Configuration DTD//EN"     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory>      <property name="connection.driver_class">com.mysql.jdbc.Driver</property>      <property name="connection.url">jdbc:mysql://localhost/hbshards</property>      <property name="connection.username">root</property>      <property name="connection.password">dev</property>      <property name="connection.pool_size">10</property>      <property name="show_sql">true</property>      <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>      <property name="hbm2ddl.auto">validate</property>      <property name="hibernate.connection.shard_id">0</property>      <property name="hibernate.shard.enable_cross_shard_relationship_checks">false</property>      <mapping resource="ContactEntity.hbm.xml" /></session-factory></hibernate-configuration>
shard1.hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC     "-//Hibernate/Hibernate Configuration DTD//EN"     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory>      <property name="connection.driver_class">com.mysql.jdbc.Driver</property>      <property name="connection.url">jdbc:mysql://localhost/hbshards2</property>      <property name="connection.username">root</property>      <property name="connection.password">dev</property>      <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>      <property name="hibernate.connection.shard_id">1</property>      <property name="hibernate.shard.enable_cross_shard_relationship_checks">false</property></session-factory></hibernate-configuration>
其中shard0.hibernate.cfg.xml作為主要的配置文件,針對(duì)每個(gè)shard創(chuàng)建的SessionFactory對(duì)象,除了數(shù)據(jù)庫(kù)連接信息的配置之外,都來(lái)自shard0.hibernate.cfg.xml
針對(duì)其他每個(gè)shard創(chuàng)建的SessionFactory,數(shù)據(jù)庫(kù)連接信息從相應(yīng)的配置文件(例如shard1.hibernate.cfg.xml)中讀取,讀取的內(nèi)容包括connection.url、connection.username、connection.password、 connection.datasource。為了hibernate加載其他shard的配置文件時(shí)不拋異常,在其他shard的配置文件中我們還是把必要的配置屬性寫上去了
hibernate.connection.shard_id屬性為每個(gè)shard定義一個(gè)id,必須有一個(gè)shard_id為0的shard,其他的shard_id可以定義為任意整數(shù)

我們假定contact的id都是由數(shù)字組成的一個(gè)8位長(zhǎng)度的字符串
對(duì)contact的切割策略簡(jiǎn)單定義為: contact id第一個(gè)字符為0-4的存入shard0中,為5-9的存入shard1中
為了實(shí)現(xiàn)這一策略,我們需要實(shí)現(xiàn)hibernate shards的2個(gè)接口
ShardResolutionStrategy接口的實(shí)現(xiàn):
import java.util.List;import java.util.ArrayList;import org.hibernate.shards.strategy.resolution.ShardResolutionStrategy;import org.hibernate.shards.strategy.selection.ShardResolutionStrategyData;import org.hibernate.shards.ShardId;/* * a simple ShardResolutionStrategy implementation for our ContactEntity */public class MyShardResolutionStrategy implements ShardResolutionStrategy {    private List<ShardId> _shardIds;    public MyShardResolutionStrategy(List<ShardId> shardIds){        this._shardIds = shardIds;    }    public List selectShardIdsFromShardResolutionStrategyData(            ShardResolutionStrategyData arg0){        List ids = new ArrayList();        String id = (String)arg0.getId();        if(id==null || id.isEmpty()) ids.add(this._shardIds.get(0));        else{            //our shard selection is identified by the             //first char(number) in contact id            //0-4 => shards0, 5-9 => shards1            Integer i = new Integer(id.substring(0, 1));            ids.add(this._shardIds.get(i/5));        }        return ids;    }}
ShardSelectionStrategy接口的實(shí)現(xiàn):
import java.util.List;import org.hibernate.shards.ShardId;import org.hibernate.shards.strategy.selection.ShardSelectionStrategy;/* * a simple ShardSelectionStrategy implementation for our ContactEntity */public class MyShardSelectionStrategy implements ShardSelectionStrategy {       private List<ShardId> _shardIds;       public MyShardSelectionStrategy(List<ShardId> shardIds){           this._shardIds=shardIds;       }       public ShardId selectShardIdForNewObject(Object obj) {           if(obj instanceof ShardableEntity) {               String id = ((ShardableEntity)obj).getIdentifier();               if(id==null || id.isEmpty()) return this._shardIds.get(0);               Integer i = new Integer(id.substring(0, 1));               //our shard selection is identified by the                //first char(number) in contact id               //0-4 => shards0, 5-9 => shards1               return this._shardIds.get(i/5);           }           //for non-shardable entities we just use shard0           return this._shardIds.get(0);    }}
接下來(lái)就是怎么使用hibernate shards的測(cè)試代碼了:
import java.util.Iterator;import java.util.List;import java.util.ArrayList;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.shards.*;import org.hibernate.shards.cfg.*;import org.hibernate.shards.strategy.*;import org.hibernate.shards.strategy.access.*;import org.hibernate.shards.strategy.resolution.*;import org.hibernate.shards.strategy.selection.*;
public class Main { public static void main(String[] args) { HibernateShardsTest(args); } private static SessionFactory createSessionFactory() { //加載主配置文件,為每個(gè)shard創(chuàng)建SessionFactory對(duì)象時(shí)將 //以他作為原型 Configuration prototypeCfg = new Configuration() .configure("shard0.hibernate.cfg.xml"); //每個(gè)shard的配置文件 List<ShardConfiguration> shardCfgs = new ArrayList<ShardConfiguration>(); shardCfgs.add(buildShardConfig("shard0.hibernate.cfg.xml")); shardCfgs.add(buildShardConfig("shard1.hibernate.cfg.xml")); //數(shù)據(jù)切片策略的工廠對(duì)象 ShardStrategyFactory strategyFactory = buildShardStrategyFactory(); ShardedConfiguration shardedConfig = new ShardedConfiguration( prototypeCfg, shardCfgs, strategyFactory); //返回一個(gè)ShardedSessionFactory對(duì)象 return shardedConfig.buildShardedSessionFactory(); } private static ShardStrategyFactory buildShardStrategyFactory() { ShardStrategyFactory factory = new ShardStrategyFactory() { //測(cè)試用的自定義數(shù)據(jù)切片策略的工廠類 public ShardStrategy newShardStrategy(List<ShardId> shardIds) { ShardSelectionStrategy ss = new MyShardSelectionStrategy(shardIds); ShardResolutionStrategy rs = new MyShardResolutionStrategy(shardIds); ShardAccessStrategy as = new SequentialShardAccessStrategy(); return new ShardStrategyImpl(ss, rs, as); } }; return factory; } private static ShardConfiguration buildShardConfig(String configFile) { Configuration config = new Configuration().configure(configFile); return new ConfigurationToShardConfigurationAdapter(config); } private static void HibernateShardsTest(String[] args){ String loginId = "RicCC@cnblogs.com"; String password = "123"; if(args!=null && args.length==2){ loginId = args[0]; password = args[1]; } SessionFactory factory = null; try{ factory = createSessionFactory(); ShardsTestCreate(factory); ShardsTestLogin(factory, loginId, password); ShardsTestDelete(factory); }catch(Exception e){ System.out.println(e.getMessage()); e.printStackTrace(); }finally{ if(factory!=null) factory.close(); } } private static void ShardsTestCreate(SessionFactory factory){ Session session = null; Transaction transaction = null; System.out.println("===Create Contacts==="); try{ session = factory.openSession(); transaction = session.beginTransaction(); session.save(new ContactEntity("01111111","RicCC@cnblogs.com" , "123", "Richie", "RicCC@cnblogs.com")); session.save(new ContactEntity("91111111","a@cnblogs.com" , "123", "AAA", "a@cnblogs.com")); session.save(new ContactEntity("81111111","b@cnblogs.com" , "123", "BBB", "b@cnblogs.com")); session.save(new ContactEntity("31111111","c@cnblogs.com" , "123", "CCC", "c@cnblogs.com")); transaction.commit(); }catch(Exception e){ if(transaction!=null) transaction.rollback(); System.out.println(e.getMessage()); e.printStackTrace(); }finally{ if(session!=null) session.close(); } } private static void ShardsTestLogin(SessionFactory factory , String loginId, String password){ Session session = null; ContactEntity c = null; System.out.println("\n===Login Test==="); try{ session = factory.openSession(); List contacts = session.createQuery("from ContactEntity where LoginId=:loginId") .setString("loginId", loginId) .list(); if(contacts.isEmpty()) System.out.println("Contact \"" + loginId + "\" not found!"); else{ c = (ContactEntity)contacts.get(0); if(c.getPassword().equals(password)) System.out.println("Contact \"" + loginId + "\" login successful"); else System.out.println("Password is incorrect (should be: " + c.getPassword() + ", but is: " + password + ")"); } System.out.println("\n===Get Contact by Id==="); c = (ContactEntity)session.get(ContactEntity.class, "81111111"); System.out.println(c.toString()); c = (ContactEntity)session.get(ContactEntity.class, "31111111"); System.out.println(c.toString()); }catch(Exception e){ System.out.println(e.getMessage()); e.printStackTrace(); }finally{ if(session!=null) session.close(); } } private static void ShardsTestDelete(SessionFactory factory){ Session session = null; Transaction transaction = null; System.out.println("\n===Delete Contacts==="); try{ session = factory.openSession(); transaction = session.beginTransaction(); List contacts = session.createQuery("from ContactEntity").list(); Iterator it = contacts.iterator(); while(it.hasNext()){ session.delete(it.next()); } transaction.commit(); }catch(Exception e){ if(transaction!=null) transaction.rollback(); System.out.println(e.getMessage()); e.printStackTrace(); }finally{ if(session!=null) session.close(); } }}
項(xiàng)目結(jié)構(gòu)圖:
    
 

運(yùn)行測(cè)試
用Eclipse編譯class文件,將生成的所有class文件以及相關(guān)的配置、映射文件拷貝到lib目錄中,運(yùn)行Main.class結(jié)果如下:
D:\Work\research\Java\Hibernate-Test\lib>java Main
===Create Contacts===
Hibernate: insert into CONTACT (EMAIL, NAME, LOGIN_ID, PASSWORD, ID) values (?,?, ?, ?, ?)
Hibernate: insert into CONTACT (EMAIL, NAME, LOGIN_ID, PASSWORD, ID) values (?,?, ?, ?, ?)
Hibernate: insert into CONTACT (EMAIL, NAME, LOGIN_ID, PASSWORD, ID) values (?,?, ?, ?, ?)
Hibernate: insert into CONTACT (EMAIL, NAME, LOGIN_ID, PASSWORD, ID) values (?,?, ?, ?, ?)

===Login Test===
Hibernate: select contactent0_.ID as ID0_, contactent0_.EMAIL as EMAIL0_, contactent0_.NAME as NAME0_, contactent0_.LOGIN_ID as LOGIN4_0_, contactent0_.PASSWORD as PASSWORD0_ from CONTACT contactent0_ where contactent0_.LOGIN_ID=?
Hibernate: select contactent0_.ID as ID0_, contactent0_.EMAIL as EMAIL0_, contactent0_.NAME as NAME0_, contactent0_.LOGIN_ID as LOGIN4_0_, contactent0_.PASSWORD as PASSWORD0_ from CONTACT contactent0_ where contactent0_.LOGIN_ID=?
Contact "RicCC@cnblogs.com" login successful

===Get Contact by Id===
Hibernate: select contactent0_.ID as ID0_0_, contactent0_.EMAIL as EMAIL0_0_, contactent0_.NAME as NAME0_0_, contactent0_.LOGIN_ID as LOGIN4_0_0_, contactent0_.PASSWORD as PASSWORD0_0_ from CONTACT contactent0_ where contactent0_.ID=?
{ Id="81111111", LoginId="b@cnblogs.com", Name="BBB", EMail="b@cnblogs.com" }
Hibernate: select contactent0_.ID as ID0_0_, contactent0_.EMAIL as EMAIL0_0_, contactent0_.NAME as NAME0_0_, contactent0_.LOGIN_ID as LOGIN4_0_0_, contactent0_.PASSWORD as PASSWORD0_0_ from CONTACT contactent0_ where contactent0_.ID=?
{ Id="31111111", LoginId="c@cnblogs.com", Name="CCC", EMail="c@cnblogs.com" }

===Delete Contacts===
Hibernate: select contactent0_.ID as ID0_, contactent0_.EMAIL as EMAIL0_, contactent0_.NAME as NAME0_, contactent0_.LOGIN_ID as LOGIN4_0_, contactent0_.PASSWORD as PASSWORD0_ from CONTACT contactent0_
Hibernate: select contactent0_.ID as ID0_, contactent0_.EMAIL as EMAIL0_, contactent0_.NAME as NAME0_, contactent0_.LOGIN_ID as LOGIN4_0_, contactent0_.PASSWORD as PASSWORD0_ from CONTACT contactent0_
Hibernate: delete from CONTACT where ID=?
Hibernate: delete from CONTACT where ID=?
Hibernate: delete from CONTACT where ID=?
Hibernate: delete from CONTACT where ID=?

1. 通過(guò)id加載實(shí)體的時(shí)候,hibernate shards使用ShardSelectionStrategy來(lái)決定應(yīng)當(dāng)從哪個(gè)shard加載數(shù)據(jù)
2. 新增數(shù)據(jù)的時(shí)候,hibernate shards使用ShardResolutionStrategy來(lái)決定應(yīng)當(dāng)將數(shù)據(jù)insert到哪個(gè)shard中
    這里為什么不能使用ShardSelectionStrategy呢?因?yàn)榕cid的生成機(jī)制相關(guān),比如說(shuō)可以讓數(shù)據(jù)庫(kù)來(lái)生成id(hibernate中的native方式),例如自增id,在shard的應(yīng)用場(chǎng)景下可以簡(jiǎn)單的給每個(gè)shard一個(gè)起止范圍,只是在insert數(shù)據(jù)的時(shí)候必須通過(guò)特定的算法決定將數(shù)據(jù)insert到哪個(gè)shard中,這樣的情況下ShardSelectionStrategy是無(wú)法運(yùn)用的。而對(duì)于assigned等類似的 id生成機(jī)制,還是可以運(yùn)用ShardSelectionStrategy策略的
3. 執(zhí)行hql或者Criteria查詢的時(shí)候,則使用ShardAccessStrategy從shard中查詢數(shù)據(jù)
    上面示例中的buildShardStrategyFactory方法中,我們使用了hibernate shards項(xiàng)目提供的SequentialShardAccessStrategy策略,這個(gè)策略在所有shards中逐個(gè)執(zhí)行查詢語(yǔ)句,然后對(duì)各個(gè)結(jié)果進(jìn)行合并 

基于上面幾點(diǎn),我們可以對(duì)上面測(cè)試運(yùn)行后的輸出做出解釋了:
兩個(gè)使用了hql的地方,都產(chǎn)生了兩次sql查詢,這是因?yàn)槭褂昧薙equentialShardAccessStrategy緣故,他從我們定義的兩個(gè)shard中分別執(zhí)行sql查詢,合并結(jié)果集返回給調(diào)用者

把測(cè)試代碼中的刪除語(yǔ)句注釋掉,運(yùn)行測(cè)試后查詢數(shù)據(jù)庫(kù),可以確認(rèn)數(shù)據(jù)都是正確的insert在相應(yīng)的shard中的

總結(jié)
上面演示了hibernate shards的基本用法,總體來(lái)看使用上非常簡(jiǎn)單,只需要針對(duì)實(shí)施shard的實(shí)體使用hibernate shards提供的ShardedSessionFactory即可
使用hibernate shards也存在一些限制,但大部分都是使用shards后的一些設(shè)計(jì)要求,或者是目前的it技術(shù)背景下對(duì)shards設(shè)計(jì)上的約束,在后面一篇中再詳細(xì)整理一下這方面內(nèi)容
文中使用的測(cè)試項(xiàng)目源文件在這里: 下載。引用到的jar文件需要從相關(guān)項(xiàng)目網(wǎng)站去下載
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
jbpm開發(fā)指南3
SSH實(shí)現(xiàn)的增刪改查實(shí)例
hibernate調(diào)用mysql存儲(chǔ)過(guò)程
Struts 2與Hibernate整合(入門)
SpringSide3.1.4開發(fā)web(1)--轉(zhuǎn)載
hibernate入門使用系列 1-- 說(shuō)明篇+試用篇 - 圍墻 - ITeye技術(shù)網(wǎng)站
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服