spring 如何动态修改bean 并实现数据源的改变

getdate 2014-02-08 11:18:43
主数据库中放着从数据库的数据库名称,用户名和密码;页面查询汇总信息来自主数据库,查看详细信息时会根据页面传过来的从数据库标示符动态修改bean.xml文件中的数据源连接。请问各位大神此需求该如何实现?

bean.xml 如下

<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/db1?useUnicode=true&characterEncoding=utf-8</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>

</bean>

就是在程序中根据标示符得到此标示符的从库,从而改变xml中的url,username,password 并且再不重启服务的情况下使修改能够起作用。
...全文
3676 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljhvf 2015-12-27
  • 打赏
  • 举报
回复
我最近也在搞这个,下去试一下,不行再请教你
学习人 2015-05-07
  • 打赏
  • 举报
回复
能帮忙发送到zhuyuqu840123@163.com这个邮箱。感谢!!!
学习人 2015-05-07
  • 打赏
  • 举报
回复
能帮忙提供一下代码
getdate 2014-02-27
  • 打赏
  • 举报
回复
感谢各位的回复,此问题已经解决,解决思路是 1:在spring初始化过程中动态创建spring bean 给其赋值,并且注册到spring applicationContext中; 2:创建动态切换代理数据源,修改动态代理数据源中MAP的值,在第一步的时候就给MAP赋值; 3:在WEB层写过滤器,根据不同的请求动态切换数据源;
getdate 2014-02-25
  • 打赏
  • 举报
回复
引用 14 楼 xiaofanac66 的回复:
//获取Application ConfigurableApplicationContext cac = new ClassPathXmlApplicationContext("beans.xml"); //修改beans.xml 中的数据源 ... cac.refresh(); //然后刷新上下文
这个方法在main方法中测试的时候,确实可行,但是放到SSH框架中就不起作用了;我是在过滤器中判断页面传过来的参数,根据参数修改数据源的URL,然后在刷新的;
getdate 2014-02-08
  • 打赏
  • 举报
回复
引用 3 楼 fangmingshijie 的回复:
修改bean.xml必须要重启容器。
我是想通过下面类似的方式来修改xml,

ApplicationContext act = new ClassPathXmlApplicationContext("bean.xml");
BasicDataSource ds = (BasicDataSource) act.getBean("dataSource");
if(operName!=null && operName.equals("111")) {
	ds.setUrl("jdbc:jtds:sqlserver://localhost:1433;DatabaseName=db111");
}
else
{
	ds.setUrl("jdbc:jtds:sqlserver://localhost:1433;DatabaseName=db222");
}
参看了http://blog.csdn.net/littlechang/article/details/8071882 的文档,但是还是不明白。
  • 打赏
  • 举报
回复
修改bean.xml必须要重启容器。
coolbamboo2008 2014-02-08
  • 打赏
  • 举报
回复
可以把jdbc的配置放到外面写 spring配置文件中加这个:表示从外边的jdbc配置文件获取内容

<context:property-placeholder location="classpath:jdbc.properties"/>
spring配置文件:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	    <property name="driverClassName" value="${driverClassName}"/>
	    <property name="url" value="${url}"/>
	    <property name="username" value="${username}"/>
	    <property name="password" value="${password}"/>
	    <property name="initialSize" value="${initialSize}"/>
	    <property name="maxActive" value="${maxActive}"/>
	    <property name="maxIdle" value="${maxIdle}"/>
	    <property name="minIdle" value="${minIdle}"/>
  	</bean>
jdbc的内容:

driverClassName=org.gjt.mm.mysql.Driver
url=jdbc:mysql://localhost:3306/hahaha?useUnicode=true&characterEncoding=UTF-8

username=root

password=9999999999

initialSize=1

maxActive=200

maxIdle=2

minIdle=1
不过,重启这个问题我不太确定,等高手来解吧
loveunittesting 2014-02-08
  • 打赏
  • 举报
回复
改变数据库连接并不明智,就算改变了,还有连接池内的连接还要处理,困难比想象的多,不如把从数据库再配置个datasource,直接使用就算了
xiaofanac66 2014-02-08
  • 打赏
  • 举报
回复
//获取Application ConfigurableApplicationContext cac = new ClassPathXmlApplicationContext("beans.xml"); //修改beans.xml 中的数据源 ... cac.refresh(); //然后刷新上下文
loveunittesting 2014-02-08
  • 打赏
  • 举报
回复
如何做到在数据库有变化时更新数据源呢?这个就看你用什么方式更新主库里面的数据库配置了。你现在用的是spring,如果是通过程序增加从库的数据,那可以考虑用aop来实现。
getdate 2014-02-08
  • 打赏
  • 举报
回复
引用 11 楼 yys79 的回复:
简单一点说,可以在内存中维护一个列表,也就是数据源的列表。在系统启动的时候进行初始化,并且在从数据库有变动的时候更新数据源。然后用这些数据源来访问数据库就好了。从数据库不要与spring搞上什么特殊的关系
如何做到在数据库有变化时更新数据源呢?这点不是很明白;从数据库理论上和spring没有多少关系,因为只要备份一个数据库,那主数据库中就会新增一条记录,只是页面在用到备份过来的数据库时,会根据页面传过来不同的从数据库标示而去动态的替换一下原有的url等; 还有就是,我也觉得这种方式其实真没什么好处,除了简化了配置文件(不必写N个数据源)!不过这种方式还是要准备一下的。
loveunittesting 2014-02-08
  • 打赏
  • 举报
回复
简单一点说,可以在内存中维护一个列表,也就是数据源的列表。在系统启动的时候进行初始化,并且在从数据库有变动的时候更新数据源。然后用这些数据源来访问数据库就好了。从数据库不要与spring搞上什么特殊的关系
getdate 2014-02-08
  • 打赏
  • 举报
回复
引用 9 楼 yys79 的回复:
[quote=引用 8 楼 getdate 的回复:] [quote=引用 7 楼 SDN_SUPERUSER 的回复:] 配置多个datasource吧。使用ThreadLocal切换数据源
这种方式我已经实现了,可是领导有些不同意;想根据标示在数据库中得到对应的url、username、password后,通过程序将原来的数据源中的对应项给替换掉;所以才请教各位是否有过这样的情况[/quote] 领导不同意,但是我实在看不出这种方式的好处。难道从数据库不固定有多少个?可以随时创建?[/quote] 倒不是随时创建,只是会随着系统部署的增加而在主站增加从站数据库的备份;没增加一个备份,主库中都会增加一条记录,记录新备份服务器的url、username、pwd信息;
loveunittesting 2014-02-08
  • 打赏
  • 举报
回复
引用 8 楼 getdate 的回复:
[quote=引用 7 楼 SDN_SUPERUSER 的回复:] 配置多个datasource吧。使用ThreadLocal切换数据源
这种方式我已经实现了,可是领导有些不同意;想根据标示在数据库中得到对应的url、username、password后,通过程序将原来的数据源中的对应项给替换掉;所以才请教各位是否有过这样的情况[/quote] 领导不同意,但是我实在看不出这种方式的好处。难道从数据库不固定有多少个?可以随时创建?
getdate 2014-02-08
  • 打赏
  • 举报
回复
引用 7 楼 SDN_SUPERUSER 的回复:
配置多个datasource吧。使用ThreadLocal切换数据源
这种方式我已经实现了,可是领导有些不同意;想根据标示在数据库中得到对应的url、username、password后,通过程序将原来的数据源中的对应项给替换掉;所以才请教各位是否有过这样的情况
jackson_fighting 2014-02-08
  • 打赏
  • 举报
回复
配置多个datasource吧。使用ThreadLocal切换数据源
caibird1024 2014-02-08
  • 打赏
  • 举报
回复
应该换个思路,spring启动时加载初始化多个datasource,具体调度时候再根据数据库标示符调用
getdate 2014-02-08
  • 打赏
  • 举报
回复
引用 2 楼 coolbamboo2008 的回复:
可以把jdbc的配置放到外面写 spring配置文件中加这个:表示从外边的jdbc配置文件获取内容

<context:property-placeholder location="classpath:jdbc.properties"/>
spring配置文件:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	    <property name="driverClassName" value="${driverClassName}"/>
	    <property name="url" value="${url}"/>
	    <property name="username" value="${username}"/>
	    <property name="password" value="${password}"/>
	    <property name="initialSize" value="${initialSize}"/>
	    <property name="maxActive" value="${maxActive}"/>
	    <property name="maxIdle" value="${maxIdle}"/>
	    <property name="minIdle" value="${minIdle}"/>
  	</bean>
jdbc的内容:

driverClassName=org.gjt.mm.mysql.Driver
url=jdbc:mysql://localhost:3306/hahaha?useUnicode=true&characterEncoding=UTF-8

username=root

password=9999999999

initialSize=1

maxActive=200

maxIdle=2

minIdle=1
不过,重启这个问题我不太确定,等高手来解吧
当使用jdbc.properties 时,如果这里面写了多个url,那该如何做呢?bean.xml如何得到想要的那个呢?

81,095

社区成员

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

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