2011년 6월 15일 수요일

스프링..트랜잭션 어노테이션 분산 DB 처리

<resource>
<data-source>
<database>
<vendor>oracle</vendor>
<export-name>datasource1</export-name>
<data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>
<data-source-type>ConnectionPoolDataSource</data-source-type>
<database-name></database-name>
<data-source-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-name>
<port-number></port-number>
<server-name></server-name>
<user></user>
<password></password>
<driver-type>thin</driver-type>
<connection-pool>
<pooling>
<min>20</min>
<max>30</max>
<step>10</step>
<period>3600000</period>
</pooling>
<wait-free-connection>
<enable-wait>true</enable-wait>
</wait-free-connection>
</connection-pool>
</database>
<database>
<vendor>oracle</vendor>
<export-name>datasource3</export-name>
<data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>
<data-source-type>ConnectionPoolDataSource</data-source-type>
<database-name></database-name>
<data-source-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-name>
<port-number></port-number>
<server-name></server-name>
<user></user>
<password></password>
<driver-type>thin</driver-type>
<connection-pool>
<pooling>
<min>5</min>
<max>10</max>
<step>10</step>
<period>3600000</period>
</pooling>
<wait-free-connection>
<enable-wait>true</enable-wait>
</wait-free-connection>
</connection-pool>
</database>
</data-source>
</resource>

설정후 was jndi
resource>
<data-source>
<database>
<vendor>oracle</vendor>
<export-name>datasource1</export-name>
<data-source-class-name>oracle.jdbc.xa.client.OracleXADataSource</data-source-class-name>
<data-source-type>XADataSource</data-source-type>
<database-name>db명</database-name>
<data-source-name>oracle.jdbc.xa.client.OracleXADataSource</data-source-name>
<port-number>port</port-number>
<server-name>ip</server-name>
<user></user>
<password></password>
<driver-type>thin</driver-type>
<connection-pool>
<pooling>
<min>20</min>
<max>30</max>
<step>10</step>
<period>3600000</period>
</pooling>
<wait-free-connection>
<enable-wait>true</enable-wait>
</wait-free-connection>
</connection-pool>
</database>
<database>
<vendor>oracle</vendor>
<export-name>datasource3</export-name>
<data-source-class-name>oracle.jdbc.xa.client.OracleXADataSource</data-source-class-name>
<data-source-type>XADataSource</data-source-type>
<database-name>db명</database-name>
<data-source-name>oracle.jdbc.xa.client.OracleXADataSource</data-source-name>
<port-number>port</port-number>
<server-name>ip</server-name>
<user></user>
<password></password>
<driver-type>thin</driver-type>
<connection-pool>
<pooling>
<min>5</min>
<max>10</max>
<step>10</step>
<period>3600000</period>
</pooling>
<wait-free-connection>
<enable-wait>true</enable-wait>
</wait-free-connection>
</connection-pool>
</database>
</data-source>

그리고 spring applicationContext.xml 설정입니다.
이부분이 변경 정 설정이구요 ㅎ보라색 부분을 빨간색 부분으로 수정하였어요

<jee:jndi-lookup id="dataSource-totd" jndi-name="jdbc/datasource1" resource-ref="true" />
<jee:jndi-lookup id="dataSource-hris" jndi-name="jdbc/datasource3" resource-ref="true" />
<jee:jndi-lookup id="dataSource-another" jndi-name="jdbc/datasource1" resource-ref="true" />
<!-- dataSource-totd datasource의 transaction 처리를 위한 transactionmanager설정 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource-totd" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager_hris" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource-hris" />
<tx:annotation-driven transaction-manager="transactionManager_hris"/>


<bean id="sqlMapClient-totd"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:sqlMapConfig.xml</value>
</property>
<property name="useTransactionAwareDataSource">
<value>true</value>
</property>
<property name="dataSource">
<ref bean="dataSource-totd" />
</property>
</bean>
<bean id="sqlMapClient-hris"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:sqlMapConfig.xml</value>
</property>
<property name="useTransactionAwareDataSource">
<value>true</value>
</property>
<property name="dataSource">
<ref bean="dataSource-hris" />
</property>
</bean>
<bean id="sqlMapClient-another"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:sqlMapConfig.xml</value>
</property>
<property name="useTransactionAwareDataSource">
<value>true</value>
</property>
<property name="dataSource">
<ref bean="dataSource-another" />
</property>
</bean>

변경후
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
<tx:annotation-driven transaction-manager="transactionManager"/>


이렇게 JtaTransactionManager 를 쓰니까 datasource 를 참조 안시켜도 

- DAO 부분
DAO
@Repository
public class RecruitDAO extends WMBaseDAO {

private static String packageName = "JobInfo.";

@Autowired
@Override
public void setSqlMapClient(@Qualifier("sqlMapClient-hris")SqlMapClient sqlMapClient) {
super.setSqlMapClient(sqlMapClient);
}

public void insertRecruitStep02(HashMap<String, Object> mapParams) throws Exception{
delete(packageName+"deletePhoto",mapParams); // 사진 삭제
insert(packageName+"insertPhoto", mapParams); // 사진 등록

insert(packageName+"insertLGADDRM", mapParams); // 지원자 신상1 정보 등록..
insert(packageName+"insertLGMASTM", mapParams); // 지원자 신상2
insert(packageName+"insertLGBDSTM", mapParams); // 지원자 신체사항
insert(packageName+"insertLGMILM", mapParams); // 지원자 병력사항

//지원자 가족사항
List<HashMap<String, Object>> famList = (List<HashMap<String, Object>>)mapParams.get("LGFAMLM");

for(int i = 0 ; i < famList.size(); i++)
{
HashMap<String, Object> famObj = (HashMap<String, Object>)famList.get(i);
insert(packageName+"insertLGFAMLM", famObj); // 지원자 병력사항
}
}
}

- Service 부분

@Service
public class RecruitService {

@Autowired
private RecruitDAO dao;

@Transactional(propagation=Propagation.REQUIRED, rollbackFor = Exception.class)
public void insertRecruitStep02(HashMap<String, Object> mapParams) throws Exception{
dao.insertRecruitStep02(mapParams);
}
}



서버 재가동

 <!-- jeus connection pool 사용을 위한 jndi lookup -->
<jee:jndi-lookup id="dataSource-totd" jndi-name="jdbc/datasource1" resource-ref="true" />
<jee:jndi-lookup id="dataSource-hris" jndi-name="jdbc/datasource3" resource-ref="true" />
<jee:jndi-lookup id="dataSource-another" jndi-name="jdbc/datasource1" resource-ref="true" />

<!-- dataSource-totd datasource의 transaction 처리를 위한 transactionmanager설정 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource-totd" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager_hris" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource-hris" />
<!-- <tx:annotation-driven transaction-manager="transactionManager_hris"/> -->

<aop:config>
<aop:pointcut id="recruitOperation"
expression="execution(* wm.ir.jobInfo.service.RecruitService.*(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="recruitOperation" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="transactionManager_hris">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

댓글 없음:

댓글 쓰기