복붙노트

[SPRING] 동일한 지속성 단위로 여러 Db를 읽는 중입니까?

SPRING

동일한 지속성 단위로 여러 Db를 읽는 중입니까?

같은 Persistence 유닛을 사용하는 여러 DB에 대해 여러 연결을 구성하는 데 도움이 필요합니다.

그것들은 모두 같은 스키마를 가지고 있습니다. 따라서 동일한 Persistence unit / DAO 등을 사용하고 싶습니다. 10 개의 EntityManagers, 10 개의 Persistence XML 등을 설정해야합니다.이 작업을 수행 할 수있는 방법이 있습니까? 다음은 현재 설정입니다.

        <class>com.domain.TktOrder</class>
        <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="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"
    />

그리고 마침내 나는 다음을 사용한다.

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

}

내 DAO에 EntityManager 삽입하기

이 모델을 확장하여 db1을 사용하고 데이터 소스를 변경하고 db2 등을 다시 실행할 수있게하려면 어떻게해야합니까?

사전에 많은 도움을 주셔서 감사합니다!

해결법

  1. ==============================

    1.몇 번의 시도 끝에 나는이 법안에 맞는 솔루션을 발견했습니다.

    몇 번의 시도 끝에 나는이 법안에 맞는 솔루션을 발견했습니다.

    우선 이것을 살펴보십시오 : dynamic-datasource-routing

    여기에는 필요한 몇 가지 사용자 정의 클래스가 사용되며 키 클래스는 AbstractRoutingDataSource입니다.

    이렇게하면 다음과 같이 데이터 소스 빈을 재구성한다.

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

    연결 C1, C2는 다음과 같습니다.

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

    당신은 EntityManager에 이것을 주입 할 수 있습니다.

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

    데이터 소스 간을 전환하려면 위의 링크에서 Java 클래스의 자체 구현을 사용해야한다. 이것은 당신에게 더 의미있는 의미의 수업으로 이름을 바꾸는 것 이상입니다. 열거를 C1, C2, C3 등등과 연결하고 마지막으로 일을 수행하기 위하여 당신의 자신의 DAO를 가르키십시오.

    행운을 빕니다!

  2. ==============================

    2.이것은 Hibernate Shards의 유스 케이스 일 수있다. 우리는 1 년 전 평가를 시작했지만 갑자기 모든 샤딩이 필요하지 않았기 때문에 그것을 떨어 뜨렸습니다. 그래서 나는 그것으로 어떤 실제 경험도 제공 할 수는 없지만, 그럴 가치가 있다고 생각합니다.

    이것은 Hibernate Shards의 유스 케이스 일 수있다. 우리는 1 년 전 평가를 시작했지만 갑자기 모든 샤딩이 필요하지 않았기 때문에 그것을 떨어 뜨렸습니다. 그래서 나는 그것으로 어떤 실제 경험도 제공 할 수는 없지만, 그럴 가치가 있다고 생각합니다.

  3. ==============================

    3.Hibernate Shard는 여전히 진화 중입니다. HQL이 필요하다면 작동하지 않을 것입니다. 따라서 조건 쿼리로 도망 갈 수 있다면 괜찮을 것입니다.

    Hibernate Shard는 여전히 진화 중입니다. HQL이 필요하다면 작동하지 않을 것입니다. 따라서 조건 쿼리로 도망 갈 수 있다면 괜찮을 것입니다.

  4. from https://stackoverflow.com/questions/8402835/reading-from-multiple-dbs-with-same-persistence-unit by cc-by-sa and MIT license