使用带有 Spring 和 Hibernate 的会话工厂处理多个数据库连接
Posted
技术标签:
【中文标题】使用带有 Spring 和 Hibernate 的会话工厂处理多个数据库连接【英文标题】:handling multiple database connections using session factories with Spring and Hibernate 【发布时间】:2011-12-13 15:35:35 【问题描述】:我有一个需要在数据库模式之间动态切换的 Spring+Hibernate/Flex 应用程序。为了实现这一点,我在this 文章之后实现了一个 AbstractRoutingDataSource。不幸的是,在数据源之间进行更改是行不通的。 有人可以帮助我吗?
我点击了这个链接:Spring + Hibernate SessionFactory + AbstractRoutingDataSource
我的代码是: - 应用上下文:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>$jdbc.driverClassName</value>
</property>
<property name="url">
<value>$jdbc.url</value>
</property>
<property name="username">
<value>$jdbc.username</value>
</property>
<property name="password">
<value>$jdbc.password</value>
</property>
</bean>
<bean id="dataSource2"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>$jdbc.driverClassName</value>
</property>
<property name="url">
<value>$jdbc.url2</value>
</property>
<property name="username">
<value>$jdbc.username2</value>
</property>
<property name="password">
<value>$jdbc.password2</value>
</property>
</bean>
<bean id="routingDS" class="br.com.cpb.gtf.infra.RoutingDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="br.com.cpb.gtf.infra.SchemaConstants.TESTE" value-ref="dataSource2"/>
<entry key="br.com.cpb.gtf.infra.SchemaConstants.PRODUCAO" value-ref="dataSource"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource2"/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="br.com.cpb.*" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.query.substitutions">true '1', false '0'" </prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
-RoutingDataSource:
package br.com.cpb.gtf.infra;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class RoutingDataSource extends AbstractRoutingDataSource
@Override
protected Object determineCurrentLookupKey()
return Globals.getSchema();
-SchemaConstants
package br.com.cpb.gtf.infra;
public class SchemaConstants
public static final String PRODUCAO = "dataSource";
public static final String TESTE = "dataSource2";
-全局变量:
package br.com.cpb.gtf.infra;
public class Globals
private static final ThreadLocal<String> schemaHolder = new ThreadLocal<String>();
public static void setSchema(String schema)
schemaHolder.set(schema);
public static String getSchema()
return schemaHolder.get();
public static void clearCustomerType()
schemaHolder.remove();
-服务:
@RemotingInclude
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public Adm_Usuario logar(Adm_Usuario user)
Globals.clearCustomerType();
Globals.setSchema(SchemaConstants.TESTE);
Adm_UsuarioDao dao = new Adm_UsuarioDao(sessionFactory);
Adm_Usuario admUsuario = dao.logar(user);
setLoggedUserOnSession(admUsuario);
return admUsuario;
【问题讨论】:
您是否阅读了您所指问题的答案? 【参考方案1】:<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
在属性dataSource中,ref应该是routingDS:
<property name="dataSource" ref="routingDS" />
【讨论】:
以上是关于使用带有 Spring 和 Hibernate 的会话工厂处理多个数据库连接的主要内容,如果未能解决你的问题,请参考以下文章
带有注释和(动态)AbstractRoutingDataSource 的 Spring 3.1.3 + Hibernate 配置
Spring 3,带有通用 DAO 的 Hibernate 4 AutoWired sessionFactory
Hibernate 和 Spring Data JPA 无法处理带有特殊字符的 Oracle 表名?
带有注释的 Spring + Hibernate:没有 Hibernate Session 绑定到线程
Spring Boot / Thymeleaf / Hibernate:带有 Java 注解的 Sessionfactory Bean