Maison > Java > javaDidacticiel > Comment configurer des sources de données dynamiques au Spring pour obtenir la séparation de la lecture et de l'écriture

Comment configurer des sources de données dynamiques au Spring pour obtenir la séparation de la lecture et de l'écriture

高洛峰
Libérer: 2017-01-24 10:53:59
original
1738 Les gens l'ont consulté

Avant-propos

Récemment, en raison de besoins professionnels, un projet à construire doit séparer la lecture et l'écriture des sources de données. Je partagerai le code ici, et les amis dans le besoin pourront s'y référer et apprendre.

La première consiste à configurer la source de données

<!--读数据源配置-->
<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>
Copier après la connexion

Comment changer de source de données ? Grâce à la configuration de la source de données dynamique, nous savons que la commutation s'effectue via la clé. Ici, nous devons utiliser org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource. Nous pouvons écrire notre propre classe de source de données dynamique DynamicDataSource pour en hériter.

public class DynamicDataSource extends AbstractRoutingDataSource {
 @Override
 protected Object determineCurrentLookupKey() { 
  return DataSourceContextHolder.getType();
 }
}
Copier après la connexion


Vous avez également besoin d'un endroit pour stocker la clé DataSourceContextHolder Pour garantir la sécurité des threads lors du changement, nous utilisons ThreadLocal pour enregistrer notre clé.

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();
 }
}
Copier après la connexion


D'accord, nous pouvons changer dynamiquement de sources de données en exploitant le DataSourceContextHolder. Des amis peuvent vous demander : devez-vous sélectionner manuellement le type de source de données à changer à chaque fois que vous appelez une méthode ? Bien sûr que non, Spring AOP entre en scène.

@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);
 }
 
}
Copier après la connexion

Résumé

D'accord, c'est tout le contenu de cet article Après avoir visité Mapper (ce projet utilise la méthode de requête dans MyBatis. (équivalent à DAO) basculera vers la source de données de lecture, et les méthodes d'ajout, de suppression et de modification basculeront vers la source de données d'écriture. J'espère que le contenu de cet article pourra être utile aux études ou au travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer.

Pour plus d'articles sur la façon de configurer des sources de données dynamiques dans Spring pour obtenir une séparation lecture-écriture, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal