最近因项目原因需要把 保存本地数据库的同时保存到其他数据库中, 这里就需要用到多数据源的技术。下面贴上各个配置文件的代码。

persistence.xml

            

	<!-- 指定本地数据库持久化单元名称和事务类型,其他在Spring中配置 -->
	<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"/>
	 <!-- 指定远程数据库持久化单元名称和事务类型,其他在Spring中配置 -->
	<persistence-unit name="remoteUnit" transaction-type="RESOURCE_LOCAL"/>


applicationContext.xml 

                    

   <!-- 本地数据源 C3PO -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" lazy-init="true">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxIdleTime" value="${jdbc.maxIdleTime}"/>
        <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/>
    </bean>
    
    <!-- 
        定义实体管理器工厂,提供注解注入,使用方法如下:
        @PersistenceContext
        private EntityManager entityManager;
    -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="persistenceXmlLocation" value="classpath:persistence.xml"/>
        <property name="persistenceUnitName" value="persistenceUnit"/>
        <property name="jpaDialect">
            <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
        </property>
        <property name="jpaVendorAdapter">
            <!-- jpa持久化实现厂商,这里为hibernate -->
            <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
                <!-- 自动输出schema创建DDL语句 -->
                <property name="generateDdl" value="true"/>
                <property name="database" value="MYSQL"/>
                <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
                <property name="showSql" value="false"/>
            </bean>
        </property>
        <property name="packagesToScan">
            <list>
                <value>com.fpi.safety.common.entity.po</value>
            </list>
        </property>
        <property name="jpaPropertyMap">
            <map>
                <!-- To enable Hibernate's second level cache and query cache settings -->  
                <entry key="hibernate.max_fetch_depth" value="4" />
                <entry key="hibernate.cache.use_second_level_cache" value="true" />
                <entry key="hibernate.cache.use_query_cache" value="true" />
                <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
            </map> 
        </property>
    </bean>
    
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    
      <!-- 对标注@Transactional注解的Bean进行加工处理,以织入事务管理切面 -->
    <tx:annotation-driven transaction-manager="transactionManager" />
    
    <!-- 远程数据源 C3PO -->
    <bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" lazy-init="true">
    	<property name="driverClass" value="${jdbc2.driver}"/>
        <property name="jdbcUrl" value="${jdbc2.url}"/>
        <property name="user" value="${jdbc2.username}"/>
        <property name="password" value="${jdbc2.password}"/>
        <property name="maxIdleTime" value="${jdbc2.maxIdleTime}"/>
        <property name="idleConnectionTestPeriod" value="${jdbc2.idleConnectionTestPeriod}"/>
    </bean>
    
    <bean id="entityManagerFactory2"   class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceXmlLocation" value="classpath:persistence.xml"/>
        <property name="persistenceUnitName" value="remoteUnit" />
        <property name="dataSource" ref="dataSource2" />
        <property name="jpaVendorAdapter">
            <bean
                class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="database" value="MYSQL" />
                <property name="showSql" value="true" />
            </bean>
        </property>
        <property name="jpaPropertyMap">
            <map>
                <!-- To enable Hibernate's second level cache and query cache settings -->  
                <entry key="hibernate.max_fetch_depth" value="4" />
                <entry key="hibernate.cache.use_second_level_cache" value="true" />
                <entry key="hibernate.cache.use_query_cache" value="true" />
                <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
            </map>
        </property>
    </bean>
    
 <!--    配置事务管理器 -->
    <bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory2" />
        <qualifier value="remoteTran"/>
    </bean>
     <tx:annotation-driven transaction-manager="transactionManager2" />

serviceImpl.java 

    

	public EntityManager entityManager;
	 
	 private EntityManagerFactory emf;
	 
	 /**
	 * @Title:setEntityManagerFactory
	 * @Description:远程数据库实体管理工厂
	 * @param emf
	 */
	 @Transactional(value="remoteUnit")
	 @PersistenceUnit(unitName="remoteUnit")
	 public void setEntityManagerFactory(EntityManagerFactory emf) {
		 this.emf = emf;
		 this.entityManager = emf.createEntityManager();
	 }
	
	
	/*远程数据库保存操作*/
	@Override
	public DevFactor remoteSaveOrUpdate(DevFactor devFactor) {
		entityManager.getTransaction().begin();
		entityManager.merge(devFactor);
		entityManager.getTransaction().commit();
		return devFactor;
	}