有一個這樣子的需求,線上正在跑的業務,由於業務發展需要,需重新開發一套新系統,等新系統開發完成後,需要無縫對接切換,當初具體設計見草圖。
新增依賴#
<!——lombok——>
application。properties#
server。port=9999spring。datasource。master。driver-class-name=com。mysql。cj。jdbc。Driverspring。datasource。master。url=jdbc:mysql://127。0。0。1/test?useUnicode=true&characterEncoding=utf-8&useSSL=falsespring。datasource。master。username=rootspring。datasource。master。password=rootspring。datasource。slave。driver-class-name=com。mysql。cj。jdbc。Driverspring。datasource。slave。jdbc-url=jdbc:mysql://127。0。0。1/test2?useUnicode=true&characterEncoding=utf-8&useSSL=falsespring。datasource。slave。username=rootspring。datasource。slave。password=root
2種方式建立DataSource#
Master配置,使用druid連線池#
import com。alibaba。druid。pool。DruidDataSource;import com。baomidou。mybatisplus。extension。spring。MybatisSqlSessionFactoryBean;import org。apache。ibatis。session。SqlSessionFactory;import org。mybatis。spring。annotation。MapperScan;import org。springframework。beans。factory。annotation。Autowired;import org。springframework。beans。factory。annotation。Qualifier;import org。springframework。context。annotation。Bean;import org。springframework。context。annotation。Configuration;import org。springframework。context。annotation。Primary;import org。springframework。core。env。Environment;import javax。sql。DataSource;/** * @Author:chenyanbin */@Configuration@MapperScan(basePackages = “com。example。demo。mapper”, sqlSessionFactoryRef = “masterSqlSessionFactory”)public class MasterDataSourceConfig { @Autowired private Environment env; @Primary @Bean(name = “masterDataSource”)// @ConfigurationProperties(“spring。datasource。master”) public DataSource masterDataSource() {// return DataSourceBuilder。create()。build(); DruidDataSource dataSource = new DruidDataSource(); dataSource。setUrl(env。getProperty(“spring。datasource。master。url”)); dataSource。setUsername(env。getProperty(“spring。datasource。master。username”)); dataSource。setPassword(env。getProperty(“spring。datasource。master。password”)); dataSource。setDriverClassName(env。getProperty(“spring。datasource。master。driver-class-name”)); //配置初始化大小、最小、最大 dataSource。setMinIdle(10); //配置初始化大小、最小、最大 dataSource。setMaxActive(200); //配置初始化大小、最小、最大 dataSource。setInitialSize(10); //配置獲取連線等待超時的時間 dataSource。setMaxWait(60000); //配置一個連線在池中最小生存的時間,單位是毫秒 dataSource。setMinEvictableIdleTimeMillis(300000); //配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 dataSource。setTimeBetweenEvictionRunsMillis(60000); //預設的testWhileIdle=true,testOnBorrow=false,testOnReturn=false dataSource。setValidationQuery(“SELECT 1”); //申請連線時執行validationQuery檢測連線是否有效 dataSource。setTestOnBorrow(false); //建議配置為true,不影響效能,並且保證安全性。 dataSource。setTestWhileIdle(true); //是否快取preparedStatement,也就是PSCache dataSource。setPoolPreparedStatements(false); return dataSource; } @Bean(name = “masterSqlSessionFactory”) public SqlSessionFactory sqlSessionFactory(@Qualifier(“masterDataSource”) DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean(); sessionFactoryBean。setDataSource(dataSource); return sessionFactoryBean。getObject(); }}
Slave配置#
import com。baomidou。mybatisplus。extension。spring。MybatisSqlSessionFactoryBean;import org。apache。ibatis。session。SqlSessionFactory;import org。mybatis。spring。annotation。MapperScan;import org。springframework。beans。factory。annotation。Qualifier;import org。springframework。boot。context。properties。ConfigurationProperties;import org。springframework。boot。jdbc。DataSourceBuilder;import org。springframework。context。annotation。Bean;import org。springframework。context。annotation。Configuration;import javax。sql。DataSource;/** * @Author:chenyanbin */@Configuration@MapperScan(basePackages = “com。example。demo。mapper2”,sqlSessionFactoryRef = “slaveSqlSessionFactory”)public class SlaveDataSourceConfig { @Bean(name = “slaveDataSource”) @ConfigurationProperties(“spring。datasource。slave”) public DataSource slaveDataSource(){ return DataSourceBuilder。create()。build(); } @Bean(name = “slaveSqlSessionFactory”) public SqlSessionFactory sqlSessionFactory(@Qualifier(“slaveDataSource”) DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean(); sessionFactoryBean。setDataSource(dataSource); return sessionFactoryBean。getObject(); }}
注意#
master和slave掃描不同的mapper包路徑!!!!!!
如果需要指定.xml檔案,需這樣配置!!!
@Bean(name = “masterSqlSessionFactory”) public SqlSessionFactory sqlSessionFactory(@Qualifier(“masterDataSource”) DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean(); sessionFactoryBean。setDataSource(dataSource); sessionFactoryBean。setMapperLocations(new PathMatchingResourcePatternResolver() 。getResources(“classpath:mapper/**/*。xml”)); return sessionFactoryBean。getObject(); }
啟動類#
@SpringBootApplication( exclude = {DataSourceAutoConfiguration。class, MybatisPlusAutoConfiguration。class})
啟動類上排查,自動裝配,使用我們自定義的多資料來源!!!
演示#
多個數據源,同時也是支援事務的
原文連結:https://www。cnblogs。com/chenyanbin/p/15504125。html
作者:陳彥斌
如果覺得本文對你有幫助,可以轉發關注支援一下