鏁版嵁搴撳垏鍒?/em> 鏄竴涓浐鏈夌殑鍏崇郴嫻佺▼錛屽彲浠ラ氳繃涓浜涢昏緫鏁版嵁鍧楀皢涓涓〃鐨勮鍒嗕負涓嶅悓鐨勫皬緇勩備緥濡傦紝濡傛灉鎮ㄦ鍦ㄦ牴鎹椂闂存埑瀵逛竴涓悕涓?foo 鐨勮秴澶у瀷琛ㄨ繘琛屽垎鍖猴紝2010 騫?8 鏈堜箣鍓嶇殑鎵鏈夋暟鎹兘灝嗚繘鍏ュ垎鍖?A錛岃屼箣鍚庣殑鏁版嵁鍒欏叏閮ㄨ繘鍏ュ垎鍖?B銆傚垎鍖哄彲浠ュ姞蹇鍐欓熷害錛屽洜涓哄畠浠殑鐩爣鏄崟鐙垎鍖轟腑鐨勮緝灝忓瀷鏁版嵁闆嗐?/p> 鍒嗗尯鍔熻兘騫朵笉鎬繪槸鍙敤鐨勶紙MySQL 鐩村埌 5.1 鐗堟湰鍚庢墠鏀寔錛夛紝鑰屼笖鍏墮渶瑕佺殑鍟嗕笟緋葷粺鐨勬垚鏈篃璁╀漢鏈涜屽嵈姝ャ傛洿閲嶈鐨勬槸錛屽ぇ閮ㄥ垎鍒嗗尯瀹炵幇鍦ㄥ悓涓涓墿鐞嗘満涓婂瓨鍌ㄦ暟鎹紝鎵浠ュ彈鍒扮‖浠跺熀紜鐨勫獎鍝嶃傞櫎姝や箣澶栵紝 鍒嗗尯涔熶笉鑳介壌鍒‖浠剁殑鍙潬鎬ф垨鑰呰緙轟箯鍙潬鎬с傚洜姝わ紝寰堝鏅烘収鐨勪漢浠紑濮嬪鎵捐繘琛屼幾緙╃殑鏂版柟娉曘?/p>
鍒囧垎 瀹炶川涓婃槸鏁版嵁搴撶駭鍒殑鍒嗗尯錛氬畠涓嶆槸閫氳繃鏁版嵁鍧楀垎鍓叉暟鎹〃鐨勮錛岃屾槸閫氳繃涓浜涢昏緫鏁版嵁鍏冪礌瀵規暟鎹簱鏈韓榪涜鍒嗗壊錛堥氬父璺ㄤ笉鍚岀殑璁$畻鏈猴級銆備篃灝辨槸璇達紝鍒囧垎涓嶆槸灝?em>鏁版嵁琛?/em> 鍒嗗壊鎴愬皬鍧楋紝鑰屾槸灝嗘暣涓?em>鏁版嵁搴?/em> 鍒嗗壊鎴愬皬鍧椼?/p>
鍒囧垎鐨勪竴涓吀鍨嬬ず渚嬫槸鍩轟簬鏍規嵁鍖哄煙瀵逛竴涓瓨鍌ㄤ笘鐣岃寖鍥村鎴鋒暟鎹殑澶у瀷鏁版嵁搴撹繘琛屽垎鍓詫細鍒囧垎 A 鐢ㄤ簬瀛樺偍緹庡浗鐨勫鎴蜂俊鎭紝鍒囧垎 B 鐢ㄦ埛瀛樺偍浜氭床鐨勫鎴蜂俊鎭紝鍒囧垎 C 嬈ф床錛岀瓑銆傝繖浜涘垏鍒嗗垎鍒浜庝笉鍚岀殑璁$畻鏈轟笂錛屼笖姣忎釜鍒囧垎灝嗗瓨鍌ㄦ墍鏈夌浉鍏蟲暟鎹紝濡傚鎴峰枩濂芥垨璁㈣喘鍘嗗彶銆?/p>
鍒囧垎鐨勫ソ澶勶紙濡傚垎鍖轟竴鏍鳳級鍦ㄤ簬瀹冨彲浠ュ帇緙╁ぇ鍨嬫暟鎹細鍗曠嫭鐨勬暟鎹〃鍦ㄦ瘡涓垏鍒嗕腑鐩稿杈冨皬錛岃繖鏍峰氨鍙互鏀寔鏇村揩閫熺殑璇誨啓閫熷害錛屼粠鑰屾彁楂樻ц兘銆傚垏鍒? 榪樺彲浠ユ敼鍠勫彲闈犳э紝鍥犱負鍗充究涓涓垏鍒嗘剰澶栧け鏁堬紝鍏朵粬鍒囧垎浠嶇劧鍙互鏈嶅姟鏁版嵁銆傝屼笖鍥犱負鍒囧垎鏄湪搴旂敤紼嬪簭灞傞潰榪涜鐨勶紝鎮ㄥ彲浠ュ涓嶆敮鎸佸父瑙勫垎鍖虹殑鏁版嵁搴撹繘琛屽垏鍒? 澶勭悊銆傝祫閲戞垚鏈緝浣庡悓鏍蜂篃鏄竴涓綔鍦ㄤ紭鍔褲?/p>
鍒囧垎鍜岀瓥鐣?/a>
鍍忓緢澶氬叾浠栨妧鏈竴鏍鳳紝榪涜鍒囧垎鏃朵篃闇瑕佷綔鍑洪儴鍒嗗Ε鍗忋傚洜涓哄垏鍒嗕笉鏄竴欏規湰鍦版暟鎹簱鎶鏈?— 涔熷氨鏄錛屽繀欏誨湪搴旂敤紼嬪簭涓疄鐜?—鍦ㄥ紑濮嬪垏鍒嗕箣鍓嶉渶瑕佸埗瀹氬嚭鎮ㄧ殑鍒囧垎絳栫暐銆傝繘琛屽垏鍒嗘椂涓婚敭鍜岃法鍒囧垎鏌ヨ閮芥壆婕旈噸瑕佽鑹詫紝涓昏閫氳繃瀹氫箟鎮ㄤ笉鍙互鍋氫粈涔堝疄鐜般?/p>
涓婚敭
鍒囧垎鍒╃敤澶氫釜鏁版嵁搴擄紝鍏朵腑鎵鏈夋暟鎹簱閮界嫭绔嬭搗浣滅敤錛屼笉騫叉秹鍏朵粬鍒囧垎銆傚洜姝わ紝濡傛灉鎮ㄤ緷璧栦簬鏁版嵁搴撳簭鍒楋紙濡傝嚜鍔ㄤ富閿敓鎴愶級錛屽緢鏈夊彲鑳藉湪涓涓暟鎹簱闆嗕腑灝嗗嚭鐜板悓 涓涓富閿傚彲浠ヨ法鍒嗗竷寮忔暟鎹簱鍗忚皟搴忓垪錛屼絾鏄繖鏍蜂細澧炲姞緋葷粺鐨勫鏉傜▼搴︺傞伩鍏嶇浉鍚屼富閿渶瀹夊叏鐨勬柟娉曞氨鏄搴旂敤紼嬪簭錛堝簲鐢ㄧ▼搴忓皢綆$悊鍒囧垎緋葷粺錛夌敓鎴愪富閿?/p>
璺ㄥ垏鍒嗘煡璇?/strong>
澶ч儴鍒嗗垏鍒嗗疄鐜幫紙鍖呮嫭 Hibernate Shards錛変笉鏀寔璺ㄥ垏鍒嗘煡璇紝榪欏氨鎰忓懗鐫錛屽鏋滄偍鎯沖埄鐢ㄤ笉鍚屽垏鍒嗙殑涓や釜鏁版嵁闆嗭紝灝卞繀欏誨鐞嗛澶栫殑闀垮害銆傦紙鏈夎叮鐨勬槸錛孉mazon 鐨? SimpleDB 涔熺姝㈣法鍩熸煡璇級渚嬪錛屽鏋滃皢緹庡浗瀹㈡埛淇℃伅瀛樺偍鍦ㄥ垏鍒?1 涓紝榪橀渶瑕佸皢鎵鏈夌浉鍏蟲暟鎹瓨鍌ㄥ湪姝ゃ傚鏋滄偍灝濊瘯灝嗛偅浜涙暟鎹瓨鍌ㄥ湪鍒囧垎 2 涓紝鎯呭喌灝變細鍙樺緱澶嶆潅錛岀郴緇熸ц兘涔熷彲鑳藉彈褰卞搷銆傝繖縐嶆儏鍐佃繕涓庝箣鍓嶆彁鍒扮殑涓鐐規湁鍏?— 濡傛灉鎮ㄥ洜涓烘煇縐嶅師鍥犻渶瑕佽繘琛岃法鍒囧垎榪炴帴錛屾渶濂介噰鐢ㄤ竴縐嶅彲浠ユ秷闄ら噸澶嶇殑鏂瑰紡綆$悊閿紒
寰堟槑鏄撅紝鍦ㄥ緩绔嬫暟鎹簱鍓嶅繀欏誨叏闈㈣冭檻鍒囧垎絳栫暐銆備竴鏃﹂夋嫨浜嗕竴涓壒瀹氱殑鏂瑰悜涔嬪悗錛屾偍宸笉澶氬氨琚畠緇戝畾浜?— 榪涜鍒囧垎鍚庡緢闅鵑殢渚跨Щ鍔ㄦ暟鎹簡銆?/p>
涓涓瓥鐣ョず渚?/a>
鍥犱負鍒囧垎灝嗘偍緇戝畾鍦ㄤ竴涓嚎鍨嬫暟鎹ā鍨嬩腑錛堜篃灝辨槸璇達紝鎮ㄦ棤娉曡交鏉捐繛鎺ヤ笉鍚屽垏鍒嗕腑鐨勬暟鎹級錛屾偍蹇呴』瀵瑰浣曞湪姣忎釜鍒囧垎涓鏁版嵁榪涜閫昏緫緇勭粐鏈変竴涓竻 鏅扮殑姒傚康銆傝繖鍙互閫氳繃鑱氱劍鍩熶腑鐨勪富瑕佽妭鐐瑰疄鐜般傚鍦ㄤ竴涓數瀛愬晢鍔$郴緇熶腑錛屼富瑕佽妭鐐瑰彲浠ユ槸涓涓鍗曟垨鑰呬竴涓鎴楓傚洜姝わ紝濡傛灉鎮ㄩ夋嫨 “瀹㈡埛” 浣滀負鍒囧垎絳栫暐鐨勮妭鐐癸紝閭d箞涓庡鎴鋒湁鍏崇殑鎵鏈夋暟鎹皢縐誨姩鑷沖悇鑷殑鍒囧垎涓紝浣嗘槸鎮ㄤ粛鐒跺繀欏婚夋嫨灝嗚繖浜涙暟鎹Щ鍔ㄨ嚦鍝釜鍒囧垎銆?/p>
瀵逛簬瀹㈡埛鏉ヨ錛屾偍鍙互鏍規嵁鎵鍦ㄥ湴錛堟媧層佷簹媧層侀潪媧茬瓑錛夊垏鍒嗭紝鎴栬呮偍涔熷彲浠ユ牴鎹叾浠栧厓绱犺繘琛屽垏鍒嗐傝繖鐢辨偍鍐沖畾銆備絾鏄紝鎮ㄧ殑鍒囧垎絳栫暐搴旇鍖呭惈灝? 鏁版嵁鍧囧寑鍒嗗竷鑷蟲墍鏈夊垏鍒嗙殑鏂規硶銆傚垏鍒嗙殑鎬諱綋姒傚康鏄皢澶у瀷鏁版嵁闆嗗垎鍓蹭負灝忓瀷鏁版嵁闆嗭紱鍥犳錛屽鏋滀竴涓壒瀹氱殑鐢靛瓙鍟嗗姟鍩熷寘鍚竴涓ぇ鍨嬬殑嬈ф床瀹㈡埛闆嗕互鍙婁竴涓浉瀵瑰皬 鐨勭編鍥藉鎴烽泦錛岄偅涔堝熀浜庡鎴鋒墍鍦ㄥ湴鐨勫垏鍒嗗彲鑳芥病鏈変粈涔堟剰涔夈?/p>
鍥炲埌姣旇禌 — 浣跨敤鍒囧垎錛?/a>
鐜板湪璁╂垜浠洖鍒版垜緇忓父鎻愬埌鐨勮禌璺戝簲鐢ㄧ▼搴忕ず渚嬩腑錛屾垜鍙互鏍規嵁姣旇禌鎴栧弬璧涜呰繘琛屽垏鍒嗐傚湪鏈ず渚嬩腑錛屾垜灝嗘牴鎹瘮璧涜繘琛屽垏鍒嗭紝鍥犱負鎴戠湅鍒板煙鏄牴鎹弬 鍔犱笉鍚屾瘮璧涚殑鍙傝禌鑰呰繘琛岀粍緇囩殑銆傚洜姝わ紝姣旇禌鏄煙鐨勬牴銆傛垜涔熷皢鏍規嵁姣旇禌璺濈榪涜鍒囧垎錛屽洜涓烘瘮璧涘簲鐢ㄧ▼搴忓寘鍚笉鍚岄暱搴﹀拰涓嶅悓鍙傝禌鑰呯殑澶氶」姣旇禌銆?/p>
璇鋒敞鎰忥細鍦ㄨ繘琛屼笂榪板喅瀹氭椂錛屾垜宸茬粡鎺ュ彈浜嗕竴涓Ε鍗忥細濡傛灉涓涓弬璧涜呭弬鍔犱簡涓嶆涓欏規瘮璧涳紝浠栦滑鍒嗗睘涓嶅悓鐨勫垏鍒嗭紝閭h鎬庝箞鍔?鍛紵Hibernate Shards 錛堝儚澶у鏁板垏鍒嗗疄鐜頒竴鏍鳳級涓嶆敮鎸佽法鍒囧垎榪炴帴銆傛垜蹇呴』蹇嶅彈榪欎簺杞誨井涓嶄究錛屽厑璁稿弬璧涜呰鍖呭惈鍦ㄥ涓垏鍒嗕腑 — 涔熷氨鏄錛屾垜灝嗗湪鍙傝禌鑰呭弬鍔犵殑澶氫釜姣旇禌鍒囧垎涓噸寤鴻鍙傝禌鑰呫?/p>
涓轟簡綆渚胯搗瑙侊紝鎴戝皢鍒涘緩涓や釜鍒囧垎錛氫竴涓敤浜?10 鑻遍噷浠ヤ笅鐨勬瘮璧涳紱鍙︿竴涓敤浜?10 鑻遍噷浠ヤ笂鐨勬瘮璧涖?/p>
瀹炵幇 Hibernate Shards
Hibernate Shards 鍑犱箮鍙互涓庣幇鏈?Hibernate 欏圭洰鏃犵紳緇撳悎浣跨敤銆傚敮涓闂鏄?Hibernate Shards 闇瑕佷竴浜涚壒瀹氫俊鎭拰琛屼負銆傛瘮濡傦紝闇瑕佷竴涓垏鍒嗚闂瓥鐣ャ佷竴涓垏鍒嗛夋嫨絳栫暐鍜屼竴涓垏鍒嗗鐞嗙瓥鐣ャ傝繖浜涙槸鎮ㄥ繀欏誨疄鐜扮殑鎺ュ彛錛岃櫧鐒墮儴鍒嗘儏鍐典笅錛屾偍鍙互浣跨敤榛樿絳? 鐣ャ傛垜浠皢鍦ㄥ悗闈㈢殑閮ㄥ垎閫愪釜浜嗚В鍚勪釜鎺ュ彛銆?/p>
ShardAccessStrategy
鎵ц鏌ヨ鏃訛紝Hibernate Shards 闇瑕佷竴涓喅瀹氶涓垏鍒嗐佺浜屼釜鍒囧垎鍙婂悗緇垏鍒嗙殑鏈哄埗銆侶ibernate Shards 鏃犻渶紜畾鏌ヨ浠涔堬紙榪欐槸 Hibernate Core 鍜屽熀紜鏁版嵁搴撻渶瑕佸仛鐨勶級錛屼絾鏄畠紜疄鎰忚瘑鍒幫紝鍦ㄨ幏寰楃瓟妗堜箣鍓嶅彲鑳介渶瑕佸澶氫釜鍒囧垎榪涜鏌ヨ銆傚洜姝わ紝Hibernate Shards 鎻愪緵浜嗕袱縐嶆瀬鍏峰垱鎰忕殑閫昏緫瀹炵幇鏂規硶錛氫竴縐嶆柟娉曟槸鏍規嵁搴忓垪鏈哄埗錛堜竴嬈′竴涓級瀵瑰垏鍒嗚繘琛屾煡璇紝鐩村埌鑾峰緱絳旀涓烘錛涘彟涓縐嶆柟娉曟槸騫惰璁塊棶絳栫暐錛岃繖縐嶆柟娉曚嬌鐢ㄤ竴涓? 綰跨▼妯″瀷涓嬈″鎵鏈夊垏鍒嗚繘琛屾煡璇€?/p>
涓轟簡浣塊棶棰樼畝鍗曪紝鎴戝皢浣跨敤搴忓垪絳栫暐錛屽悕縐頒負 SequentialShardAccessStrategy
銆傛垜浠皢紼嶅悗瀵瑰叾榪涜閰嶇疆銆?/p>
ShardSelectionStrategy
褰撳垱寤轟竴涓柊瀵硅薄鏃訛紙渚嬪錛屽綋閫氳繃 Hibernate 鍒涘緩涓涓柊 Race
鎴?Runner
鏃訛級錛孒ibernate Shards 闇瑕佺煡閬撻渶灝嗗搴旂殑鏁版嵁鍐欏叆鑷沖摢浜涘垏鍒嗐傚洜姝わ紝鎮ㄥ繀欏誨疄鐜拌鎺ュ彛騫跺鍒囧垎閫昏緫榪涜緙栫爜銆傚鏋滄偍鎯寵繘琛岄粯璁ゅ疄鐜幫紝鏈変竴涓悕涓?RoundRobinShardSelectionStrategy
鐨勭瓥鐣ワ紝瀹冧嬌鐢ㄤ竴涓驚鐜瓥鐣ュ皢鏁版嵁杈撳叆鍒囧垎涓?/p>
瀵逛簬璧涜窇搴旂敤紼嬪簭錛屾垜闇瑕佹彁渚涙牴鎹瘮璧涜窛紱昏繘琛屽垏鍒嗙殑琛屼負銆傚洜姝わ紝鎴戜滑闇瑕佸疄鐜?ShardSelectionStrategy
鎺ュ彛騫舵彁渚涗緷鎹?Race
瀵硅薄鐨?distance
閲囩敤 selectShardIdForNewObject
鏂規硶榪涜鍒囧垎鐨勭畝鏄撻昏緫銆傦紙鎴戝皢紼嶅欏湪 Race
瀵硅薄涓睍紺恒傦級
榪愯鏃訛紝褰撳湪鎴戠殑鍩熷璞′笂璋冪敤鏌愪竴綾諱技 save
鐨勬柟娉曟椂錛岃鎺ュ彛鐨勮涓哄皢琚繁灞傜敤浜?Hibernate 鐨勬牳蹇冦?/p>
娓呭崟 1. 涓涓畝鍗曠殑鍒囧垎閫夋嫨絳栫暐
import org.hibernate.shards.ShardId; import org.hibernate.shards.strategy.selection.ShardSelectionStrategy;
public class RacerShardSelectionStrategy implements ShardSelectionStrategy {
public ShardId selectShardIdForNewObject(Object obj) { if (obj instanceof Race) { Race rce = (Race) obj; return this.determineShardId(rce.getDistance()); } else if (obj instanceof Runner) { Runner runnr = (Runner) obj; if (runnr.getRaces().isEmpty()) { throw new IllegalArgumentException("runners must have at least one race"); } else { double dist = 0.0; for (Race rce : runnr.getRaces()) { dist = rce.getDistance(); break; } return this.determineShardId(dist); } } else { throw new IllegalArgumentException("a non-shardable object is being created"); } }
private ShardId determineShardId(double distance){ if (distance > 10.0) { return new ShardId(1); } else { return new ShardId(0); } } }
|
濡傛偍鍦?娓呭崟 1 涓墍鐪嬪埌鐨勶紝濡傛灉鎸佷箙鍖栧璞℃槸涓鍦?Race
錛岄偅涔堝叾璺濈琚‘瀹氾紝鑰屼笖錛堝洜姝わ級閫夋嫨浜嗕竴涓垏鍒嗐傚湪榪欑鎯呭喌涓嬶紝鏈変袱涓垏鍒嗭細0 鍜?1錛屽叾涓垏鍒?1 涓寘鍚?10 鑻遍噷浠ヤ笂鐨勬瘮璧涳紝鍒囧垎 0 涓寘鍚墍鏈夊叾浠栨瘮璧涖?/p>
濡傛灉鎸佷箙鍖栦竴涓?Runner
鎴栧叾浠栧璞★紝鎯呭喌浼氱◢寰鏉備竴浜涖傛垜宸茬粡緙栫爜浜嗕竴涓昏緫瑙勫垯錛屽叾涓湁涓変釜鍘熷垯錛?/p>
- 涓鍚?
Runner
鍦ㄦ病鏈夊搴旂殑 Race
鏃舵棤娉曞瓨鍦ㄣ? - 濡傛灉
Runner
琚垱寤烘椂鍙傚姞浜嗗鍦?Race
s錛岃繖鍚?Runner
灝嗚鎸佷箙鍖栧埌瀵繪壘鍒扮殑棣栧満 Race
鎵灞炵殑鍒囧垎涓傦紙欏轟究璇翠竴鍙ワ紝璇ュ師鍒欏鏈潵鏈夎礋闈㈠獎鍝嶃傦級 - 濡傛灉榪樹繚瀛樹簡鍏朵粬鍩熷璞★紝鐜板湪灝嗗紩鍙戜竴涓紓甯搞?
鐒跺悗錛屾偍灝卞彲浠ユ摝鎺夐澶寸殑鐑睏浜嗭紝鍥犱負澶ч儴鍒嗚壈闅劇殑宸ヤ綔宸茬粡鎼炲畾浜嗐傞殢鐫姣旇禌搴旂敤紼嬪簭鐨勫闀匡紝鎴戞墍浣跨敤鐨勯昏緫鍙兘浼氭樉寰椾笉澶熺伒媧伙紝浣嗘槸瀹冨畬鍏ㄥ彲浠ラ『鍒╁湴瀹屾垚榪欐婕旂ず錛?/p>
ShardResolutionStrategy
褰撻氳繃閿悳绱竴涓璞℃椂錛孒ibernate Shards 闇瑕佷竴縐嶅彲浠ュ喅瀹氶涓垏鍒嗙殑鏂規硶銆傚皢闇瑕佷嬌鐢?SharedResolutionStrategy
鎺ュ彛瀵瑰叾榪涜鎸囧紩銆?/p>
濡傛垜涔嬪墠鎻愬埌鐨勯偅鏍鳳紝鍒囧垎榪嬌鎮ㄩ噸瑙嗕富閿紝鍥犱負鎮ㄥ皢闇瑕佷翰鑷鐞嗚繖浜涗富閿傚垢榪愮殑鏄紝Hibernate 鍦ㄦ彁渚涢敭鎴?UUID 鐢熸垚鏂歸潰琛ㄧ幇鑹ソ銆傚洜姝?Hibernate Shards 鍒涢犳у湴鎻愪緵涓涓?ID 鐢熸垚鍣紝鍚嶄負 ShardedUUIDGenerator
錛屽畠鍙互鐏墊椿鍦板皢鍒囧垎 ID 淇℃伅宓屽叆鍒?UUID 涓?/p>
濡傛灉鎮ㄦ渶鍚庝嬌鐢?ShardedUUIDGenerator
榪涜閿敓鎴愶紙鎴戝湪鏈枃涓篃灝嗛噰鍙栬繖縐嶆柟娉曪級錛岄偅涔堟偍涔熷彲浠ヤ嬌鐢?Hibernate Shards 鎻愪緵鐨勫垱鏂?ShardResolutionStrategy
瀹炵幇錛屽悕涓?AllShardsShardResolutionStrategy
錛岃繖鍙互鍐沖畾渚濇嵁涓涓壒瀹氬璞$殑 ID 鎼滅儲浠涔堝垏鍒嗐?/p>
閰嶇疆濂?Hibernate Shards 宸ヤ綔鎵闇鐨勪笁涓帴鍙e悗錛屾垜浠氨鍙互瀵瑰垏鍒嗙ず渚嬪簲鐢ㄧ▼搴忕殑絎簩姝ヨ繘琛屽疄鐜頒簡銆傜幇鍦ㄥ簲璇ュ惎鍔?Hibernate 鐨?SessionFactory
浜嗐?/p>
閰嶇疆 Hibernate Shards
Hibernate 鐨勫叾涓竴涓牳蹇冩帴鍙e璞℃槸瀹冪殑 SessionFactory
銆侶ibernate 鐨勬墍鏈夌濂囬兘鏄湪鍏墮厤緗?Hibernate 搴旂敤紼嬪簭榪囩▼涓氳繃榪欎釜灝忓璞″疄鐜扮殑錛屼緥濡傦紝閫氳繃鍔犺澆鏄犲皠鏂囦歡鍜岄厤緗傚鏋滄偍浣跨敤浜嗘敞閲婃垨 Hibernate 鐝嶈吹鐨?.hbm 鏂囦歡錛岄偅涔堟偍榪橀渶瑕佷竴涓?SessionFactory
鏉ヨ Hibernate 鐭ラ亾鍝簺瀵硅薄鏄彲浠ユ寔涔呭寲鐨勶紝浠ュ強灝嗗畠浠寔涔呭寲鍒?鍝噷銆?/p>
鍥犳錛屼嬌鐢?Hibernate Shards 鏃訛紝鎮ㄥ繀欏諱嬌鐢ㄤ竴涓寮虹殑 SessionFactory
綾誨瀷鏉ラ厤緗涓暟鎹簱銆傚畠鍙互琚懡鍚嶄負 ShardedSessionFactory
錛岃屼笖瀹冨綋鐒舵槸 SessionFactory
綾誨瀷鐨勩傚綋鍒涘緩涓涓?ShardedSessionFactory
鏃訛紝鎮ㄥ繀欏繪彁渚涗箣鍓嶉厤緗ソ鐨勪笁涓垏鍒嗗疄鐜扮被鍨嬶紙ShardAccessStrategy
銆?code>ShardSelectionStrategy 鍜?ShardResolutionStrategy
錛夈傛偍榪橀渶鎻愪緵 POJO 鎵闇鐨勬墍鏈夋槧灝勬枃浠躲傦紙濡傛灉鎮ㄤ嬌鐢ㄤ竴涓熀浜庡娉ㄧ殑 Hibernate POJO 閰嶇疆錛屾儏鍐靛彲鑳戒細鏈夋墍涓嶅悓銆傦級鏈鍚庯紝涓涓?ShardedSessionFactory
紺轟緥闇瑕佹瘡涓垏鍒嗛兘瀵瑰簲澶氫釜 Hibernate 閰嶇疆鏂囦歡銆?/p>
鍒涘緩涓涓?Hibernate 閰嶇疆
鎴戝凡緇忓垱寤轟簡涓涓?ShardedSessionFactoryBuilder
綾誨瀷錛屽畠鏈変竴涓富瑕佹柟娉?createSessionFactory
錛屽彲浠ュ垱寤轟竴涓厤緗悎鐞嗙殑 SessionFactory
銆備箣鍚庯紝鎴戝皢灝嗘墍鏈夌殑涓鍒囬兘涓?Spring 榪炴帴鍦ㄤ竴璧鳳紙鐜板湪璋佷笉浣跨敤涓涓?IOC 瀹瑰櫒錛燂級銆傜幇鍦紝娓呭崟 2 鏄劇ず浜?ShardedSessionFactoryBuilder
鐨勪富瑕佷綔鐢細鍒涘緩涓涓?Hibernate 閰嶇疆
錛?/p>
娓呭崟 2. 鍒涘緩涓涓?Hibernate 閰嶇疆
private Configuration getPrototypeConfig(String hibernateFile, List<String> resourceFiles) { Configuration config = new Configuration().configure(hibernateFile); for (String res : resourceFiles) { configs.addResource(res); } return config; }
|
濡傛偍鍦?娓呭崟 2 涓墍鐪嬪埌鐨勶紝鍙互浠?Hibernate 閰嶇疆鏂囦歡涓垱寤轟簡涓涓畝鍗曠殑 Configuration
銆? 璇ユ枃浠跺寘鍚涓嬩俊鎭紝濡備嬌鐢ㄧ殑鏄粈涔堢被鍨嬬殑鏁版嵁搴撱佺敤鎴峰悕鍜屽瘑鐮佺瓑錛屼互鍙婃墍鏈夊繀欏葷殑璧勬簮鏂囦歡錛屽 POJO 鎵鐢ㄧ殑 .hbm 鏂囦歡銆傚湪榪涜鍒囧垎鐨勬儏鍐典笅錛屾偍閫氬父闇瑕佷嬌鐢ㄥ涓暟鎹簱閰嶇疆錛屼絾鏄?Hibernate Shards 鏀寔鎮ㄤ粎浣跨敤涓涓? hibernate.cfg.xml 鏂囦歡錛屼粠鑰岀畝鍖栦簡鏁翠釜榪囩▼錛堜絾鏄紝濡傛偍鍦?娓呭崟 4 涓墍鐪嬪埌鐨勶紝鎮ㄥ皢闇瑕佸浣跨敤鐨勬瘡涓涓垏鍒嗗噯澶囦竴涓?hibernate.cfg.xml 鏂囦歡錛夈?/p>
涓嬩竴姝ワ紝鍦ㄦ竻鍗?3 涓紝鎴戝皢鎵鏈夌殑鍒囧垎閰嶇疆閮芥敹闆嗗埌浜嗕竴涓?List
涓細
娓呭崟 3. 鍒囧垎閰嶇疆鍒楄〃
List<ShardConfiguration> shardConfigs = new ArrayList<ShardConfiguration>(); for (String hibconfig : this.hibernateConfigurations) { shardConfigs.add(buildShardConfig(hibconfig)); }
|
Spring 閰嶇疆
鍦?娓呭崟 3 涓紝瀵?hibernateConfigurations
鐨勫紩鐢ㄦ寚鍚戜簡 String
s List
錛屽叾涓瘡涓?String 閮藉寘鍚簡 Hibernate 閰嶇疆鏂囦歡鐨勫悕瀛椼傝 List
閫氳繃 Spring 鑷姩榪炴帴銆傛竻鍗?4 鏄垜鐨?Spring 閰嶇疆鏂囦歡涓殑涓孌墊憳褰曪細
娓呭崟 4. Spring 閰嶇疆鏂囦歡涓殑涓閮ㄥ垎
<bean id="shardedSessionFactoryBuilder" class="org.disco.racer.shardsupport.ShardedSessionFactoryBuilder"> <property name="resourceConfigurations"> <list> <value>racer.hbm.xml</value> </list> </property> <property name="hibernateConfigurations"> <list> <value>shard0.hibernate.cfg.xml</value> <value>shard1.hibernate.cfg.xml</value> </list> </property> </bean>
|
濡傛偍鍦?娓呭崟 4 涓墍鐪嬪埌鐨勶紝ShardedSessionFactoryBuilder
姝e湪涓庝竴涓?POJO 鏄犲皠鏂囦歡鍜屼袱涓垏鍒嗛厤緗枃浠惰繛鎺ャ傛竻鍗?5 涓槸 POJO 鏂囦歡鐨勪竴孌墊憳褰曪細
娓呭崟 5. 姣旇禌 POJO 鏄犲皠
<class name="org.disco.racer.domain.Race" table="race"dynamic-update="true" dynamic-insert="true">
<id name="id" column="RACE_ID" unsaved-value="-1"> <generator class="org.hibernate.shards.id.ShardedUUIDGenerator"/> </id>
<set name="participants" cascade="save-update" inverse="false" table="race_participants" lazy="false"> <key column="race_id"/> <many-to-many column="runner_id" class="org.disco.racer.domain.Runner"/> </set>
<set name="results" inverse="true" table="race_results" lazy="false"> <key column="race_id"/> <one-to-many class="org.disco.racer.domain.Result"/> </set>
<property name="name" column="NAME" type="string"/> <property name="distance" column="DISTANCE" type="double"/> <property name="date" column="DATE" type="date"/> <property name="description" column="DESCRIPTION" type="string"/> </class>
|
璇鋒敞鎰忥紝娓呭崟 5 涓殑 POJO 鏄犲皠鐨勫敮涓鐙壒鏂歸潰鏄?ID 鐨勭敓鎴愬櫒綾?— 榪欏氨鏄?ShardedUUIDGenerator
錛屽畠錛堝鎮ㄦ兂璞$殑涓鏍鳳級灝嗗垏鍒?ID 淇℃伅宓屽叆鍒?UUID 涓傝繖灝辨槸鎴戠殑 POJO 鏄犲皠涓垏鍒嗙殑鍞竴鐙壒鏂歸潰銆?/p>
鍒囧垎閰嶇疆鏂囦歡
涓嬩竴姝ワ紝濡傛竻鍗?6 涓墍紺猴紝鎴戝凡緇忛厤緗簡涓涓垏鍒?— 鍦ㄦ湰紺轟緥涓紝闄ゅ垏鍒?ID 鍜岃繛鎺ヤ俊鎭錛屽垏鍒?0 鍜屽垏鍒?1 鐨勬枃浠舵槸涓鏍風殑銆?/p>
娓呭崟 6. Hibernate Shards 閰嶇疆鏂囦歡
<?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 name="HibernateSessionFactory0"> <property name="dialect">org.hibernate.dialect.HSQLDialect</property> <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="connection.url"> jdbc:hsqldb:file:/.../db01/db01 </property> <property name="connection.username">SA</property> <property name="connection.password"></property> <property name="hibernate.connection.shard_id">0</property> <property name="hibernate.shard.enable_cross_shard_relationship_checks">true </property> </session-factory> </hibernate-configuration>
|
濡傚叾鍚嶅瓧鎵紺猴紝enable_cross_shard_relationship_checks
灞炴у璺ㄥ垏鍒嗗叧緋昏繘琛屼簡媯鏌ャ傛牴鎹?Hibernate Shards 鏂囨。璁板綍錛岃灞炴ч潪甯歌楁椂錛屽湪鐢熸垚鐜涓簲璇ュ叧闂?/p>
鏈鍚庯紝ShardedSessionFactoryBuilder
閫氳繃鍒涘緩 ShardStrategyFactory
錛岀劧鍚庢坊鍔犱笁涓被鍨嬶紙鍖呮嫭 娓呭崟 1 涓殑 RacerShardSelectionStrategy
錛夛紝灝嗕竴鍒囬兘鏁村悎鍒頒簡涓璧鳳紝濡傛竻鍗?7 涓墍紺猴細
娓呭崟 7. 鍒涘緩 ShardStrategyFactory
private ShardStrategyFactory buildShardStrategyFactory() { ShardStrategyFactory shardStrategyFactory = new ShardStrategyFactory() { public ShardStrategy newShardStrategy(List<ShardId> shardIds) { ShardSelectionStrategy pss = new RacerShardSelectionStrategy(); ShardResolutionStrategy prs = new AllShardsShardResolutionStrategy(shardIds); ShardAccessStrategy pas = new SequentialShardAccessStrategy(); return new ShardStrategyImpl(pss, prs, pas); } }; return shardStrategyFactory; }
|
鏈鍚庯紝鎴戞墽琛屼簡閭d釜鍚嶄負 createSessionFactory
鐨勭粷濡欐柟娉曪紝鍦ㄦ湰紺轟緥涓垱寤轟簡涓涓?ShardedSessionFactory
錛屽娓呭崟 8 鎵紺猴細
娓呭崟 8. 鍒涘緩 ShardedSessionFactory
public SessionFactory createSessionFactory() { Configuration prototypeConfig = this.getPrototypeConfig (this.hibernateConfigurations.get(0), this.resourceConfigurations);
List<ShardConfiguration> shardConfigs = new ArrayList<ShardConfiguration>(); for (String hibconfig : this.hibernateConfigurations) { shardConfigs.add(buildShardConfig(hibconfig)); }
ShardStrategyFactory shardStrategyFactory = buildShardStrategyFactory(); ShardedConfiguration shardedConfig = new ShardedConfiguration( prototypeConfig, shardConfigs,shardStrategyFactory); return shardedConfig.buildShardedSessionFactory(); }
|
浣跨敤 Spring 榪炴帴鍩熷璞?/a>
鐜板湪鍙互娣卞懠鍚鎬竴涓嬩簡錛屽洜涓烘垜浠┈涓婂氨鎴愬姛浜嗐傚埌鐩墠涓烘錛屾垜宸茬粡鍒涘緩涓涓彲浠ュ悎鐞嗛厤緗?ShardedSessionFactory
鐨勭敓鎴愬櫒綾伙紝鍏跺疄灝辨槸瀹炵幇 Hibernate 鏃犲涓嶅湪鐨?SessionFactory
綾誨瀷銆?code>ShardedSessionFactory 瀹屾垚浜嗗垏鍒嗕腑鎵鏈夌殑紲炲銆傚畠鍒╃敤鎴戝湪 娓呭崟 1 涓墍閮ㄧ講鐨勫垏鍒嗛夋嫨絳栫暐錛屽茍浠庢垜閰嶇疆鐨勪袱涓垏鍒嗕腑璇誨啓鏁版嵁銆傦紙娓呭崟 6 鏄劇ず浜嗗垏鍒?0 鍜屽垏鍒?1 鐨勯厤緗嚑涔庣浉鍚屻傦級
鐜板湪鎴戦渶瑕佸仛鐨勫氨鏄繛鎺ユ垜鐨勫煙瀵硅薄錛屽湪鏈ず渚嬩腑錛屽洜涓哄畠浠緷璧栦簬 Hibernate錛岄渶瑕佷竴涓?SessionFactory
綾誨瀷榪涜宸ヤ綔銆傛垜灝嗕粎浣跨敤鎴戠殑 ShardedSessionFactoryBuilder
鎻愪緵涓縐?SessionFactory
綾誨瀷錛屽娓呭崟 9 涓墍紺猴細
娓呭崟 9. 鍦?Spring 涓繛鎺?POJO
<bean id="mySessionFactory" factory-bean="shardedSessionFactoryBuilder" factory-method="createSessionFactory"> </bean>
<bean id="race_dao" class="org.disco.racer.domain.RaceDAOImpl"> <property name="sessionFactory"> <ref bean="mySessionFactory"/> </property> </bean>
|
濡傛偍鍦?娓呭崟 9 涓墍鐪嬪埌鐨勶紝鎴戦鍏堝湪 Spring 涓垱寤轟簡涓涓被浼煎伐鍘傜殑 bean錛涗篃灝辨槸璇達紝鎴戠殑 RaceDAOImpl
綾誨瀷鏈変竴涓悕涓?sessionFactory
鐨勫睘鎬э紝鏄?SessionFactory
綾誨瀷銆備箣鍚庯紝mySessionFactory
寮曠敤閫氳繃鍦?ShardedSessionFactoryBuilder
涓婅皟鐢?createSessionFactory
鏂規硶鍒涘緩浜嗕竴涓?SessionFactory
紺轟緥錛屽 娓呭崟 4 涓墍紺恒?/p>
褰撴垜涓烘垜鐨?Race
瀵硅薄紺轟緥浣跨敤 Spring錛堟垜涓昏灝嗗叾浣滀負涓涓法鍨嬪伐鍘備嬌鐢紝浠ヨ繑鍥為閰嶇疆鐨勫璞★級鏃訛紝涓鍒囦簨鎯呭氨閮芥悶瀹氫簡銆傝櫧鐒舵病鏈夊睍紺猴紝RaceDAOImpl
綾誨瀷鏄竴涓埄鐢?Hibernate 妯℃澘榪涜鏁版嵁瀛樺偍鍜屾绱㈢殑瀵硅薄銆傛垜鐨?Race
綾誨瀷鍖呭惈涓涓?RaceDAOImpl
紺轟緥錛屽畠灝嗘墍鏈変笌鏁版嵁鍟嗗簵鐩稿叧鐨勬椿鍔ㄩ兘鎺ㄨ繜鑷蟲銆傚緢榛樺錛屼笉鏄悧錛?/p>
璇鋒敞鎰忥紝鎴戠殑 DAO 涓?Hibernate Shards 鍦ㄤ唬鐮佹柟闈㈠茍娌℃湁緇戝畾錛岃屾槸閫氳繃閰嶇疆榪涜浜嗙粦瀹氥傞厤緗紙濡?娓呭崟 5 涓殑錛夊皢瀹冧滑緇戝畾鍦ㄤ竴涓壒瀹氬垏鍒?UUID 鐢熸垚鏂規涓紝涔熷氨鏄浜嗘垜鍙互鍦ㄩ渶瑕佸垏鍒嗘椂浠庡凡鏈?Hibernate 瀹炵幇涓噸鏂頒嬌鐢ㄥ煙瀵硅薄銆?/p>
鍒囧垎錛氫嬌鐢?easyb 鐨勬祴璇曢┍鍔?/a>
鎺ヤ笅鏉ワ紝鎴戦渶瑕侀獙璇佹垜鐨勫垏鍒嗗疄鐜板彲浠ュ伐浣溿傛垜鏈変袱涓暟鎹簱騫墮氳繃璺濈榪涜鍒囧垎錛屾墍浠ュ綋鎴戝垱寤轟竴鍦洪┈鎷夋澗鏃訛紙10 鑻遍噷浠ヤ笂鐨勬瘮璧涳級錛岃 Race
紺轟緥搴斿湪鍒囧垎 1 涓壘鍒般備竴涓皬鍨嬬殑姣旇禌錛屽 5 鍏噷鐨勬瘮璧涳紙3.1 鑻遍噷錛夛紝灝嗗湪鍒囧垎 0 涓壘鍒般傚垱寤轟竴鍦?Race
鍚庯紝鎴戝彲浠ユ鏌ュ崟涓暟鎹簱鐨勮褰曘?/p>
鍦ㄦ竻鍗?10 涓紝鎴戝凡緇忓垱寤轟簡涓鍦洪┈鎷夋澗錛岀劧鍚庣戶緇獙璇佽褰曠‘瀹炴槸鍦ㄥ垏鍒?1 涓岄潪鍒囧垎 0 涓備嬌浜嬫儏鏇村姞鏈夎叮錛堝拰綆鍗曪級鐨勬槸錛屾垜浣跨敤浜? easyb錛岃繖鏄竴涓熀浜?Groovy 鐨勮涓洪┍鍔ㄥ紑鍙戞灦鏋勶紝鍒╃敤鑷劧璇█楠岃瘉銆俥asyb 涔熷彲浠ヨ交鏉懼鐞?Java 浠g爜銆傚嵆渚夸笉浜嗚В Groovy 鎴?easyb錛屾偍涔熷彲浠ラ氳繃鏌ョ湅娓呭崟 10 涓殑浠g爜錛岀湅鍒頒竴鍒囧鏈熻繘琛屻傦紙璇鋒敞鎰忥紝鎴戝府鍔╁垱寤轟簡 easyb錛屽茍涓斿湪 developerWorks 涓榪欎釜璇濋鍙戣〃榪囨枃绔犮傦級
娓呭崟 10. 涓涓獙璇佸垏鍒嗘紜х殑 easyb 鏁呬簨涓竴孌墊憳褰?/strong>
scenario "races greater than 10.0 miles should be in shard 1 or db02", { given "a newly created race that is over 10.0 miles", { new Race("Leesburg Marathon", new Date(), 26.2, "Race the beautiful streets of Leesburg!").create() } then "everything should work fine w/respect to Hibernate", { rce = Race.findByName("Leesburg Marathon") rce.distance.shouldBe 26.2 } and "the race should be stored in shard 1 or db02", { sql = Sql.newInstance(db02url, name, psswrd, driver) sql.eachRow("select race_id, distance, name from race where name=?", ["Leesburg Marathon"]) { row -> row.distance.shouldBe 26.2 } sql.close() } and "the race should NOT be stored in shard 0 or db01", { sql = Sql.newInstance(db01url, name, psswrd, driver) sql.eachRow("select race_id, distance, name from race where name=?", ["Leesburg Marathon"]) { row -> fail "shard 0 contains a marathon!" } sql.close() } }
|
褰撶劧錛屾垜鐨勫伐浣滆繕娌℃湁瀹?— 鎴戣繕闇瑕佸垱寤轟竴涓煭紼嬫瘮璧涳紝騫墮獙璇佸叾浣嶄簬鍒囧垎 0 涓岄潪鍒囧垎 1 涓傛偍鍙互鍦ㄦ湰鏂囨彁渚涚殑 浠g爜涓嬭澆 涓湅鍒拌楠岃瘉鎿嶄綔錛?/p>
鍒囧垎鐨勫埄寮?/a>
鍒囧垎鍙互澧炲姞搴旂敤紼嬪簭鐨勮鍐欓熷害錛屽挨鍏舵槸濡傛灉鎮ㄧ殑搴旂敤紼嬪簭鍖呭惈澶ч噺鏁版嵁 — 濡傛暟 TB — 鎴栬呮偍鐨勫煙澶勪簬鏃犻檺鍒跺彂灞曚腑錛屽 Google 鎴?Facebook銆?/p>
鍦ㄨ繘琛屽垏鍒嗕箣鍓嶏紝涓瀹氳紜畾搴旂敤紼嬪簭鐨勮妯″拰澧為暱瀵瑰叾鏈夊埄銆傚垏鍒嗙殑鎴愭湰錛堟垨鑰呰緙虹偣錛夊寘鎷濡備綍瀛樺偍鍜屾绱㈡暟鎹殑鐗瑰畾搴旂敤紼嬪簭閫昏緫榪涜緙栫爜鐨勬垚鏈傝繘琛屽垏鍒嗗悗錛屾偍澶氬灝戝皯閮借閿佸畾鍦ㄦ偍鐨勫垏鍒嗘ā鍨嬩腑錛屽洜涓洪噸鏂板垏鍒嗗茍闈炴槗浜嬨?/p>
濡傛灉鑳藉姝g‘瀹炵幇錛屽垏鍒嗗彲浠ョ敤浜庤В鍐充紶緇?RDBMS 瑙勬ā鍜岄熷害闂銆傚垏鍒嗗浜庣粦瀹氫簬鍏崇郴鍩虹鏋舵瀯銆佹棤娉曠戶緇崌綰х‖浠朵互婊¤凍澶ч噺鍙幾緙╂暟鎹瓨鍌ㄨ姹傜殑緇勭粐鏉ヨ鏄竴涓潪甯告垚鏈珮鏁堢殑鍐崇瓥銆?/p>