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
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>
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(); } }
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(); } }
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); } }
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 !