paulwong

          HIBERNATE SHARD

          數據上千萬,都擠在一個表里,導致查詢太慢?分庫分表洛!但已經用了HIBERNATE了,不想轉其他框架?用HIBERNATE SHARD!

          在向大家詳細介紹Hibernate Shard三種策略之前,首先讓大家了解下Hibernate Shard簡介,然后全面介紹Hibernate Shard三種策略。

          1. Hibernate Shard簡介
          Hibernate Shard多數據庫水平分區解決方案。Hibernate 的一個擴展,用于處理多數據庫水平分區架構。由google工程師 2007年 捐獻給 Hibernate社區。目前版本: 3.0.0 beta2, 未發GA版。條件:Hibernate Core 3.2, JDK 5.0

          2. 水平分區原理
          一個庫表如 Order 存在于多個數據庫實例上。按特定的分區邏輯,將該庫表的數據存儲在這些實例中,一條記錄的主鍵 PK,在所有實例中不得重復。水平分區在大型網站,大型企業應用中經常采用。目的出于海量數據分散存儲,分散操作,分散查詢以便提高數據處理量和整體數據處理性能。使用:google工程師的設計還是非常好的,完全兼容 Hibernate本身的主要接口。
          org.hibernate.Session  
            org.hibernate.SessionFactory  
            org.hibernate.Criteria  
            org.hibernate.Query 

          因此程序員開發變化不大,甚至不需要關心后臺使用了分區數據庫。程序遷移問題不大。而且配置上比較簡明。

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

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

          ◆ShardResolutionStrategy, 該策略用于查找單個對象時,判斷它在哪個或哪幾個分區上。默認使用 AllShardsShardResolutionStrategy ,可以自定義例如:  

          public class WeatherReportShardResolutionStrategy extends AllShardsShardResolutionStrategy
          {
          public WeatherReportShardResolutionStrategy(List<ShardId> shardIds)
          {
          super(shardIds);
          }


          public List<ShardId> selectShardIdsFromShardResolutionStrategyData( ShardResolutionStrategyData srsd)
          {
          if(srsd.getEntityName().equals(WeatherReport.class.getName()))
          {
          return Continent.getContinentByReportId(srsd.getId()).getShardId();
          }

          return super.selectShardIdsFromShardResolutionStrategyData(srsd);
          }

          }

          posted on 2012-01-04 22:40 paulwong 閱讀(899) 評論(0)  編輯  收藏 所屬分類: HIBERNATE分布式性能優化

          主站蜘蛛池模板: 双柏县| 叙永县| 彭州市| 明水县| 金溪县| 锦州市| 湾仔区| 古浪县| 湘潭市| 扎兰屯市| 东兴市| 阿拉尔市| 墨玉县| 宁德市| 电白县| 会东县| 历史| 瓦房店市| 鄂托克前旗| 道孚县| 大英县| 新兴县| 九江县| 忻州市| 寿光市| 浮山县| 英吉沙县| 乐业县| 荣成市| 泾源县| 陆丰市| 桦甸市| 壤塘县| 岢岚县| 武隆县| 河东区| 克东县| 正安县| 五峰| 前郭尔| 柳河县|