1,通过jdbc的方式动态切换数据源,实现既关即停,即开即用
@Component
@Slf4j
public class MySqlConfiguration {
/**
* mysql数据源
*/
private Map<String, HikariDataSource> mySqlDataSources = new HashMap<>();
/**
* jdbcTemplate key:数据源唯一标识 value:jdbcTemplate
*/
public Map<String, JdbcTemplate> mySqlJdbcTemplate = new HashMap<>();
@PostConstruct
private void init() {
//根据数据库配置信息
String mysqlConnection = "jdbc:mysql://rm-wz9926drc689m9g2j.mysql.rds.aliyuncs.com:3306/dcp_sit?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai";
String userName = "dcp_sit";
String password = "r9sRRxl#^";
String uniqueCode = "dcp_sit";
//根据数据库唯一标识 生成jdbcTemplate
jdbcTemplate(mysqlConnection, userName, password,uniqueCode);
}
@PreDestroy
private void destroy() {
//销毁所有的连接池
released();
}
/**
* 释放连接池
*/
private void released() {
if (null != mySqlDataSources) {
for (Map.Entry<String, HikariDataSource> entry : mySqlDataSources.entrySet()) {
HikariDataSource hikariDataSource = entry.getValue();
if (null != hikariDataSource) {
hikariDataSource.close();
}
}
}
}
/**
* 根据名称释放连接池
*/
public void releasedByName(String name) {
if (null != mySqlDataSources) {
for (Map.Entry<String, HikariDataSource> entry : mySqlDataSources.entrySet()) {
if(entry.getKey().equals(name)){
HikariDataSource hikariDataSource = entry.getValue();
if (null != hikariDataSource) {
hikariDataSource.close();
mySqlJdbcTemplate.remove(name);
}
}
}
}
}
public void addDataSource(){
//根据数据库配置信息
String mysqlConnection1 = "jdbc:mysql://rm-wz9926drc689m9g2j.mysql.rds.aliyuncs.com:3306/dcp_dev?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai";
String userName1 = "dcp_sit";
String password1 = "r9sRRxl#^";
String uniqueCode1 = "dcp_dev";
//根据数据库唯一标识 生成jdbcTemplate
jdbcTemplate(mysqlConnection1, userName1, password1,uniqueCode1);
}
/**
* 初始化mysql连接
*
* @param mysqlConnectionUrl
* @param userName
* @param password
* @param uniqueCode
*/
private void jdbcTemplate(String mysqlConnectionUrl, String userName, String password, String uniqueCode) {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setJdbcUrl(mysqlConnectionUrl);
hikariConfig.setUsername(userName);
hikariConfig.setPassword(password);
HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
Connection connection = DataSourceUtils.getConnection(hikariDataSource);
try {
boolean closed = connection.isClosed();
if (!closed) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(hikariDataSource);
mySqlDataSources.put(uniqueCode, hikariDataSource);
mySqlJdbcTemplate.put(uniqueCode, jdbcTemplate);
}
} catch (SQLException e) {
log.error("Connect Tenant MySql Fail :{}", e);
}
}
}
如果想要使用那个数据源就去mySqlJdbcTemplate里取,关闭就从mySqlJdbcTemplate删除