连接池控制多个数据源
需求场景如下:
J2EE系统有两个数据库:数据库A,数据库B(都是Oracle数据库,以读数据为主)
现要求在系统与数据库中间加入连接池。
数据库A是主数据库,平时正常连接是连接到A读写数据。
当A数据库挂了,连接不上或者忙碌用户达到某个数量的时候(我们假如是10个),系统访问数据库B。
当A数据库恢复正常了或者忙碌用户小于某个数量的时候(我们假如是1),重新连接回数据库B。
初步采用的C3P0连接池方案。
为系统配置两个数据源(Datasource),用程序监控两个数据源的使用情况。
并且根据实际情况做切换。
这是一个初步想法,不知道能不能行得通,有没有什么要特别考虑的,请各位大大指点一二。
谢谢。
9 楼 xieke 2009-07-14 非常简单,搞个全局静态变量 DB_NO,缺省为0,
系统启动时,把几个连接池都载入,放到 DBPool[] 数组中,
getConnection() 方法 中, 根据DB_NO ,返回相应连接池 DBPool[DB_NO] 的 connection,
系统运行时可以动态改变DB_NO,动态切换数据库。
至于切换策略,根据你的系统实际情况自己编写。 10 楼 unsid 2009-07-15 这个功能你要自己写阿?数据库本身不就支持么? 11 楼 srdrm 2009-07-15 自己做一个 DataSource 专门完成主备数据源切换功能就行了. 可以聚合两个外部c3p0的连接池数据源来实现 12 楼 81261686 2009-07-15 我做过同一个应用里面使用spring根据域名切换四十个不同的数据源,楼主的方法应该可行。只是在切换条件上要好好考虑。 13 楼 vvggsky 2009-07-15 AbstractRoutingDataSource。
适当做下手脚,Connection getConnection(),proxy下返回的Connection ,
添加计数功能,get 时++,close时--
然后根据得到的链接数实现自己的查找DataSource的策略! 14 楼 方世玉 2009-07-15 双机加浮动IP就搞定了,何必自己应用软件来搞,效果还不好。就问一个,你的应用程序怎么监控DB当了? 15 楼 tangdaibing 2009-07-15 这应该是数据库端就可以搞定的东西为什么要搞得这么复杂 16 楼 pubx 2009-07-15 oracle rac就可以了集群了啊,应用程序不需要做什么改动。 17 楼 lnaigg 2009-07-16 现在一般数据库都支持集群
不过LZ不是说集群,而是两个异构数据库吧。
oracle和db2都有联邦数据库产品的,其他厂商可能也有。 18 楼 pedestrian_I 2009-07-16 eclipse2008 写道此问题属于集群与负载均衡问题。
可以研究一下相应web服务器或者应用服务器的配置。
我也知道这个是均衡负载的问题,只是上头不让在数据库层做。
我也没有办法 19 楼 pedestrian_I 2009-07-16 jwinder 写道考虑问题:
1、应用服务器宕掉了!
2、网络被阻塞了!
3、DB挂了!
等等。
有些事不能想像的!
其实我也不想那么做,在数据库上层次的东西在应用层上是很难控制的。我真的没什么信心会出现什么异常状况的。
可能上头是想做的比较通用一些,以后无论是用哪个数据库,都可以做到这样的均衡负载。 20 楼 pedestrian_I 2009-07-16 xieke 写道非常简单,搞个全局静态变量 DB_NO,缺省为0,
系统启动时,把几个连接池都载入,放到 DBPool[] 数组中,
getConnection() 方法 中, 根据DB_NO ,返回相应连接池 DBPool[DB_NO] 的 connection,
系统运行时可以动态改变DB_NO,动态切换数据库。
至于切换策略,根据你的系统实际情况自己编写。
我暂时是这样实现的,切换策略的话也比较简单
条件1:当数据源1获取不到connection时
条件2:当数据源1忙碌的时候,C3P0有API可以做到获取当前数据源的忙碌用户数和空闲connection数
条件3:当数据源1挂了的时候,抛出异常那么获取数据源2
只是这个也有一个问题,如果在切换1和2的这段时间,有request进来,会不会出现异常情况呢。
这个间隔时间,如果出现异常,则考虑重试request机制,虽然用户等久点,但是不会出现错误。 21 楼 pedestrian_I 2009-07-16 81261686 写道 我做过同一个应用里面使用spring根据域名切换四十个不同的数据源,楼主的方法应该可行。只是在切换条件上要好好考虑。
关于切换条件,这位仁兄有没有一些建议。我现在怕是遗漏。
不知道能不能指点一二啊。 22 楼 codger 2009-07-16 oracle的rac加数据源配置即可 23 楼 pedestrian_I 2009-07-16 codger 写道oracle的rac加数据源配置即可
我知道可以,但是上面不用我也没办法啊。
哎…… 24 楼 duduli 2009-07-16 这个我刚看到了 在blogjava中
有一篇文章,不过他不是用连接池
可以参考一下
http://www.blogjava.net/youxia/archive/2009/07/15/286916.html
在SpringSide 3 中使用多个数据库的方法 25 楼 taojingrui 2009-07-17 Weblogic 有multiple datasource 的概念,所以用Weblogic 的datasource 就能满足你的要求。看看其他开源的datasource是否有类似的实现。 26 楼 whitesock 2009-07-17 使用LVS 27 楼 jayxu 2009-07-17 你的应用场景没必要这样做
28 楼 chen4059 2009-07-21 双机冷备,HA吧。
想好就要投入啊。
赛的VCS不错。