开发者社区 问答 正文

spring3+hibernate3(jpa) 如何配置多个数据源?(bean的配置管理是基于注解)

如题 ,诚恳的请求各位高手帮忙解答下,(可能是个很简单的问题)

项目中使用了两个数据源 mysql 和 postgre

以前的项目只是连接一个数据源,applicationContext.xml 的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <!--定义数据源,使用dbcp连接池-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
       <property name="driverClassName" value="..."/>
       <property name="url" value="..."/>
       <property name="username" value="..."/>
       <property name="password" value="..."/>
        <property name="initialSize" value="1"/>
        <property name="maxActive" value="100"/>
        <property name="maxIdle" value="8"/>
        <property name="minIdle" value="1"/>
    </bean>
    
    <!-- 集成Spring 和 jpa(底层是hibernate) -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
       <property name="dataSource" ref="dataSource"/>
        <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
        <property name="persistenceUnitName" value="postgre" />
        <property name="loadTimeWeaver">
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
        </property>
    </bean>
     
    <!-- 使用spring(jpa)的事物管理服务 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
    <!-- 指定事物声明的配置方式:使用注解的方式 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

现在再增加一个数据源怎么配置啊? 如果按照上面的方法再配置一个dataSource的话,EntityManagerFactory只允许有一个(再增加一个就会报错)。

如何配置,请赐教。另外,如果配置好的话,使用@Transactional的时候,如何区分是当前使用的是哪个EntityManager?

展开
收起
a123456678 2016-03-12 18:19:03 3229 分享 版权
1 条回答
写回答
取消 提交回答
  • <?xml version="1.0" encoding="UTF-8"?>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
    
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
           xmlns:tx="http://www.springframework.org/schema/tx"
    
           xmlns:context="http://www.springframework.org/schema/context"
    
           
    
           xsi:schemaLocation="http://www.springframework.org/schema/beans
    
               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    
               http://www.springframework.org/schema/tx 
    
               http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    
               http://www.springframework.org/schema/context 
    
        http://www.springframework.org/schema/context/spring-context-3.0.xsd ">
    
     
    
        <context:component-scan base-package="tss.vpdn.hdle"/>
    
     
    
        <bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    
            <property name="driverClass" value="oracle.jdbc.OracleDriver"/>
    
            <property name="jdbcUrl" value="jdbc:oracle:thin:@171.32.5.103:1521:ora10g"/>
    
            <property name="user" value="csnms"/>
    
            <property name="password" value="sbsbsb"/>
    
            <property name="initialPoolSize" value="1"/>
    
            <property name="minPoolSize" value="1"/>
    
            <property name="maxPoolSize" value="3"/>
    
            <property name="maxIdleTime" value="60"/>
    
            <property name="acquireIncrement" value="3"/>
    
            <property name="idleConnectionTestPeriod" value="60"/>
    
        </bean>
    
     
    
        <bean id="sessionFactory2" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    
            <property name="dataSource" ref="dataSource2"/>
    
            <property name="packagesToScan" value="tss.vpdn.model"/>
    
            <property name="hibernateProperties">
    
                <value>
    
                    hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
    
                    hibernate.hbm2ddl.auto=none
    
                    hibernate.show_sql=true
    
                    hibernate.format_sql=false
    
                </value>
    
            </property>
    
        </bean>
    
        
    
        <bean id="txManager2" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    
            <property name="sessionFactory" ref="sessionFactory2"/>
    
        </bean>
    
        
    
        <tx:annotation-driven transaction-manager="txManager2"/>
    
     
    
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    
            <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    
            <property name="jdbcUrl" value="jdbc:mysql://112.231.65.133:3306/sdvpdn?useUnicode=true&amp;characterEncoding=UTF-8"/>
    
            <property name="user" value="root"/>
    
            <property name="password" value="sbsbsb"/>
    
            <property name="initialPoolSize" value="1"/>
    
            <property name="minPoolSize" value="1"/>
    
            <property name="maxPoolSize" value="30"/>
    
            <property name="maxIdleTime" value="60"/>
    
            <property name="acquireIncrement" value="3"/>
    
            <property name="idleConnectionTestPeriod" value="60"/>
    
        </bean>
    
     
    
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    
            <property name="dataSource" ref="dataSource"/>
    
            <property name="packagesToScan" value="tss.vpdn.model"/>
    
            <property name="hibernateProperties">
    
                <value>
    
                    hibernate.dialect=org.hibernate.dialect.MySQLMyISAMDialect
    
                    hibernate.hbm2ddl.auto=none
    
                    hibernate.show_sql=true
    
                    hibernate.format_sql=false
    
                </value>
    
            </property>
    
        </bean>
    
        
    
        <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    
            <property name="sessionFactory" ref="sessionFactory"/>
    
        </bean>
    
        
    
        <tx:annotation-driven transaction-manager="txManager"/>
    
    </beans>
    2019-07-17 19:01:21
    赞同 展开评论