머리말
최근 작업 요구로 인해 구축하려는 프로젝트에서 데이터 소스 읽기와 쓰기를 분리해야 합니다. 여기에서 코드를 공유하고, 도움이 필요한 친구들이 참고하고 배울 수 있습니다.
첫 번째는 데이터 소스를 구성하는 것
<!--读数据源配置--> <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 중국어 웹사이트에 주목하세요!