论坛首页 Java企业应用论坛

讨论一下基于Master-Slave数据库模式的J2EE开发的框架选择

浏览 33872 次
该帖已经被评为良好帖
作者 正文
   发表时间:2007-11-28  
robbin 写道
http://www.jroller.com/kenwdelong/entry/horizontal_database_partitioning_with_spring

这里有篇文章介绍如何使用spring/hibernate进行水平数据库分区的文章,很不错,推荐。

不过在这篇文章的Summary部分,作者似乎对自己的方案不太满意:
引用
I think if I were to start it again I'd go back to the original way of multiple session factories (but god how I hate watching them all start up when I bounce my app server). Or I'd check to see what's up with Shards these days, that might even be better. We may yet change to one of those methods because of the issues noted above.
0 请登录后投票
   发表时间:2007-11-28  
权衡一下,我觉得Readonly大哥的ReplicationDriver和pppppp兄弟提出的sqlproxy这两种方案都比较可行,两种方案都是对应用透明的,sqlproxy的透明度更高一点,但是对程序员来说使用ReplicationDriver更容易点。
0 请登录后投票
   发表时间:2007-11-28  
我刚才很仔细的阅读了MySQL Proxy的文档,非常赞叹!另外我发现,MySQL Proxy的作者原来就是lighttpd的作者,难怪MySQL Proxy很多功能和lighttpd看起来那么似曾相识。MySQL Proxy做的很棒,用lua编写分发逻辑,实现读写分离也很酷,相信等MySQL Proxy正式发布以后,所有的MySQL用户,特别是用MySQL来跑大流量网站的用户都会欢欣鼓舞的。

0 请登录后投票
   发表时间:2007-11-28  
Master/Slave和Shard这样的水平切分还是不同的,后者可能将不同实体甚至同一实体的不同部分,分布在不同的数据库,而不像前者Slave方保留完整拷贝。所以Hibernate Shard要解决的问题更复杂。

Master/Slave的方案简单易行,当然节点数非常多的时候维护起来就非常麻烦了。
0 请登录后投票
   发表时间:2007-11-30  
看了robbin推荐的blog,感觉作者自己都不是很满意自己的方案。
事务存在的始终就是一个不断的话题!
这个帖子值得讨论
robbin 写道
http://www.jroller.com/kenwdelong/entry/horizontal_database_partitioning_with_spring

这里有篇文章介绍如何使用spring/hibernate进行水平数据库分区的文章,很不错,推荐。
0 请登录后投票
   发表时间:2007-12-09  
个人觉得还是在数据层面解决,独立于应用是最适合大型应用的方法,
透明于开发,减少开发及测试工作,一劳永宜
对于公司来说,访问量大,说明业务开展顺利,到了一定层次,可以考虑升级主机和数据库到ORACLE或者DB2,毕竟数据是最重要的,而且利于移植,比如假设某天你们突然要用C++来实现某些组件了。
我们是双ORACLE热备,IBM P Server,虽然我不喜欢Oracle,但是客户放心。
0 请登录后投票
   发表时间:2007-12-11  
[quote="robbin"]简单的解决办法是这样的:查询语句使用Hibernate的native SQL,可以在查询语句里面动态绑定不同的数据库表,实现动态查询不同的slave数据库 或者复杂一些,你可以钻研一下Hibernate Shards,这个是Google公司捐献给Hibernate的项目,利用Hibernate进行分布式数据库访问,做的相当不错。 [/quote]

如果没有明确切换数据库要求的话,其实采用数据库自己的解决方案会更好,比如Mysql有自己的NDB作为SNA集群的解决方案。以NDB为例,仔细研究完它之后,会发现:NDB面对的困难(事务,跨表连接,视图),shard都没有解决;NDB处理得好的(垂直切分数据),shard才能支持。

当然,shard作为应用服务器这层的工具,能够做到如此的通用,已经很不错了。但真正需要高效的数据库集群,甚至线性集群的场景,还不是java触手可及的范围。

0 请登录后投票
   发表时间:2007-12-16  
项目中曾经想尝试shards,效果并不理想,一个是不支持数据库的垂直切分(类似于DBLink的功能);另一个是在数据库表水平切分的情况下,查询操作是跨表进行的,无法针对单表操作,但实际项目中往往会把业务相关的数据放在同一个子表或子库中,只要单表、单库操作就满足需求;再者就是丢失了很多hibernate的特性。

在mysql的新版本中,开始支持分区表,如果还有DBLink功能的话?,那垂直划分和水平划分,都可以在数据库层面解决了。

至于Master和Slave或者说负载均衡,那是另一回事了,不过lz好像说的就是这个,我跑题了~~
0 请登录后投票
   发表时间:2008-01-13  
配置两个datasource,走不同的sessionFactory也可以,jdbcTemplate或者ibatis也差不多这意思,ReplicationDriver是个不错的东西
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics