Spring Legacy JPA multi-DB 연동~!

44207 단어 Multi-DBSpringJPAJPA

일에 적응한다고 잊혀진 나의 벨로그. 이제부터라도 조금씩 글을 써나가 본다.

일을 하다 보니 DB를 두개 연동해야할 때가 있었다.
Spring Legacy에서 DB연동을 하는데 하루 종일 걸렸다.
다음에 다시 하게되면 오늘 같이 시간낭비를 하지 않을 것이다.

1. Persistance.xml파일 설정

#1. Main DB Persistance.xml
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
		     	         http://java.sun.com/xml/ns/persistence/persistence.xsd">

	<persistence-unit name="MainDB" transaction-type="RESOURCE_LOCAL">
		<description>Persistence Unit</description>
		<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        ## Main DB와 연결된 class
		<class>com.main.db1.MainDB</class>
		<properties>
			<property name="hibernate.archive.autodetection" value="class" />
		</properties>
	</persistence-unit>
</persistence>

#2. Sub DB Persistance.xml
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
		 		 http://java.sun.com/xml/ns/persistence/persistence.xsd">

	<persistence-unit name="subDB">
		<description>Persistence Unit</description>
		<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        ## Sub DB와 연결된 class 
		<class>com.cogeni.main.db2.SubDB</class>
		<properties>
			<property name="hibernate.archive.autodetection" value="class" />
		</properties>
	</persistence-unit>
</persistence>

참고: persistance.xml에 persistence-unit name을 정의해야한다.

2. EntityManager Bean 설정

사용할 DataSource를 두번 입력한다.

<?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:aop="http://www.springframework.org/schema/aop"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
						   http://www.springframework.org/schema/beans/spring-beans.xsd
						   http://www.springframework.org/schema/tx
						   http://www.springframework.org/schema/tx/spring-tx.xsd
						   http://www.springframework.org/schema/aop
						   http://www.springframework.org/schema/aop/spring-aop.xsd">

	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

	<!-- EntityManagerSetting -->
        <!-- MainDB-->
	<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="persistenceXmlLocation" value="classpath:inote-data-persistence.xml" />
		<property name="persistenceUnitName" value="MainDB" />
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.current_session_context_class">thread</prop>
				<prop key="hibernate.jdbc.use_streams_for_binary">false</prop>
				<prop key="hibernate.cache.use_second_level_cache">false</prop>
			</props>
		</property>
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="generateDdl"><value>${hibernate.generate.ddl}</value></property>
				<property name="showSql"><value>false</value></property>
			</bean>
		</property>
		<property name="loadTimeWeaver">
			<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
		</property>
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="emf" />
	</bean>

	<!-- Sub DB -->
	<bean id="emfOracle" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSourceOracle" />
		<property name="persistenceXmlLocation" value="classpath:sub-data-persistence.xml" />
		<property name="persistenceUnitName" value="subDB" />
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
				<prop key="hibernate.current_session_context_class">thread</prop>
				<prop key="hibernate.jdbc.use_streams_for_binary">false</prop>
				<prop key="hibernate.cache.use_second_level_cache">false</prop>
			</props>
		</property>
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="generateDdl"><value>true</value></property>
				<property name="showSql"><value>false</value></property>
			</bean>
		</property>
		<property name="loadTimeWeaver">
			<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
		</property>
	</bean>

	<bean id="transactionManagerOra" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="emfOracle" />
	</bean>


	<!-- Main DB-->
	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost/databaseName" />
		<property name="username" value=""/>
		<property name="password" value=""/>
		<property name="maxTotal" value="" />
		<property name="maxIdle" value="" />
		<property name="validationQuery" value="" />
		<property name="testOnBorrow" value="" />
	</bean>

	<!-- Sub DB -->
	<bean id="dataSourceOracle" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
		<property name="username" value=""/>
		<property name="password" value=""/>
		<property name="maxTotal" value="" />
		<property name="maxIdle" value="" />
		<property name="validationQuery" value="" />
		<property name="testOnBorrow" value="" />
	</bean>

</beans>

3. Code

// MainDB


// SubDB

참고 링크

좋은 웹페이지 즐겨찾기