>  기사  >  Java  >  읽기와 쓰기를 분리하기 위해 Spring에서 동적 데이터 소스를 구성하는 방법

읽기와 쓰기를 분리하기 위해 Spring에서 동적 데이터 소스를 구성하는 방법

高洛峰
高洛峰원래의
2017-01-24 10:53:591680검색

머리말

최근 작업 요구로 인해 구축하려는 프로젝트에서 데이터 소스 읽기와 쓰기를 분리해야 합니다. 여기에서 코드를 공유하고, 도움이 필요한 친구들이 참고하고 배울 수 있습니다.

첫 번째는 데이터 소스를 구성하는 것

<!--读数据源配置-->
<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>

데이터 소스를 어떻게 전환하나요? 동적 데이터 소스의 구성을 통해 우리는 키를 통해 전환이 수행된다는 것을 알고 있습니다. 여기서는 이를 상속하기 위해 자체 동적 데이터 소스 클래스인 DynamicDataSource를 작성할 수 있습니다.

public class DynamicDataSource extends AbstractRoutingDataSource {
 @Override
 protected Object determineCurrentLookupKey() { 
  return DataSourceContextHolder.getType();
 }
}


또한 전환 중 스레드 안전성을 보장하기 위해 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를 작동하여 데이터 소스를 동적으로 전환할 수 있습니다. 친구들은 메소드를 호출할 때마다 전환하려면 데이터 소스 유형을 수동으로 선택해야 합니까?라고 물을 수 있습니다. 물론 그렇지 않습니다. Spring AOP가 등장합니다.

읽기-쓰기 분리를 달성하기 위해 Spring에서 동적 데이터 소스를 구성하는 방법에 대한 더 많은 기사를 보려면 PHP 중국어 웹사이트에 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.