Spring 동적 데이터 원본을 구성하여 읽기와 쓰기를 분리하는 방법

앞말
최근 업무의 수요로 인해 구축하고자 하는 프로젝트는 데이터 원본의 읽기와 쓰기 분리를 실현해야 한다. 여기서 코드를 공유하고 필요하신 분들은 참고하여 공부할 수 있다.
먼저 데이터 소스 구성

<!-- -->
<bean id="readDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"destroy-method="close">
// 
</bean>

<!-- -->
<bean id="writeDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"destroy-method="close">
// 
</bean>

<!--   -->
<bean id = "dataSource" class="com.potato.common.bean.DynamicDataSource" > 
 <!--   --> 
 <property name="targetDataSources">  
 <map>   
  <entry key="READ" value-ref="readDataSource"/>   
  <entry key="WRITE" value-ref="writeDataSource"/>  
 </map> 
 </property> 
 <!--   --> 
 <property name="defaultTargetDataSource" ref="writeDataSource"/>
</bean>
데이터 원본은 어떻게 전환합니까?동적 데이터 원본의 설정을 통해 우리는 원래 키를 통해 전환하는 것을 알고 있다. 여기에서 org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource 을 사용해야 한다. 우리는 자신의 동적 데이터 원본 클래스 DynamicDataSource 를 작성하여 그것을 계승할 수 있다.

public class DynamicDataSource extends AbstractRoutingDataSource { 
 @Override 
 protected Object determineCurrentLookupKey() {  
  return DataSourceContextHolder.getType(); 
 }
}
키를 저장하는 곳DataSourceContextHolder 이 필요합니다. 전환할 때 라인이 안전할 수 있도록 키를 저장하기 위해 ThreadLocal을 사용합니다.

public class DataSourceContextHolder {
 private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceContextHolder.class);
 public static final String DATA_SOURCE_WRITE = "WRITE";
 public static final String DATA_SOURCE_READ = "READ";
 //  
 private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

 //  
 public static void setType(String type) {
  if(LOGGER.isDebugEnabled())
   LOGGER.debug("============== , :"+type+"================");
  contextHolder.set(type);
 }
 //  
 public static String getType() {
  return (contextHolder.get());
 }
 //  
 public static void clearType() {
  contextHolder.remove();
 }
}
자, 우리는 조작DataSourceContextHolder을 통해 데이터 원본의 동적 전환을 실현할 수 있습니다.젊은이들은 호출 방법마다 수동으로 전환할 데이터 원본 형식을 선택해야 한다고 말할 수 있다.아니지, 스프링 AOP 등장.

@Component
@Aspect
public class DynamicDataSourceAspect {

 @Pointcut("execution (* com.potato.orm.mapper.*.select*(..)) || execution (* com.potato.orm.mapper.*.count*(..)) ")
 public void readMethodPointcut() {}

 @Pointcut("execution (* com.potato.orm.mapper.*.insert*(..)) || execution (* com.potato.orm.mapper.*.update*(..)) || execution (* com.potato.orm.mapper.*.delete*(..))")
 public void writeMethodPointcut() {}

 @Before("readMethodPointcut()")
 public void switchReadDataSource(){
  //System.out.println("============ ===========");
  DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_READ);
 }

 @Before("writeMethodPointcut()")
 public void switchWriteDataSource(){
  //System.out.println("============= ==========");
  DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_WRITE);
 }

}
총결산
자, 이상은 이 글의 전체 내용입니다. Mapper(본 프로젝트는 MyBatis를 사용합니다. DAO에 해당)에서 조회 방법을 읽을 때 데이터 원본으로 전환합니다. 추가, 삭제, 수정 방법은 데이터 원본을 쓰는 것으로 전환됩니다.본고의 내용이 여러분의 학습이나 업무에 일정한 도움을 줄 수 있기를 바랍니다. 의문이 있으면 메시지를 남겨 주십시오.

좋은 웹페이지 즐겨찾기