日期:2014-05-17  浏览次数:20951 次

spring 如何动态修改bean 并实现数据源的改变
本帖最后由 getdate 于 2014-02-08 11:19:59 编辑
主数据库中放着从数据库的数据库名称,用户名和密码;页面查询汇总信息来自主数据库,查看详细信息时会根据页面传过来的从数据库标示符动态修改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&amp;characterEncoding=utf-8</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>

</bean>

就是在程序中根据标示符得到此标示符的从库,从而改变xml中的url,username,password 并且再不重启服务的情况下使修改能够起作用。
------解决方案--------------------
改变数据库连接并不明智,就算改变了,还有连接池内的连接还要处理,困难比想象的多,不如把从数据库再配置个datasource,直接使用就算了
------解决方案--------------------
可以把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&amp;characterEncoding=UTF-8

username=root

password=9999999999

initialSize=1

maxActive=200

maxIdle=2

minIdle=1


不过,重启这个问题我不太确定,等高手来解吧
------解决方案--------------------
修改bean.xml必须要重启容器。
------解决方案--------------------
应该换个思路,spring启动时加载初始化多个datasource,具体调度时候再根据数据库标示符调用
------解决方案--------------------
配置多个datasource吧。使用ThreadLocal切换数据源
------解决方案--------------------
引用:
Quote: 引用:

配置多个datasource吧。使用ThreadLocal切换数据源


这种方式我已经实现了,可是领导有些不同意;想根据标示在数据库中得到对应的url、username、password后,通过程序将原来的数据源中的对应项给替换掉;所以才请教各位是否有过这样的情况

领导不同意,但是我实在看不出这种方式的好处。难道从数据库不固定有多少个?可以随时创建?
------解决方案--------------------
简单一点说,可以在内存中维护一个列表,也就是数据源的列表。在系统启动的时候进行初始化,并且在从数据库有变动的时候更新数据源。然后用这些数据源来访问数据库就好了。从数据库不要与spring搞上什么特殊的关系
------解决方案--------------------
//获取Application
ConfigurableApplicationContext cac = new ClassPathXmlApplicationContext("beans.xml");
//修改beans.xml 中的数据源&nbs