<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    wang123

    Hibernate Shard簡介介紹

    HibernateShard
        多數(shù)據(jù)庫水平分區(qū)解決方案。

    1. 簡介
         Hibernate 的一個擴展,用于處理多數(shù)據(jù)庫水平分區(qū)架構(gòu)。
         由google工程師 2007年 捐獻給 Hibernate社區(qū)。 
         http://www.hibernate.org/414.html
         目前版本:   3.0.0 beta2, 未發(fā)GA版。
         條件:Hibernate Core 3.2, JDK 5.0

    2. 水平分區(qū)原理
         一個庫表如 Order 存在于多個數(shù)據(jù)庫實例上。按特定的分區(qū)邏輯,將該庫表的數(shù)據(jù)存儲在這些實例中,一條記錄的主鍵 PK,在所有實例中不得重復(fù)。
       
        水平分區(qū)在大型網(wǎng)站,大型企業(yè)應(yīng)用中經(jīng)常采用。 像www.sina.com.cn ,www.163.com  www.bt285.cn www.guihua.org
        目的出于海量數(shù)據(jù)分散存儲,分散操作,分散查詢以便提高數(shù)據(jù)處理量和整體數(shù)據(jù)處理性能。
      
        使用:
          google工程師的設(shè)計還是非常好的,完全兼容 Hibernate本身的主要接口。
    Java代碼 復(fù)制代碼
    1. org.hibernate.Session   
    2. org.hibernate.SessionFactory    
    3.  org.hibernate.Criteria    
    4.  org.hibernate.Query   

         因此程序員開發(fā)變化不大,甚至不需要關(guān)心后臺使用了分區(qū)數(shù)據(jù)庫。程序遷移問題不大。而且配置上比較簡明。

    3. 三種策略:
       1) ShardAccessStrategy, 查詢操作時,到那個分區(qū)執(zhí)行。
          默認提供兩個實現(xiàn):
          順序策略:SequentialShardAccessStrategy, 每個query按順序在所有分區(qū)上執(zhí)行。
          平行策略:ParallelShardAccessStrategy, 每個query以多線程方式并發(fā)平行的在所有分區(qū)上執(zhí)行。 此策略下,需要使用線程池機制滿足特定的性能需要,java.util.concurrent.ThreadPoolExecutor。

       2) ShardSelectionStrategy, 新增對象時,存儲到哪個分區(qū)。
             框架默認提供了一個輪詢選擇策略 RoundRobinShardSelectionStrategy, 但一般不這樣使用。
            通常采用“attribute-based sharding”機制,基于屬性分區(qū)。一般是用戶根據(jù)表自己實現(xiàn)一個基于屬性分區(qū)的策略類ShardSelectionStrategy ,例如,以下WeatherReport基于continent屬性選擇分區(qū):
    Java代碼 復(fù)制代碼
    1.   public class WeatherReportShardSelectionStrategy implements ShardSelectionStrategy {   
    2. public ShardId selectShardIdForNewObject(Object obj) {   
    3.     if(obj instanceof WeatherReport) {   
    4.         return ((WeatherReport)obj).getContinent().getShardId();   
    5.     }   
    6.     throw new IllegalArgumentException();   
    7. }   

     

       3) ShardResolutionStrategy, 該策略用于查找單個對象時,判斷它在哪個或哪幾個分區(qū)上。
          默認使用 AllShardsShardResolutionStrategy ,可以自定義例如:
    Java代碼 復(fù)制代碼
    1. public class WeatherReportShardResolutionStrategy extends AllShardsShardResolutionStrategy {   
    2.     public WeatherReportShardResolutionStrategy(List<ShardId> shardIds) {   
    3.         super(shardIds);   
    4.     }   
    5.   
    6.     public List<ShardId> selectShardIdsFromShardResolutionStrategyData(   
    7.             ShardResolutionStrategyData srsd) {   
    8.         if(srsd.getEntityName().equals(WeatherReport.class.getName())) {   
    9.             return Continent.getContinentByReportId(srsd.getId()).getShardId();   
    10.         }   
    11.         return super.selectShardIdsFromShardResolutionStrategyData(srsd);   
    12.     }   
    13. }  



    4. 水平分區(qū)下的查詢

       對于簡單查詢 HibernateShard 可以滿足。

       水平分區(qū)下多庫查詢是一個挑戰(zhàn)。主要存在于以下三種操作:
       1) distinct
             因為需要遍歷所有shard分區(qū),并進行合并判斷重復(fù)記錄。
       2) order by
             類似 1)
       3) aggregation
             count,sim,avg等聚合操作先分散到分區(qū)執(zhí)行,再進行匯總。
             是不是有點類似于 MapReduce ? 呵呵。
      
       目前 HibernateShard 不支持 1), 2), 對 3) 部分支持

        HibernateShard 目前通過 Criteria 接口的實現(xiàn)對 聚合提供了較好的支持, 因為 Criteria 以API接口指定了 Projection 操作,邏輯相對簡單。

        而HQL,原生 SQL 還不支持此類操作。

        
    5. 再分區(qū)和虛擬分區(qū)
          當(dāng)數(shù)據(jù)庫規(guī)模增大,需要調(diào)整分區(qū)邏輯和數(shù)據(jù)存儲時, 需要再分區(qū)。
          兩種方式: 1)數(shù)據(jù)庫數(shù)據(jù)遷移其他分區(qū); 2) 改變記錄和分區(qū)映射關(guān)系。這兩種方式都比較麻煩。尤其“改變記錄和分區(qū)映射關(guān)系”,需要調(diào)整 ShardResolutionStrategy。

         HibernateShard 提供了一種虛擬分區(qū)層。當(dāng)需要調(diào)整分區(qū)策略時,只需要調(diào)整虛擬分區(qū)和物理分區(qū)映射關(guān)系即可。以下是使用虛擬分區(qū)時的配置創(chuàng)建過程:

    Java代碼 復(fù)制代碼
    1.     
    2.   Map<Integer, Integer> virtualShardMap = new HashMap<Integer, Integer>();   
    3. virtualShardMap.put(00);   
    4. virtualShardMap.put(10);   
    5. virtualShardMap.put(21);   
    6. virtualShardMap.put(31);   
    7. ShardedConfiguration shardedConfig =   
    8.     new ShardedConfiguration(   
    9.         prototypeConfiguration,   
    10.         configurations,   
    11.         strategyFactory,   
    12.         virtualShardMap);   
    13. return shardedConfig.buildShardedSessionFactory();  


    6.  局限:
        1)HibernateShard 不支持垂直分區(qū), 垂直+水平混合分區(qū)。

        2) 水平分區(qū)下 查詢功能受到一定限制,有些功能不支持。實踐中,需要在應(yīng)用層面對水平分區(qū)算法進行更多的考慮。
        3) 不支持跨分區(qū)的 關(guān)系 操作。例如:刪除A分區(qū)上的 s 表,B分區(qū)上的關(guān)聯(lián)子表 t的記錄無法進行參照完整性約束檢查。 (其實這個相對 跨分區(qū)查詢的挑戰(zhàn)應(yīng)該說小的多,也許google工程師下個版本會支持,呵呵)

        4) 解析策略接口似乎和對象ID全局唯一性有些自相矛盾,
    AllShardsShardResolutionStrategy 的接口返回的是給定對象ID所在的 shard ID集合,按理應(yīng)該是明確的一個 shard ID.

    參考資料:HibernateShard 參考指南。

    posted on 2009-04-01 18:49 閱讀(2463) 評論(0)  編輯  收藏

    <2009年4月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(3)

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日本妇人成熟免费中文字幕| 久久精品国产精品亚洲色婷婷| 国产成人无码免费视频97 | 亚洲fuli在线观看| 免费中文字幕视频| 国产免费啪嗒啪嗒视频看看| 国产av无码专区亚洲av毛片搜| 国产性生交xxxxx免费| 免费国产黄网站在线观看动图| 免费一级毛片不卡不收费| 亚洲精品视频在线观看免费| 蜜臀AV免费一区二区三区| 亚洲中文字幕久在线| 青草草在线视频永久免费| 亚洲最大免费视频网| 成人免费激情视频| 亚洲AV永久无码精品成人| 久久综合国产乱子伦精品免费 | 中国亚洲呦女专区| 一级成人a毛片免费播放| 久久影院亚洲一区| 久久国产精品免费专区| 亚洲专区一路线二| 免费日本黄色网址| 色www永久免费网站| 亚洲国产模特在线播放| 91大神免费观看| 久久精品国产亚洲网站| 亚洲一区在线免费观看| 含羞草国产亚洲精品岁国产精品 | 亚洲VA综合VA国产产VA中| 两个人看的www免费高清| 中文字幕亚洲一区二区三区| 无码精品人妻一区二区三区免费看| 亚洲国产人成在线观看| 亚洲国产成人VA在线观看| 久久成人免费大片| 久久久久亚洲精品无码网址色欲| 亚洲日韩乱码中文无码蜜桃臀网站| a级毛片免费高清视频| www.亚洲精品|