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

SunFrankly 发布于 2011/07/01 20:42
阅读 17K+
收藏 10

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

项目中使用了两个数据源 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?

加载中
0
SunFrankly
SunFrankly
过了这么长时间了 咋没人回呢?是不是太简单了?红薯大哥帮帮忙
0
weir2008
weir2008
我也一直在搞这个问题,好像在网上还没有人能给出满意的答案。
0
铂金小鬼
铂金小鬼

我在一个工程中用的是oracle和mysql,以下配置,现在还没有碰到问题:

<?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>

SunFrankly
SunFrankly
谢谢你的回复, 我之前的项目也用过这种形式,这是用的Hibernate的SessionFactory管理事务,没有用到Jpa,用JPA的时候,无法配置多个EntityManagerFactory的,配置两个就会报错:No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 2
0
铂金小鬼
铂金小鬼

注入的时候用 @Resource指定名称嘛:

@Resource(name="sessionFactory2")

private SessionFactory factory;

weir2008
weir2008
每个数据源都能CRUD呢?
0
铂金小鬼
weir2008
weir2008
你说的是hibernate,jpa这样确实不行,我曾做了好多测试,都是只能一个数据源CRUD,其他都只能查询。所以一直郁闷中。
0
SunFrankly
SunFrankly
问题已经解决了。感谢大家的回复,解决方案: http://my.oschina.net/frankly/blog/27702
0
hantsy
hantsy
配置数据源很简单的,事务统一才是关键。
0
hantsy
hantsy
楼主还自问自答,根本不明白什么是事务。
SunFrankly
SunFrankly
谢谢!您是说的一个事务管理器(transaction manager) + 一个或多个资源管理器(resource manager)? 在问题补充上我已经注明: 我不用JTA(已经被我删了) 项目情景: 1.只对一个数据库进行CRUD,另外一个数据库只进行读取 2.所要读取的数据,几乎是不变的(例如:项目中的某一时刻的外界温湿度、仓内的温湿度等) 不知是不是误解您的意思了?还是我真的不懂事务?请指教...还是非常感谢 当然,在这个项目中,直接操作数据只是一种方式,还有其他的方式,比如:采用RestFul风格,由目标程序给我提供所需要的数据接口(json数据或xml)。
0
SunFrankly
SunFrankly
非常抱歉,由于没有考虑到其他的应用场景,就把自己的答案设为最佳( )。比如所有的持久化操作需要在同一个事务 管理 器中 ,@hantsy给出了一个好的解决方案(spring+hibernate+jotm),大家可以参考下。
返回顶部
顶部