数据库分切设计何必纠结于hibernate shard模式,应该简单化了
最近讨论db shard的帖子比较多,感觉很多都是在参考hibernate shard的思路,但hibernate分表真的那么好吗?我觉得它最少有2个问题:
1. 改成shard后,代码的API调用要变。代码改动很大。
2. 设计很复杂,不清晰,逻辑关系难以理解。
hibernate shard基本上就是为了shard而对hibernate做的增增补补,凑合用还行,根本不具备设计上的参考价值。
对数据库分切方面,到目前为止,我觉得还是guzz的设计最清晰,如果我说的不对,欢迎理性讨论。不管您是否使用guzz,但是guzz在数据库分切方面的设计,对于清晰的设计模式,比hibernate shard更具有借鉴意义。
guzz垂直切分
垂直切分是指将不同的表分别存储到不同的数据库中。guzz默认配置级支持,不需要写任何代码,可以在任何时候,在需要时,将每张表存储到自己单独的一组服务器上,应该说是垂直分切的极限了。而且设计上,无论什么时候怎么分切,都不需要你改动代码。开发时你可以让所有表在一个库上;部署时,分到多个库上;以后业务增加了,再更加分散的放。
垂直分切简单配置方式:
1. 声明你要用多少台数据库,数据库之间什么关系。
<dialect /> <dialect name="oracle10gdialect" /> <tran> <dbgroup name="default" masterDBConfigName="masterDB" /> <dbgroup name="mysql" masterDBConfigName="masterDB" slaveDBConfigName="mysqlSlaveDB" dialectName="mysql5dialect" /> <dbgroup name="oracle" masterDBConfigName="oracleDB" dialectName="oracle10gdialect" /> </tran>
<a-business dbgroup="default" name="filterWord" /><a-business dbgroup="mysql" name="filterWordGroup" /><a-business dbgroup="oracle" name="configuration" />
[masterDB]guzz.identifer=blogMasterDBguzz.IP=localhostguzz.maxLoad=120driverClass=com.mysql.jdbc.DriverjdbcUrl=jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=trueuser=rootpassword=rootacquireIncrement=10idleConnectionTestPeriod=60[updateMasterDB]guzz.identifer=incUpdateDB1guzz.IP=localhostguzz.maxLoad=20driverClass=com.mysql.jdbc.DriverjdbcUrl=jdbc:mysql://localhost:3306/guzzSlowUpdate?useUnicode=true&characterEncoding=UTF-8user=slowupdatepassword=slowupdateacquireIncrement=10idleConnectionTestPeriod=60[logMasterDB]....