Hibernate如何动态链接数据库?

Hibernate如何动态链接数据库?

问题描述:

最近,公司的项目需要升级,要求把数据库做成可以配置的,即客户可以设置要链接哪个服务器上的哪个数据库。

 

 

例如:用户可以选择“测试数据库”,那么用户的所有操作都是在测试数据库上进行的;如果用户选择”正式数据库“,那么相应的操作都是在正式数据库上进行。

 

并且用户在使用过程中,可以随时切换数据库。

 

公司使用的系统框架是:SSH。大家有没有什么解决思路?谢谢!

我查看了一下SessionFactory的源代码 二级缓存就是基于SessionFactory的 如果整个应用程序只有是单例的SessionFactory的话 二级缓存是依然存在的 所以切换数据源后 同样要情况缓存 清空的方法是sessionFactory.evictQueries() ;

至于 第二个问题 sessionFactory 可以自己定义一个数据源 dataSourceAwre 实现ApplicationContextAware 代码如下

public class DataSourceAwre implements ApplicationContextAware
{

private ApplicationContext applicationContext ;


public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
    // TODO Auto-generated method stub
    this.applicationContext = applicationContext;

}

public DataSource getDataSource(String dataSourceName){

    return (DataSource)applicationContext.getBean(dataSourceName);
}

在配置文件中:

然后
DataSourceAwre dataSourceAwre = (DataSourceAwre )ctx.getBean("dataSourceAwre");
Session session = sessionFactory.openSession(dataSourceAwre .getDataSource(datasourceName).getConnection());

dataSourceName 可以使用ThreadLocal保存 在同一个线程内有效, 也可以通过其他例如session request 等等对象保存。

=============== 以上内容纯属个人想法,因为时间关系 所以只给出了思路,具体实现 个人再去完成和验证===========

用一个配置文件存储数据库连接设置就行了。如果用户修改了就保存到文件中

配置多个datasource ,具体操作时根据参数动态使用相应的数据源

首先定义两个可以切换的数据源

<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver" />

<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>

 

<bean id="dataSource1"
        class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="${jdbc.url1}"/>
        <property name="username" value="${jdbc.username1}" />
        <property name="password" value="${jdbc.password1}" />
    </bean>

 

 

2.定义spring 代理

 

<bean id="swapper"  class="org.springframework.aop.target.HotSwappableTargetSource">
           <constructor-arg><ref local="dataSource"/></constructor-arg>
    </bean>
   
    <bean id="swappableDataSource" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="targetSource">
        <ref local="swapper"/>
    </property>
</bean>

 

3. 注入datasource

    <bean id="testdao"
        class="com.coolhong.test.dao.testdaoibatis">
        <property name="dataSource" ref="swappableDataSource" />
    </bean>

 

4. 切换datasource代码:

 

 HotSwappableTargetSource swapper = (HotSwappableTargetSource) ctx.getBean("swapper");
               Object newTarget = ctx.getBean("dataSource1");
               swapper.swap(newTarget);

 

这个时候datasource 就自动切换到datasource1

 

 

 

 

第一次回复 ,如果有什么错误的地方 请指正

 

 

 

这个问题很简单吧
读写文件就是了

还得清理hibernate缓存

spring 的动态代理主意不错 支持下