Vorwort
Aufgrund von Arbeitsanforderungen muss ein zu erstellendes Projekt das Lesen und Schreiben von Datenquellen trennen. Ich werde den Code hier teilen, und Freunde in Not können darauf verweisen und lernen.
Die erste besteht darin, die Datenquelle zu konfigurieren
<!--读数据源配置--> <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>
Wie wechselt man die Datenquelle? Durch die Konfiguration der dynamischen Datenquelle wissen wir, dass die Umschaltung über den Schlüssel erfolgt. Hier müssen wir org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource verwenden, um sie zu erben.
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getType(); } }
Sie benötigen außerdem einen Ort zum Speichern des Schlüssels DataSourceContextHolder. Um die Thread-Sicherheit beim Wechsel zu gewährleisten, verwenden wir ThreadLocal zum Speichern unseres Schlüssels.
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(); } }
Okay, wir können Datenquellen dynamisch wechseln, indem wir den DataSourceContextHolder bedienen. Freunde fragen sich vielleicht: Müssen Sie den Datenquellentyp manuell auswählen, um jedes Mal zu wechseln, wenn Sie eine Methode aufrufen? Natürlich nicht, Spring AOP kommt auf den Plan.
@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); } }
Zusammenfassung
Okay, das ist der gesamte Inhalt dieses Artikels. Nach dem Besuch von Mapper (dieses Projekt verwendet die Abfragemethode in MyBatis (entspricht DAO) wechselt zur Lesedatenquelle und die Methoden zum Hinzufügen, Löschen und Ändern wechseln zur Schreibdatenquelle. Ich hoffe, dass der Inhalt dieses Artikels für alle beim Lernen oder Arbeiten hilfreich sein kann. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen.
Weitere Artikel zum Konfigurieren dynamischer Datenquellen im Frühjahr, um eine Lese-/Schreibtrennung zu erreichen, finden Sie auf der chinesischen PHP-Website!