可以在Spring配置中配置两个DataSource吗?

时间:2014-02-21 07:27:56

标签: spring jpa mybatis

我正在开发一个Web应用程序,我需要两个DataSource来根据我的要求连接两个差异数据库。一个DataSource将使用Spring + JPA框架,另一个DataSource使用Spring + MyBatis框架。

3 个答案:

答案 0 :(得分:1)

是的,您可以建议从spring继续管理,并从applicationContext获取。

<bean class="org.apache.tomcat.jdbc.pool.DataSource" id="dataSource" >
        <property name="driverClassName" value="${database.driverClassName}"/>
        <property name="url" value="${database.url}"/>
        <property name="username" value="${database.username}"/>
        <property name="password" value="${database.password}"/>

   <bean class="org.apache.tomcat.jdbc.pool.DataSource" id="dataSourceOrderDetail" >
        <property name="driverClassName" value="${database.driverClassName}"/>
        <property name="url" value="${database.url.orderdetail}"/>
        <property name="username" value="${database.username}"/>
        <property name="password" value="${database.password}"/>
  </bean>

只需要具有不同的id名称,即可正确注入

检查this以查看如何将spring与ibatis集成,然后使用数据源bean配置bean

或者,如果您想使用datasource-ds.xml,只需将两个datasource xml文件放在应用程序上下文中的lib文件夹中,如果您使用的是jboss或tomcat。

<强>更新

<jpa:repositories base-package="com.staples.sa.pricemart.repository.pag"
    entity-manager-factory-ref="entityManagerFactory" />

<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <qualifier value="pagTransactionManager" />
</bean>

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    id="entityManagerFactory">
    <property name="persistenceUnitName" value="persistenceUnit" />
    <property name="dataSource" ref="dataSource" />
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
</bean>
<jpa:repositories base-package="com.staples.sa.pricemart.repository.orderdetail"
    entity-manager-factory-ref="entityManagerFactoryOrderDetail" />


<bean id="transactionManagerOrderDetail" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactoryOrderDetail" />
    <qualifier value="orderDetailTX" />
</bean>


<bean
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    id="entityManagerFactoryOrderDetail">
    <property name="persistenceUnitName" value="persistenceUnitOrderDetail" />
    <property name="dataSource" ref="dataSourceOrderDetail" />
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
</bean>

<!-- -->

Persistence.xml需要看起来像这样。 (需要完成xml配置)

<persistence-unit name="persistenceUnit"
        transaction-type="RESOURCE_LOCAL">

<!-- Add the persistence context for OrderDetail -->
<persistence-unit name="persistenceUnitOrderDetail"
    transaction-type="RESOURCE_LOCAL">

答案 1 :(得分:1)

以下是您的示例代码

class Main {
  public static void main(String args[]) throws Exception {
    ApplicationContext ac = new ClassPathXmlApplicationContext("context.xml", Main.class);
    DataSource dataSource = (DataSource) ac.getBean("dataSource");
    DataSource mysqlDataSource = (DataSource) ac.getBean("mysqlDataSource");

context.xml中

<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:oracle:thin:@oracle.devcake.co.uk:1521:INTL"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>

<bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://dbhost-prospring-psql/prospring"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>

<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler">
    <property name="nativeJdbcExtractor" ref="nativeJdbcExtractor"/>
</bean>

<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"/>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

答案 2 :(得分:0)

您可以通过声明具有不同id和的数据源bean,在Spring上下文中配置任意数量的数据库 从属性文件中注入适当的属性。如果两个数据库不同,那么您处于分布式事务的区域中,并且必须配置可以使用JTA运行的Spring transaction manager。另外值得注意的是,Spring事务管理器只是一个抽象,它需要有外部JTA事务 管理器配置(如Bitrionix / Atomikos)或者如果在EE应用程序服务器下部署,则可以在JNDI注册表中查找事务管理器。然后,当您标记事务边界(可能使用Spring Transactional注释)时,Spring会自动协调事务。