spring动态切换数据源的问题

fjl111222 2010-07-01 11:11:55
我用SPRING配置了两个数据源并且能够动态切换,如果不了解这个的话那就不用继续看下去了,谢谢
我的要求是:当一个数据库当掉了的话能够自动切换到另一个数据库,如果用TRY...CATCH的话也能实现,不过还是会有风险,因为在切换的过程中也会抛出异常,也不要求用session.isConnnect来判断,因为这样的话我还不如直接配两个数据源,而且以后的代码会变的很乱,期待各位高手来解决问题~!谢谢!
...全文
1108 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ant1222 2012-08-23
  • 打赏
  • 举报
回复
可以用spring的afterthrow解决问题,拦截指定的异常信息,然后动态切换就行了
夕水溪下 2011-08-22
  • 打赏
  • 举报
回复
我通过ApplicationContext.getbean,为什么我改变配置数据源的driverclass、user等,不能让spring使用我修改后的数据源呢? 请高手指教
fjl111222 2010-07-01
  • 打赏
  • 举报
回复
前面你说的这些我早都已经配置好了,并且运行都能通过了,现在就是怎么判断数据源是否正常
fjl111222 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yys79 的回复:]
2楼的方法可行,不过lz不能简单的用2个数据库服务器,要做多机热备的
[/Quote]
这个肯定想过,但是现在还没这个条件啊
fjl111222 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kurama_mail 的回复:]

动态切换的实现部分的代码是可以自己设计的,在切换时可以判断数据源是否正常,不正常启用下一配置。
[/Quote]
我现在要问的就是怎么判断数据源是否正常,但肯定不能用TRY。。CATCH吧
求教
loveunittesting 2010-07-01
  • 打赏
  • 举报
回复
2楼的方法可行,不过lz不能简单的用2个数据库服务器,要做多机热备的
mndn_nana 2010-07-01
  • 打赏
  • 举报
回复
看楼下怎么说
kurama_mail 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kurama_mail 的回复:]
我不想贴是因为动态切换的实现部分的代码是可以自己设计的。
[/Quote]
动态切换的实现部分的代码是可以自己设计的,在切换时可以判断数据源是否正常,不正常启用下一配置。


wen5200a 2010-07-01
  • 打赏
  • 举报
回复
...学习啊
fjl111222 2010-07-01
  • 打赏
  • 举报
回复
2L你说的这些不就是配置动态数据源吗?这个我知道,请看清楚题目是怎么写的

CustomerContextHolder.setCustomerType(DataSourceMap.Admin);//设置数据源
CustomerContextHolder.setCustomerType(DataSourceMap.Yxh);//设置为另一个数据源

ApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml");
TestDao tt = (TestDao)ac.getBean("testDao");


Test test = new Test();
test.setUsername("test1");
test.setPassword("111");

tt.save(test);
我说我要程序作判断,如果一个数据库当掉了,我程序要自动切换,用另一个数据源
kurama_mail 2010-07-01
  • 打赏
  • 举报
回复
我不想贴是因为动态切换的实现部分的代码是可以自己设计的。
kurama_mail 2010-07-01
  • 打赏
  • 举报
回复
我不想贴是因为动态切换的实现部分的代码是可以自己设计的。
kurama_mail 2010-07-01
  • 打赏
  • 举报
回复

<!-- DataSource -->
<bean id="dataSource_master" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
<property name="jdbcUrl" value="${dataBase.url}" />
<property name="properties">
<props>
<prop key="c3p0.minPoolSize">1</prop>
<prop key="c3p0.maxPoolSize">60</prop>
<prop key="c3p0.timeout">60</prop>
<prop key="c3p0.max_statement">80</prop>
<prop key="c3p0.testConnectionOnCheckout">true</prop>
<prop key="hibernate.c3p0.testConnectionOnCheckout">false</prop>
<prop key="user">sm_admin</prop>
<prop key="password">sm_admin</prop>
</props>
</property>
</bean>

<bean id="dataSource_one" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass"
value="oracle.jdbc.driver.OracleDriver" />
<property name="jdbcUrl"
value="jdbc:oracle:thin:@192.168.1.100:1521:AREAA" />
<property name="properties">
<props>
<prop key="c3p0.minPoolSize">1</prop>
<prop key="c3p0.maxPoolSize">60</prop>
<prop key="c3p0.timeout">60</prop>
<prop key="c3p0.max_statement">80</prop>
<prop key="c3p0.testConnectionOnCheckout">true</prop>
<prop key="hibernate.c3p0.testConnectionOnCheckout">false</prop>
<prop key="user">sm_a_admin</prop>
<prop key="password">sm_admin</prop>
</props>
</property>
</bean>

<bean id="dataSource" class="com.xxxx.xx.service.database.DynamicDataSource">
<property name="targetDataSources">
<map>
<entry key="dataSource_master" value-ref="dataSource_master" />
<entry key="dataSource_one" value-ref="dataSource_one" />
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource_master" />
</bean>



package com.xxxx.xx.service.database;

import java.sql.SQLException;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
* 动态数据源切换类
*/
public class DynamicDataSource extends AbstractRoutingDataSource {

protected Object determineCurrentLookupKey() {
return DatabaseContextHolder.getDatabaseType();
}

@SuppressWarnings("unchecked")
public boolean isWrapperFor(Class arg0) throws SQLException {
return false;
}

@SuppressWarnings("unchecked")
public Object unwrap(Class arg0) throws SQLException {
return null;
}

}



其他代码我不想贴,自己找AbstractRoutingDataSource相关资料。人不要太懒
fjl111222 2010-07-01
  • 打赏
  • 举报
回复
我现在只是做个测试,看看能不能从代码的角度上来做,如果行不通的话那就用心跳来处理,因为是做的网络游戏,所以实时性比较高,数据库也有挂掉的可能的,另外WEB 服务是用LOAD BALANCE来处理的,另外配置的话就是你之前写的那些配置,没什么其他的了,如果实在没办法的话也就算了,就只能用心跳来处理了,非常感谢你的回答,如果没满意答案的话分就给你了kurama_mail,你的头象很不错
kurama_mail 2010-07-01
  • 打赏
  • 举报
回复
不过你这个需求也很奇怪 - - 。
一般数据库连接不是那么容易挂的吧。
硬要这么玩的话呢还是建议不要拿动态数据源连接池而直接封装短连接去处理。
你最好测试下当连接挂掉又恢复后你的项目有办法恢复连接吗。
kurama_mail 2010-07-01
  • 打赏
  • 举报
回复
没环境不能试,我记得当时使用的c3p0如果被切换数据源连接不上是等待到超时,然后给的异常。因为当时我特地没把事务交给spring处理所以我可以自由切换动态数据源(一旦有事务存在动态数据源切换无效)。
现在完全明白你的意思了,但不知道你具体都配置了什么。
fjl111222 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 kurama_mail 的回复:]
直接修改CustomerContextHolder中的切换部分。
[/Quote]
关键是判断数据源是否正常的代码是怎么写的呢?你说的这些我也知道啊,我也知道要修改CustomerContextHolder中的切换部分。但是如果不知道怎么判断数据源是否正常的话怎么去修改呢?关键还是怎么去判断数据源是否正常啊..
fjl111222 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yys79 的回复:]

没这个条件?那你做这个配置不是找客户骂呢吗?用了很久,某一天突然数据全没了,客户不疯了才怪。这也算是系统的巨大bug,做他完全是找事啊。
[/Quote]
汗之前看成了MySQL双机了,20W呢。我们用的是主从来达到数据同步的,谁能帮我解决上面这个问题呢?谢谢了!
kurama_mail 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fjl111222 的回复:]
2L你说的这些不就是配置动态数据源吗?这个我知道,请看清楚题目是怎么写的

CustomerContextHolder.setCustomerType(DataSourceMap.Admin);//设置数据源
CustomerContextHolder.setCustomerType(DataSourceMap.Yxh);//设置为另一个数据源

ApplicationCon……
[/Quote]
直接修改CustomerContextHolder中的切换部分。
loveunittesting 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fjl111222 的回复:]
引用 8 楼 yys79 的回复:
2楼的方法可行,不过lz不能简单的用2个数据库服务器,要做多机热备的

这个肯定想过,但是现在还没这个条件啊
[/Quote]
没这个条件?那你做这个配置不是找客户骂呢吗?用了很久,某一天突然数据全没了,客户不疯了才怪。这也算是系统的巨大bug,做他完全是找事啊。

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧