主数据库中放着从数据库的数据库名称,用户名和密码;页面查询汇总信息来自主数据库,查看详细信息时会根据页面传过来的从数据库标示符动态修改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 并且再不重启服务的情况下使修改能够起作用。
------解决方案--------------------
改变数据库连接并不明智,就算改变了,还有连接池内的连接还要处理,困难比想象的多,不如把从数据库再配置个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&characterEncoding=UTF-8
username=root
password=9999999999
initialSize=1
maxActive=200
maxIdle=2
minIdle=1
不过,重启这个问题我不太确定,等高手来解吧
------解决方案--------------------
修改bean.xml必须要重启容器。
------解决方案--------------------
应该换个思路,spring启动时加载初始化多个datasource,具体调度时候再根据数据库标示符调用
------解决方案--------------------
配置多个datasource吧。使用ThreadLocal切换数据源
------解决方案--------------------
领导不同意,但是我实在看不出这种方式的好处。难道从数据库不固定有多少个?可以随时创建?
------解决方案--------------------
简单一点说,可以在内存中维护一个列表,也就是数据源的列表。在系统启动的时候进行初始化,并且在从数据库有变动的时候更新数据源。然后用这些数据源来访问数据库就好了。从数据库不要与spring搞上什么特殊的关系
------解决方案--------------------
//获取Application
ConfigurableApplicationContext cac = new ClassPathXmlApplicationContext("beans.xml");
//修改beans.xml 中的数据源 ...
cac.refresh(); //然后刷新上下文