目录
- 背景
- 知识储备
- 问题现象
- 解决方案
- 问题总结
背景
Springboot
集成mybatis
使用HikariCP
连接MySQL
,进行读写分离。
知识储备
在上篇文章中,我们实现了数据源的读写分离,也实现了我们想要的效果. 但是存在一个小小的瑕疵。接下来,我需要介绍一下稍微深入的知识。
在我们配置动态数据源的时候,继承了一个类 AbstractRoutingDataSource
,我们先看一下这个类有什么作用。
package com.fxb.doraemon.human;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.datasource.AbstractDataSource;
import org.springframework.jdbc.datasource.lookup.DataSourceLookup;
import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* DataSource的实现:根据一个指定的key,调用各种的目标的数据源。 之后,通常根据一些线程的事务上下文来指定数据源。
*/
public abstract class AbstractRoutingDataSourceTest extends AbstractDataSource implements InitializingBean {
/**
* 目标数据源
*/
@Nullable
private Map<Object, Object> targetDataSources;
/**
* 默认的数据源
*/
@Nullable
private Object defaultTargetDataSource;
/**
* ??
*/
private boolean lenientFallback = true;
/**
* 数据源查找??
*/
private DataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
@Nullable
private Map<Object, DataSource> resolvedDataSources;
/**
* 被处理之后的数据源??
*/
@Nullable
private DataSource resolvedDefaultDataSource;
/**
* 根据指定查找的key获取目标数据源的映射,
* 映射的值可以是一个DataSource的实例,也可以是String。如果是String的话,会通过setDataSourceLookup方法进行解析。
* 指定的key可以是任意类型,这个类仅仅实现了通用的查找过程,具体的key标识将由resolveSpecifiedLookupKey(Object)方法和
* determineCurrentLookupKey()进行解析。
* 也就是说:
* #1.如果我们自己定义了Map中的value是字符串的话,就需要重写setDataSourceLookup这个方法进行返回正确的数据源。
* #2.如果我们自己定义了Map中的key的话,我们就需要重写resolveSpecifiedLookupKey方法和determineCurrentLookupKey()。
*/
public void set