Heim  >  Artikel  >  Java  >  So konfigurieren Sie dynamische Datenquellen in Spring, um eine Trennung von Lesen und Schreiben zu erreichen

So konfigurieren Sie dynamische Datenquellen in Spring, um eine Trennung von Lesen und Schreiben zu erreichen

高洛峰
高洛峰Original
2017-01-24 10:53:591622Durchsuche

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn