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

目前創(chuàng)新互聯(lián)已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機、網(wǎng)站托管運營、企業(yè)網(wǎng)站設(shè)計、山城網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
1. Hibernate Shard簡介
Hibernate Shard多數(shù)據(jù)庫水平分區(qū)解決方案。Hibernate 的一個擴展,用于處理多數(shù)據(jù)庫水平分區(qū)架構(gòu)。由google工程師 2007年 捐獻給 Hibernate社區(qū)。
目前版本: 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)常采用。目的出于海量數(shù)據(jù)分散存儲,分散操作,分散查詢以便提高數(shù)據(jù)處理量和整體數(shù)據(jù)處理性能。使用:google工程師的設(shè)計還是非常好的,完全兼容 Hibernate本身的主要接口。
Java代碼
- org.hibernate.Session
- org.hibernate.SessionFactory
- org.hibernate.Criteria
- org.hibernate.Query
因此程序員開發(fā)變化不大,甚至不需要關(guān)心后臺使用了分區(qū)數(shù)據(jù)庫。程序遷移問題不大。而且配置上比較簡明。
3. Hibernate Shard三種策略:
◆ShardAccessStrategy, 查詢操作時,到那個分區(qū)執(zhí)行。
默認(rèn)提供兩個實現(xiàn):順序策略:SequentialShardAccessStrategy, 每個query按順序在所有分區(qū)上執(zhí)行。
平行策略:ParallelShardAccessStrategy, 每個query以多線程方式并發(fā)平行的在所有分區(qū)上執(zhí)行。此策略下,需要使用線程池機制滿足特定的性能需要,java.util.concurrent.ThreadPoolExecutor.
◆ShardSelectionStrategy, 新增對象時,存儲到哪個分區(qū)。
框架默認(rèn)提供了一個輪詢選擇策略 RoundRobinShardSelectionStrategy, 但一般不這樣使用。
通常采用“attribute-based sharding”機制,基于屬性分區(qū)。一般是用戶根據(jù)表自己實現(xiàn)一個基于屬性分區(qū)的策略類ShardSelectionStrategy ,例如,以下WeatherReport基于continent屬性選擇分區(qū):
Java代碼
- public class WeatherReportShardSelectionStrategy implements ShardSelectionStrategy {
- public ShardId selectShardIdForNewObject(Object obj) {
- if(obj instanceof WeatherReport) {
- return ((WeatherReport)obj).getContinent().getShardId();
- }
- throw new IllegalArgumentException();
- }
◆ShardResolutionStrategy, 該策略用于查找單個對象時,判斷它在哪個或哪幾個分區(qū)上。
默認(rèn)使用 AllShardsShardResolutionStrategy ,可以自定義例如:
Java代碼
- public class WeatherReportShardResolutionStrategy
extends AllShardsShardResolutionStrategy {- public WeatherReportShardResolutionStrategy(List
shardIds) { - super(shardIds);
- }
- public List
selectShardIdsFromShardResolutionStrategyData( - ShardResolutionStrategyData srsd) {
- if(srsd.getEntityName().equals(WeatherReport.class.getName())) {
- return Continent.getContinentByReportId(srsd.getId()).getShardId();
- }
- return super.selectShardIdsFromShardResolutionStrategyData(srsd);
- }
- }
分享名稱:HibernateShard三種策略剖析
本文鏈接:http://m.fisionsoft.com.cn/article/ccehgph.html


咨詢
建站咨詢
