使用相同的持久性单元从多个Db读取数据? [英] Reading from multiple Db's with same Persistence Unit?

查看:68
本文介绍了使用相同的持久性单元从多个Db读取数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要一些帮助来使用相同的持久性单元来配置多个连接到多个数据库。

它们都具有相同的模式。因此,我想要使用相同的持久性单元/ DAO的等,不想要设置10个EntityManagers,10个持久性xml等。有没有办法做到这一点?这是我目前的配置:

lockquote

 < persistence-unit name =PersistenceUnit-c1transaction型= RESOURCE_LOCAL > 
<属性>
< property name =hibernate.show_sqlvalue =$ {hibernate-show-sql}/>
< property name =hibernate.dialectvalue =org.hibernate.dialect.SybaseDialect/>
< property name =hibernate.c3p0.min_sizevalue =$ {hibernate-c3p0-min-size}/>
< property name =hibernate.c3p0.max_sizevalue =$ {hibernate-c3p0-max-size}/>
< property name =hibernate.c3p0.timeoutvalue =$ {hibernate-c3p0-timeout}/>
< property name =hibernate.c3p0.max_statementsvalue =$ {hibernate-c3p0-max-statements}/>
< property name =hibernate.c3p0.idle_test_periodvalue =$ {hibernate-c3p0-idle-test-periods}/>
< / properties>




 < class> com.domain.TktOrder< /类> 
< exclude-unlisted-classes />
< / persistence-unit>

我也使用Spring / hibernate来设置我的上下文:

 < bean id =EntityManagerFactory
class =org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
p:persistenceUnitName =PersistenceUnit -c1
p:dataSource-ref =DataSource>
< property name =persistenceXmlLocationvalue =classpath:META-INF / persistence.xml/>
< property name =jpaVendorAdapter>
< bean class =org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter
p:showSql =$ {hibernate-show-sql}
p:generateDdl =false
p:databasePlatform =org.hibernate.dialect.SybaseDialect/>
< / property>
< property name =loadTimeWeaver>
< bean class =org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver/>
< / property>
< / bean>

< bean id =DataSource
class =com.mchange.v2.c3p0.ComboPooledDataSourcedestroy-method =close
p:driverClass =net。 sourceforge.jtds.jdbc.Driver
p:jdbcUrl =jdbc:jtds:sybase://url.net:port; DatabaseName = db_1
p:user =user
p:password =密码
/>

最后我用:

<$ p $
$ {
this.entityManager = entityManager;}
public void setEntityManager(EntityManager entityManager)
{
this.entityManager = entityManager;




$ p
$ b $ p

将我的EntityManager注入到我的DAO中



如何扩展此模型以便能够使用db1,然后更改数据源并再次执行db2等?

多感谢任何帮助提前!

解决方案

经过几次尝试,我找到了一个似乎符合法案的解决方案。 p>

请首先看看这个: dynamic-datasource-routing

这将使用一些您需要的自定义类和关键类是AbstractRoutingDataSource。



这样重新配置我的数据源bean,如下所示:

 < bean id =dataSourceclass =com.domain.etc.etc.recon.utils.RoutingDataSource> 
< property name =targetDataSources>
< map key-type =com.domain.etc.etc.recon.utils.DbType>
< entry key =C1value-ref =C1/>
< entry key =C2value-ref =C2/>
< / map>
< / property>
< property name =defaultTargetDataSourceref =C3/>
< / bean>

其中连接一个C1,C2如下所示:

 < bean id =parentDataSourceclass =org.springframework.jdbc.datasource.DriverManagerDataSource
abstract =true>
< property name =driverClassNamevalue =net.sourceforge.jtds.jdbc.Driver/>
< property name =usernamevalue =*******/>
< property name =passwordvalue =*******/>
< / bean>

< bean id =C1parent =parentDataSource>
value =jdbc:jtds:sybase:// URL:PORT; DatabaseName = dbname/>
< / bean>

< bean id =C2parent =parentDataSource>
< property name =url
value =jdbc:jtds:sybase:// URL:PORT; DatabaseName = dbname2/>
< / bean>

< bean id =C3parent =parentDataSource>
value =jdbc:jtds:sybase:// URL:PORT; DatabaseName = dbname3/>
< / bean>

你可以像在原始问题中那样将它注入到EntityManager中;

 < bean id =EntityManagerFactory
class =org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
p:persistenceUnitName = PersistenceUnit
p:dataSource-ref =dataSource>
< property name =persistenceXmlLocationvalue =classpath:META-INF / persistence-.xml/>
< property name =jpaVendorAdapter>
< bean class =org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter
p:showSql =$ {hibernate-show-sql}
p:generateDdl =false
p:databasePlatform =org.hibernate.dialect.SybaseDialect/>
< / property>
< property name =loadTimeWeaver>
< bean class =org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver/>
< / property>
< / bean>

之后,您需要在上面的链接中使用您自己的java类实现,以便能够在数据源之间切换。这只不过是将这些类重新命名为更具意义的类。将Enum链接到C1,C2,C3等,并最终指向自己的dao来完成这项工作。



祝你好运!


I need some help to configure several connection's to multiple db's using the same Persistence unit.

They all have the same schema. Therefore I want to use the same Persistence unit/ DAO's etc and dont want to have to setup 10 EntityManagers, 10 Persistence xml's etc. Is there a way to do this? Here is my current config:

  <persistence-unit name="PersistenceUnit-c1" transaction-type="RESOURCE_LOCAL">
        <properties>
            <property name="hibernate.show_sql" value="${hibernate-show-sql}"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SybaseDialect" />
            <property name="hibernate.c3p0.min_size" value="${hibernate-c3p0-min-size}" />
            <property name="hibernate.c3p0.max_size" value="${hibernate-c3p0-max-size}" />
            <property name="hibernate.c3p0.timeout" value="${hibernate-c3p0-timeout}" />
            <property name="hibernate.c3p0.max_statements" value="${hibernate-c3p0-max-statements}" />
            <property name="hibernate.c3p0.idle_test_period" value="${hibernate-c3p0-idle-test-periods}" />     
        </properties>

        <class>com.domain.TktOrder</class>
        <exclude-unlisted-classes/>
    </persistence-unit>

I am also using Spring/hibernate to set up my context:

    <bean id="EntityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:persistenceUnitName="PersistenceUnit-c1" 
    p:dataSource-ref="DataSource">
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
            p:showSql="${hibernate-show-sql}" 
            p:generateDdl="false" 
            p:databasePlatform="org.hibernate.dialect.SybaseDialect" />
    </property>
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
</bean>

<bean id="DataSource" 
    class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" 
    p:driverClass="net.sourceforge.jtds.jdbc.Driver"
    p:jdbcUrl="jdbc:jtds:sybase://url.net:port;DatabaseName=db_1"
    p:user="user" 
    p:password="password"
    />

and finally I use:

@PersistenceContext(unitName="PersistenceUnit-c1")
public void setEntityManager(EntityManager entityManager)
{
    this.entityManager = entityManager;     

}

to inject my EntityManager into my DAO

How can I extend this model to be able to use db1 then change the data source and execute again for db2 etc?

Many thanks for any help in advance!

解决方案

After a few attempts I have found a solution that seems to fit the bill.

Please first have a look at this: dynamic-datasource-routing

This uses a few custom classes which you will need and the key class is AbstractRoutingDataSource.

This reconfigures my datasource bean like so:

    <bean id="dataSource" class="com.domain.etc.etc.recon.utils.RoutingDataSource">
    <property name="targetDataSources">
        <map key-type="com.domain.etc.etc.recon.utils.DbType">
            <entry key="C1" value-ref="C1" />
            <entry key="C2" value-ref="C2" />
        </map>
    </property>
    <property name="defaultTargetDataSource" ref="C3" />
</bean>

Where Connection one C1, C2 look like:

    <bean id="parentDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    abstract="true">
    <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver" />
    <property name="username" value="*******" />
    <property name="password" value="*******" />
</bean>

<bean id="C1" parent="parentDataSource">
    <property name="url" 
        value="jdbc:jtds:sybase://URL:PORT;DatabaseName=dbname" />
</bean>

<bean id="C2" parent="parentDataSource">
    <property name="url"
        value="jdbc:jtds:sybase://URL:PORT;DatabaseName=dbname2" />
</bean>

<bean id="C3" parent="parentDataSource">
    <property name="url"
        value="jdbc:jtds:sybase://URL:PORT;DatabaseName=dbname3" />
</bean>

you can inject this into the EntityManager as I have in the original Question;

    <bean id="EntityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:persistenceUnitName="PersistenceUnit" 
    p:dataSource-ref="dataSource">
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-.xml" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
            p:showSql="${hibernate-show-sql}" 
            p:generateDdl="false" 
            p:databasePlatform="org.hibernate.dialect.SybaseDialect" />
    </property>
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
</bean>

After this you need to use your own implementation of the java classes in the link above to be able to switch between data sources. This is nothing more than renaming the classes to ones that are more meaning full to you. Linking the Enum up to C1,C2,C3 etc and finally pointing to your own dao to carry out the work.

Good Luck!

这篇关于使用相同的持久性单元从多个Db读取数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆