[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.몇 번의 시도 끝에 나는이 법안에 맞는 솔루션을 발견했습니다.
몇 번의 시도 끝에 나는이 법안에 맞는 솔루션을 발견했습니다.
우선 이것을 살펴보십시오 : 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.이것은 Hibernate Shards의 유스 케이스 일 수있다. 우리는 1 년 전 평가를 시작했지만 갑자기 모든 샤딩이 필요하지 않았기 때문에 그것을 떨어 뜨렸습니다. 그래서 나는 그것으로 어떤 실제 경험도 제공 할 수는 없지만, 그럴 가치가 있다고 생각합니다.
이것은 Hibernate Shards의 유스 케이스 일 수있다. 우리는 1 년 전 평가를 시작했지만 갑자기 모든 샤딩이 필요하지 않았기 때문에 그것을 떨어 뜨렸습니다. 그래서 나는 그것으로 어떤 실제 경험도 제공 할 수는 없지만, 그럴 가치가 있다고 생각합니다.
-
==============================
3.Hibernate Shard는 여전히 진화 중입니다. HQL이 필요하다면 작동하지 않을 것입니다. 따라서 조건 쿼리로 도망 갈 수 있다면 괜찮을 것입니다.
Hibernate Shard는 여전히 진화 중입니다. HQL이 필요하다면 작동하지 않을 것입니다. 따라서 조건 쿼리로 도망 갈 수 있다면 괜찮을 것입니다.
from https://stackoverflow.com/questions/8402835/reading-from-multiple-dbs-with-same-persistence-unit by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] spring.handlers 및 spring.schemas에 대한 이해가 필요합니다. (0) | 2019.01.13 |
---|---|
[SPRING] application.properties에서 정적 변수에 값을 할당하는 방법은 무엇입니까? (0) | 2019.01.13 |
[SPRING] jackson2 봄 3.2RC1에서 JodaTime의 JSON ISO 8601 날짜 (0) | 2019.01.13 |
[SPRING] spring mvc에는 브라우저에 직접 출력 할 response.write가 있습니까? (0) | 2019.01.13 |
[SPRING] Spring 보안 이동 Java Config에는 authentication-success-handler-ref는 어디로 이동합니까? (0) | 2019.01.13 |