如何在 Spring 和 Hibernate 中使用两个数据库/数据源

Posted

技术标签:

【中文标题】如何在 Spring 和 Hibernate 中使用两个数据库/数据源【英文标题】:How to use two databases/datasources in Spring and Hibernate 【发布时间】:2012-10-16 00:11:06 【问题描述】:

我需要在我的独立应用程序中使用两个数据库,一个是本地 HSQLDB,另一个是远程 mysql。我使用 Spring 3.1.2,Hibernate 4.1.7。到目前为止,我设法只使用 HSQLDB,这就是我的 DAO 和配置的样子:

@Transactional
public abstract class HibernateDao<T, ID extends Serializable> implements Dao<T, ID>

SessionFactory sessionFactoryHSQL;


public void setSessionFactoryHSQL(SessionFactory sessionFactory) 
    this.sessionFactoryHSQL = sessionFactory;


public ID save(T object) 
    return (ID) getCurrentSession().save(object);


public void persist(T object)
    getCurrentSession().persist(object);


public void update(T object) 
    getCurrentSession().update(object);


public void delete(T object) 
    getCurrentSession().delete(object);


public List<T> find(String query) 
    return getCurrentSession().createQuery(query).list();


public Session getCurrentSession()
    return sessionFactoryHSQL.getCurrentSession();




<bean id="sessionFactoryHSQL" 
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

    <property name="dataSource">
      <ref bean="dataSourceHSQL"/>
    </property>

    <property name="hibernateProperties">
       <props>
         <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
         <prop key="hibernate.show_sql">true</prop>
         <prop key="hibernate.hbm2ddl.auto">update</prop>
       </props>
    </property>

    <property name="annotatedClasses">
    <list>
        //annotated classes
    </list>
    </property>
    </bean>

<bean id="txManager" class=
    "org.springframework.orm.hibernate4.HibernateTransactionManager">
   <property name="sessionFactory" ref="sessionFactoryHSQL" />
</bean>
<tx:annotation-driven transaction-manager="txManagerHSQL" />

<bean id="configHSQL"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>properties/HSQL.properties</value>
    </property>
</bean>

<bean id="dataSourceHSQL" 
         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="$jdbc.driverClassName" />
    <property name="url" value="$jdbc.url" />
    <property name="username" value="$jdbc.username" />
    <property name="password" value="$jdbc.password" />
</bean>

我为 MySQL 创建了单独的 bean,例如 sessionFactoryMySQL、dataSourceMySQL(我不打算粘贴它们的实现,因为它们与 HSQL 几乎相同)。我设法正确地将 sessionFactoryMySQL 注入 DAO,但我不能同时使用两个 sessionFactory,例如我不能执行以下操作:

public void persist(T object) 
    sessionFactoryHSQL.getCurrentSession().persist(object);
    sessionFactoryMySQL.getCurrentSession().persist(object);

正如我已经发现的那样,它与事务有关,但我无法正确配置事务管理器。我一直在寻找解决方案,但示例或教程要么不清楚,要么没有提到我的案例。

【问题讨论】:

听起来您正在尝试进行两阶段提交?您的应用程序是否要求 HSQL 和 MySQL 一起持久调用提交/回滚,或者 MySQL 可以回滚但 HSQL 可以提交?知道这将有助于重组你的 dao 的设计 持久化、保存、更新、删除等操作必须同时命中两个数据库,因为它们之间的数据必须同步。在 select 语句的情况下,首先应该是 MySQL,但如果互联网连接断开,则 select 应该转到本地 HSQL。 相信Spring的事务管理器只能绑定一个数据库。您可能需要 2 个事务管理器 bean,一个用于 MySQL,一个用于 HSQL,并在持久/更新/删除方法中使用显式事务,而不是在类级别使用 @Transaction 注释。 也许看看这个相关的问题? ***.com/questions/8271950/… 【参考方案1】:

您需要为两个数据库创建两个会话工厂。 检查简单的分步示例:Two Datasource in Spring/Hiberate

【讨论】:

以上是关于如何在 Spring 和 Hibernate 中使用两个数据库/数据源的主要内容,如果未能解决你的问题,请参考以下文章

在 Hibernate 和 Spring 之间集成时如何插入日期类型

如何在当前使用 HSQLDB 的 Spring 和 Hibernate 后台使用 MySQL

在Spring中使用Hibernate 4

使用 spring 和 hibernate 时,如何处理会话/事务?

如何在 Spring 和 Hibernate 中使用两个数据库/数据源

如何让 Spring JPA、Hibernate 和 OSGi 发挥出色?