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

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

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

    深藍(lán)色心情

    過(guò)來(lái)聊聊~~~~

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      31 Posts :: 0 Stories :: 46 Comments :: 0 Trackbacks
    最近討論db shard的帖子比較多,感覺(jué)很多都是在參考hibernate shard的思路,但hibernate分表真的那么好嗎?我覺(jué)得它最少有2個(gè)問(wèn)題: 

    1. 改成shard后,代碼的API調(diào)用要變。代碼改動(dòng)很大。 
    2. 設(shè)計(jì)很復(fù)雜,不清晰,邏輯關(guān)系難以理解。 

    hibernate shard基本上就是為了shard而對(duì)hibernate做的增增補(bǔ)補(bǔ),湊合用還行,根本不具備設(shè)計(jì)上的參考價(jià)值。 

    對(duì)數(shù)據(jù)庫(kù)分切方面,到目前為止,我覺(jué)得還是guzz的設(shè)計(jì)最清晰,如果我說(shuō)的不對(duì),歡迎理性討論。不管您是否使用guzz,但是guzz在數(shù)據(jù)庫(kù)分切方面的設(shè)計(jì),對(duì)于清晰的設(shè)計(jì)模式,比hibernate shard更具有借鑒意義。 

    guzz垂直切分 

    垂直切分是指將不同的表分別存儲(chǔ)到不同的數(shù)據(jù)庫(kù)中。guzz默認(rèn)配置級(jí)支持,不需要寫任何代碼,可以在任何時(shí)候,在需要時(shí),將每張表存儲(chǔ)到自己?jiǎn)为?dú)的一組服務(wù)器上,應(yīng)該說(shuō)是垂直分切的極限了。而且設(shè)計(jì)上,無(wú)論什么時(shí)候怎么分切,都不需要你改動(dòng)代碼。開(kāi)發(fā)時(shí)你可以讓所有表在一個(gè)庫(kù)上;部署時(shí),分到多個(gè)庫(kù)上;以后業(yè)務(wù)增加了,再更加分散的放。 

    垂直分切簡(jiǎn)單配置方式: 

    1. 聲明你要用多少臺(tái)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)之間什么關(guān)系。 

    Xml代碼 
    1. <dialect class="org.guzz.dialect.H2Dialect"></dialect>  
    2. <dialect name="mysql5dialect" class="org.guzz.dialect.Mysql5Dialect" />  
    3. <dialect name="oracle10gdialect" class="org.guzz.dialect.Oracle10gDialect" />  
    4.   
    5. <tran>  
    6.         <dbgroup name="default" masterDBConfigName="masterDB" />  
    7.         <dbgroup name="mysql" masterDBConfigName="masterDB" slaveDBConfigName="mysqlSlaveDB" dialectName="mysql5dialect" />  
    8.         <dbgroup name="oracle" masterDBConfigName="oracleDB" dialectName="oracle10gdialect" />  
    9. </tran>   

    這里我們聲明了3組數(shù)據(jù)庫(kù),而且數(shù)據(jù)庫(kù)類型還不一樣。 

    2. 對(duì)每張表,配置應(yīng)該存儲(chǔ)到那個(gè)庫(kù)里 

    Xml代碼 
    1. <a-business dbgroup="default" name="filterWord" class="com.guzzservices.business.FilterWord" />  
    2. <a-business dbgroup="mysql" name="filterWordGroup" class="com.guzzservices.business.FilterWordGroup" />  
    3. <a-business dbgroup="oracle" name="configuration" class="com.guzzservices.business.Configuration" />  

    簡(jiǎn)單的配置,將三個(gè)對(duì)象分別存儲(chǔ)到3臺(tái)不同的數(shù)據(jù)庫(kù)中,完成垂直分切。 

    guzz水平切表 

    水平切表是指將一張大表,分切成許多小表。guzz的設(shè)計(jì)是當(dāng)需要水平分表時(shí),原先代碼不變,為每個(gè)需要分切的表編寫一個(gè)分表策略類,配置到系統(tǒng)中。然后在調(diào)用前,聲明分表策略即可。 
      
      整個(gè)過(guò)程只需要新寫一個(gè)類,在調(diào)用出增加一行代碼即可,對(duì)原始系統(tǒng)入侵非常小,風(fēng)險(xiǎn)可控。 

      流程總比hibernate shard要清晰很多,具體可以看http://code.google.com/p/guzz/wiki/TutorialShadowTable?wl=zh-Hans 


    數(shù)據(jù)庫(kù)主從分離 

    從垂直分切部分可以看到,guzz也是配置性的原生支持讀寫分離。如果需要增加從數(shù)據(jù)庫(kù),可以隨時(shí)加上,不需要改任何代碼。不需要改動(dòng)代碼,而且配置也不復(fù)雜,應(yīng)該算是設(shè)計(jì)上的極限了吧? 

    你只需要在dbgroup中增加一個(gè)屬性“slaveDBConfigName”,然后在一個(gè)properties文件中加上所有你需要的從數(shù)據(jù)庫(kù)連接池配置即可,從數(shù)據(jù)庫(kù)可以有許多臺(tái)。 

    這個(gè)hibernate shard根本就沒(méi)有涉及到。而且guzz允許程序控制讀寫庫(kù)選取,和proxy模式的中間件路由各有優(yōu)勢(shì),畢竟更加容易控制。如果你做過(guò)內(nèi)容提前審核再允許發(fā)布的系統(tǒng),就會(huì)明白proxy中間件解決不了全部問(wèn)題,有些讀操作不允許延遲,只能讀主庫(kù),而是也是讀事務(wù),proxy中間件會(huì)很尷尬。 

    異構(gòu)數(shù)據(jù)庫(kù) 

    這個(gè)hibernate以及ibatis之類的更沒(méi)有了。而且也是對(duì)應(yīng)用透明的,你可以隨時(shí)選擇增加一種數(shù)據(jù)庫(kù),然后把某些表放到上面,如增加一個(gè)H2做應(yīng)用端緩存數(shù)據(jù)庫(kù),自己完成類似Timesten + oracle的架構(gòu)。 

    配置方式在上面的垂直分切小節(jié)也可以看到。 

    數(shù)據(jù)庫(kù)連接池配置 

    隨著表垂直和水平切分的進(jìn)行,數(shù)據(jù)庫(kù)會(huì)越來(lái)越多,數(shù)據(jù)源配置也會(huì)越來(lái)越多。guzz的設(shè)計(jì)是配置分組管理,類似Mysql的配置文件。每個(gè)數(shù)據(jù)源配置都在一個(gè)組內(nèi),無(wú)論增加多少都清晰了然,不會(huì)名字相互沖突。 

    示例: 
    Properties代碼 
    1. [masterDB]  
    2. guzz.identifer=blogMasterDB  
    3. guzz.IP=localhost  
    4. guzz.maxLoad=120  
    5. driverClass=com.mysql.jdbc.Driver  
    6. jdbcUrl=jdbc:mysql://localhost:3306/blog?useUnicode=true&amp;characterEncoding=UTF-8&amp;useServerPrepStmts=true  
    7. user=root  
    8. password=root  
    9. acquireIncrement=10  
    10. idleConnectionTestPeriod=60  
    11.   
    12. [updateMasterDB]  
    13. guzz.identifer=incUpdateDB1  
    14. guzz.IP=localhost  
    15. guzz.maxLoad=20  
    16. driverClass=com.mysql.jdbc.Driver  
    17. jdbcUrl=jdbc:mysql://localhost:3306/guzzSlowUpdate?useUnicode=true&amp;characterEncoding=UTF-8  
    18. user=slowupdate  
    19. password=slowupdate  
    20. acquireIncrement=10  
    21. idleConnectionTestPeriod=60  
    22.   
    23. [logMasterDB]  
    24. ....  

    如果一些數(shù)據(jù)庫(kù)對(duì)某些連接池支持更好,guzz設(shè)計(jì)上還允許為不同的數(shù)據(jù)源指定不同的連接池實(shí)現(xiàn)。 

    如果您需要分表,還是放棄hibernate shard或ibatis的設(shè)計(jì)模式吧,哪些只是臨時(shí)拼湊出來(lái)的東西,設(shè)計(jì)上根本就不怎么樣! 
    posted on 2010-10-18 21:02 深藍(lán)色心情 閱讀(4223) 評(píng)論(5)  編輯  收藏 所屬分類: Java

    Feedback

    # re: 數(shù)據(jù)庫(kù)分切設(shè)計(jì)何必糾結(jié)于hibernate shard模式,應(yīng)該簡(jiǎn)單化了 2010-10-18 22:09 YangL
    hibernate shard大概是零七零八年的代碼了吧,好像已經(jīng)死了。
    而guzz在國(guó)內(nèi)的大型論壇應(yīng)用上還是很不錯(cuò)的,如強(qiáng)國(guó)論壇、央視的投票系統(tǒng)。。。  回復(fù)  更多評(píng)論
      

    # re: 數(shù)據(jù)庫(kù)分切設(shè)計(jì)何必糾結(jié)于hibernate shard模式,應(yīng)該簡(jiǎn)單化了 2010-10-19 11:29 MyYate
    水平劃分時(shí)如何做到排序和分組統(tǒng)計(jì)?這個(gè)在企業(yè)應(yīng)用里使用很多。http://code.google.com/p/guzz/wiki/TutorialShadowTable?wl=zh-Hans
    我看這兒沒(méi)有給出sample,謝謝~  回復(fù)  更多評(píng)論
      

    # re: 數(shù)據(jù)庫(kù)分切設(shè)計(jì)何必糾結(jié)于hibernate shard模式,應(yīng)該簡(jiǎn)單化了 2010-10-19 13:07 darkbluefeeling
    @MyYate

    水平分切后這方面需要手工進(jìn)行多表關(guān)聯(lián)查詢。水平分表不能自動(dòng)的進(jìn)行多表路由,這樣分表所帶來(lái)的性能各方面優(yōu)勢(shì)就沒(méi)有了。

    對(duì)于這種情況,建議您考慮下垂直分表,把表分到不同的機(jī)器上來(lái)提高性能。
      回復(fù)  更多評(píng)論
      

    # re: 數(shù)據(jù)庫(kù)分切設(shè)計(jì)何必糾結(jié)于hibernate shard模式,應(yīng)該簡(jiǎn)單化了 2010-10-26 11:10 lll
    問(wèn)題在于,有些系統(tǒng),瓶頸就在那一張表... ... 你就是單為這張表分配個(gè)服務(wù)器也沒(méi)用  回復(fù)  更多評(píng)論
      

    # re: 數(shù)據(jù)庫(kù)分切設(shè)計(jì)何必糾結(jié)于hibernate shard模式,應(yīng)該簡(jiǎn)單化了 2010-10-27 09:32 深藍(lán)色心情
    @lll
    下個(gè)更新準(zhǔn)備支持您說(shuō)到的情況,一張表分到多組機(jī)器上。  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 国产成人精品久久亚洲高清不卡| 亚洲第一AAAAA片| 国产成人亚洲综合网站不卡| 在线观看www日本免费网站| 亚洲AV综合色区无码一区爱AV | 亚洲天堂中文字幕| 十八禁视频在线观看免费无码无遮挡骂过 | 亚洲AV成人一区二区三区在线看| 999久久久免费精品播放| 老汉色老汉首页a亚洲| **毛片免费观看久久精品| 亚洲一区二区三区高清| 91热成人精品国产免费| 亚洲乱码一区av春药高潮| 大学生高清一级毛片免费| 在线观看亚洲免费| 久久亚洲2019中文字幕| 免费h视频在线观看| 亚洲国产亚洲片在线观看播放| 91免费精品国自产拍在线不卡| 亚洲人成人网站18禁| 亚洲av无码天堂一区二区三区| 久久精品无码专区免费| 亚洲电影一区二区| 青青草a免费线观a| 无遮挡a级毛片免费看| 亚洲高清在线观看| 国产成人免费网站| 免费无码又爽又黄又刺激网站 | 精品亚洲一区二区三区在线观看 | 成人毛片免费视频| 农村寡妇一级毛片免费看视频| 在线观看午夜亚洲一区| 999在线视频精品免费播放观看| 亚洲AV综合永久无码精品天堂| 亚洲线精品一区二区三区| 免费AA片少妇人AA片直播| 免费无码又爽又黄又刺激网站| 亚洲午夜精品一区二区| 永久久久免费浮力影院| 国色精品va在线观看免费视频|