【问题标题】:What is the common solution for multiple datasources?多数据源的常见解决方案是什么?
【发布时间】:2011-06-11 00:25:37
【问题描述】:

大家好 在我的 Spring 应用程序中,我需要将 hibernate 与两个不同的数据库(PostgreSQL 和 MySQL)一起使用,而且我的配置不太好,所以我需要一些关于如何操作的指南

我正在为 hibernate-postgresql 使用以下配置

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.project.domain.myDomain</value>
            </list>

        </property>

        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
            </value>
        </property>


    </bean>


    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName" value="org.postgresql.Driver" />

        <property name="url">
        <value>${db.url}</value> 
        </property>

        <property name="username" > 
        <value>${db.username}</value>
        </property>

        <property name="password">  
        <value>${db.password}</value>
        </property>

    </bean>

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean
        class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

在 DAO 中,我为 sessionFactory 进行了自动装配。

【问题讨论】:

  • 您需要在两个数据库中持久化同一个实体,还是需要从一个数据库中获取一些实体,而从另一个数据库中获取一些实体?比如,“Person”在 MySQL 上,而“Order”在 PostgreSQL 上?
  • 第二种方式,mysql中的一些实体和postgresql中的其他实体
  • 您需要在单个事务中对两个数据库进行更改,还是不需要?
  • 不,我不需要,每个数据库都需要单独的事务。
  • 你能帮我解决配置问题吗stackoverflow.com/questions/4724633/…

标签: hibernate spring spring-mvc


【解决方案1】:

唯一的方法是让数据源拥有一个堆栈(SessionFactory、Hibernate Template 等)。然后你可以注入你想在你的业务类中使用的 HIbernate Tempolate(或者如果你想同时访问两个数据库)。

这是一个带有显式配置的示例 DAO ...

<bean id="db2SessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
...
</bean>

<bean id="db1Dao" class="ch.sbb.uno.dao.hibernate.UnoHibernateDaoSupport" scope="prototype">
    <property name="sessionFactory" ref="db1SessionFactory" />  
</bean>

<bean id="db2Dao" class="ch.sbb.uno.dao.hibernate.UnoHibernateDaoSupport" scope="prototype">
    <property name="sessionFactory" ref="db2SessionFactory" />  
</bean>

【讨论】:

  • 所以每个数据源都将拥有自己的 sessionFactroy 和自己的休眠模板,或者它们都将使用同一个?
  • 但是这种情况下如何进行自动装配,这种方法有什么缺点吗?
  • 是的,当处理多个相同类型的 bean 时,您不能再使用按类型自动装配。尝试显式注入
  • 使用@Qualifier 注解并按名称连线。
  • 谢谢大家,我尝试了配置,但我卡在这里stackoverflow.com/questions/4724633/…
【解决方案2】:

如果您有两个数据库,并且想要两阶段提交,最好确保两者都使用 XA 驱动程序。

【讨论】:

【解决方案3】:

您可能需要 XA 驱动程序。

请看下面的例子

http://docs.codehaus.org/display/BTM/Home

【讨论】:

    猜你喜欢
    • 2011-04-06
    • 2018-04-02
    • 2013-07-03
    • 2019-03-09
    • 2014-09-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多