Spring의 AbstractRoutingDataSource를 활용하여 다중 데이터 소스의 문제 해결

다중 데이터 소스 문제는 읽기와 쓰기 분리 데이터베이스 설정과 같은 흔한 문제이다.
원래의 프로젝트에 새로운 수요가 생겼기 때문에 국측은 어떤 서버를 추가하여 어떤 코드를 제공하도록 요구했는데 다중 데이터 원본과 관련된 문제이다.
연구 결과는 다음과 같다.
1. 먼저 여러 개의 데이터소스 구성

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"> 
    </property> 
    <property name="url" value="jdbc:jtds:sqlserver://10.82.81.51:1433;databaseName=standards"> 
    </property> 
    <property name="username" value="youguess"></property> 
    <property name="password" value="youguess"></property> 
  </bean> 
  <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"> 
    </property> 
    <property name="url" value="jdbc:jtds:sqlserver://10.82.81.52:1433;databaseName=standards"> 
    </property> 
    <property name="username" value="youguess"></property> 
    <property name="password" value="youguess"></property> 
</bean> 
2. DynamicDataSource 클래스를 작성하여 AbstractRoutingDataSource를 계승하고 determineCurrentLookupKey 방법을 실현

package com.standard.core.util; 
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 
public class DynamicDataSource extends AbstractRoutingDataSource { 
  @Override 
  protected Object determineCurrentLookupKey() { 
    return CustomerContextHolder.getCustomerType(); 
  } 
} 
3. ThreadLocal을 사용하여 스레드 보안 문제 해결

package com.standard.core.util; 
public class CustomerContextHolder { 
  public static final String DATA_SOURCE_A = "dataSource"; 
  public static final String DATA_SOURCE_B = "dataSource2"; 
  private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); 
  public static void setCustomerType(String customerType) { 
    contextHolder.set(customerType); 
  } 
  public static String getCustomerType() { 
    return contextHolder.get(); 
  } 
  public static void clearCustomerType() { 
    contextHolder.remove(); 
  } 
} 
4. 데이터 소스 구성

<bean id="dynamicDataSource" class="com.standard.core.util.DynamicDataSource" > 
    <property name="targetDataSources"> 
      <map key-type="java.lang.String"> 
        <entry value-ref="dataSource" key="dataSource"></entry> 
        <entry value-ref="dataSource2" key="dataSource2"></entry> 
      </map> 
    </property> 
    <property name="defaultTargetDataSource" ref="dataSource" > 
    </property> 
  </bean> 
5, DAOimpl에서 데이터 소스 전환

CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B);  
끝!
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기