多个数据源的常见解决方案是什么?

时间:2011-01-18 10:36:31

标签: hibernate spring spring-mvc

祝福所有人 在我的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做了一个自动装配。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

唯一的方法是拥有一个堆栈的数据源(SessionFactory,Hibernate Template等)。然后,您可以在业务类中注入要使用的HIbernate Tempolate(如果要同时访问这两个DB,则可以注入两者)。

这是一个带有显式配置的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>

答案 2 :(得分:0)

您可能需要XA驱动程序。

见下面的例子

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