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

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

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

    深藍色心情

    過來聊聊~~~~

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

    1. 改成shard后,代碼的API調用要變。代碼改動很大。 
    2. 設計很復雜,不清晰,邏輯關系難以理解。 

    hibernate shard基本上就是為了shard而對hibernate做的增增補補,湊合用還行,根本不具備設計上的參考價值。 

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

    guzz垂直切分 

    垂直切分是指將不同的表分別存儲到不同的數據庫中。guzz默認配置級支持,不需要寫任何代碼,可以在任何時候,在需要時,將每張表存儲到自己單獨的一組服務器上,應該說是垂直分切的極限了。而且設計上,無論什么時候怎么分切,都不需要你改動代碼。開發時你可以讓所有表在一個庫上;部署時,分到多個庫上;以后業務增加了,再更加分散的放。 

    垂直分切簡單配置方式: 

    1. 聲明你要用多少臺數據庫,數據庫之間什么關系。 

    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組數據庫,而且數據庫類型還不一樣。 

    2. 對每張表,配置應該存儲到那個庫里 

    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" />  

    簡單的配置,將三個對象分別存儲到3臺不同的數據庫中,完成垂直分切。 

    guzz水平切表 

    水平切表是指將一張大表,分切成許多小表。guzz的設計是當需要水平分表時,原先代碼不變,為每個需要分切的表編寫一個分表策略類,配置到系統中。然后在調用前,聲明分表策略即可。 
      
      整個過程只需要新寫一個類,在調用出增加一行代碼即可,對原始系統入侵非常小,風險可控。 

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


    數據庫主從分離 

    從垂直分切部分可以看到,guzz也是配置性的原生支持讀寫分離。如果需要增加從數據庫,可以隨時加上,不需要改任何代碼。不需要改動代碼,而且配置也不復雜,應該算是設計上的極限了吧? 

    你只需要在dbgroup中增加一個屬性“slaveDBConfigName”,然后在一個properties文件中加上所有你需要的從數據庫連接池配置即可,從數據庫可以有許多臺。 

    這個hibernate shard根本就沒有涉及到。而且guzz允許程序控制讀寫庫選取,和proxy模式的中間件路由各有優勢,畢竟更加容易控制。如果你做過內容提前審核再允許發布的系統,就會明白proxy中間件解決不了全部問題,有些讀操作不允許延遲,只能讀主庫,而是也是讀事務,proxy中間件會很尷尬。 

    異構數據庫 

    這個hibernate以及ibatis之類的更沒有了。而且也是對應用透明的,你可以隨時選擇增加一種數據庫,然后把某些表放到上面,如增加一個H2做應用端緩存數據庫,自己完成類似Timesten + oracle的架構。 

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

    數據庫連接池配置 

    隨著表垂直和水平切分的進行,數據庫會越來越多,數據源配置也會越來越多。guzz的設計是配置分組管理,類似Mysql的配置文件。每個數據源配置都在一個組內,無論增加多少都清晰了然,不會名字相互沖突。 

    示例: 
    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. ....  

    如果一些數據庫對某些連接池支持更好,guzz設計上還允許為不同的數據源指定不同的連接池實現。 

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

    Feedback

    # re: 數據庫分切設計何必糾結于hibernate shard模式,應該簡單化了 2010-10-18 22:09 YangL
    hibernate shard大概是零七零八年的代碼了吧,好像已經死了。
    而guzz在國內的大型論壇應用上還是很不錯的,如強國論壇、央視的投票系統。。。  回復  更多評論
      

    # re: 數據庫分切設計何必糾結于hibernate shard模式,應該簡單化了 2010-10-19 11:29 MyYate
    水平劃分時如何做到排序和分組統計?這個在企業應用里使用很多。http://code.google.com/p/guzz/wiki/TutorialShadowTable?wl=zh-Hans
    我看這兒沒有給出sample,謝謝~  回復  更多評論
      

    # re: 數據庫分切設計何必糾結于hibernate shard模式,應該簡單化了 2010-10-19 13:07 darkbluefeeling
    @MyYate

    水平分切后這方面需要手工進行多表關聯查詢。水平分表不能自動的進行多表路由,這樣分表所帶來的性能各方面優勢就沒有了。

    對于這種情況,建議您考慮下垂直分表,把表分到不同的機器上來提高性能。
      回復  更多評論
      

    # re: 數據庫分切設計何必糾結于hibernate shard模式,應該簡單化了 2010-10-26 11:10 lll
    問題在于,有些系統,瓶頸就在那一張表... ... 你就是單為這張表分配個服務器也沒用  回復  更多評論
      

    # re: 數據庫分切設計何必糾結于hibernate shard模式,應該簡單化了 2010-10-27 09:32 深藍色心情
    @lll
    下個更新準備支持您說到的情況,一張表分到多組機器上。  回復  更多評論
      

    主站蜘蛛池模板: 亚洲美女免费视频| 国产精品亚洲一区二区三区在线观看 | 一级片在线免费看| 亚洲AV日韩AV天堂久久| 毛片免费在线观看网站| 精品乱子伦一区二区三区高清免费播放 | 免费国产黄网站在线观看可以下载 | 亚洲免费日韩无码系列 | 97久久精品亚洲中文字幕无码| 国拍在线精品视频免费观看| 337p日本欧洲亚洲大胆人人| 亚洲精品天天影视综合网| 四虎免费在线观看| 无码国产精品一区二区免费3p| 亚洲性色精品一区二区在线| 国产亚洲精品岁国产微拍精品| 成年女人免费视频播放体验区| a毛片在线看片免费| 亚洲欧美国产国产一区二区三区| 国产亚洲精品岁国产微拍精品 | 亚洲图片中文字幕| 亚洲熟妇无码AV在线播放| 女人让男人免费桶爽30分钟| 国产精品白浆在线观看免费| 最好2018中文免费视频| 亚洲中文字幕人成乱码| 亚洲高清国产拍精品26U| 凹凸精品视频分类国产品免费| 可以免费看的卡一卡二| 中文字幕乱码一区二区免费| 无码的免费不卡毛片视频| 一本天堂ⅴ无码亚洲道久久| 亚洲日本精品一区二区| 国产成人精品日本亚洲| 亚洲AV中文无码乱人伦| 午夜寂寞在线一级观看免费| 99在线观看免费视频| 久久免费观看国产精品88av| 韩国免费A级毛片久久| 爱爱帝国亚洲一区二区三区| 亚洲人成未满十八禁网站|