今天在项目上碰到需要去读不同库的需求,自己看了一些博客,感觉网上的很繁琐,我们可以通过配置类的形式来切换数据源,指定不同的mapper文件读不同的库,指定不同的Dao层。
涉密部分已打码
1.准备两个数据库配置文件
2.两个配置文件的内容
# JDBC 配置(驱动类自动从url的mysql识别,数据源类型自动识别)
# 或spring.datasource.aj.url=
spring.datasource.aj.druid.url=${SPRING_DATASOURCE_AJ_DRUID_URL:jdbc:mysql://XX.XXX.XXX.XXX:端口/库名?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull}
spring.datasource.aj.druid.username=${SPRING_DATASOURCE_AJ_DRUID_USERNAME:账号}
spring.datasource.aj.druid.password=${SPRING_DATASOURCE_AJ_DRUID_PASSWORD:密码}
spring.datasource.aj.druid.driver-class-name=${SPRING_DATASOURCE_DRUID_DRIVER_CLASS_NAME:com.mysql.jdbc.Driver}
#连接池配置(通常来说,只需要修改initialSize、minIdle、maxActive
# 如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。分库分表较多的数据库,建议配置为false。removeabandoned不建议在生产环境中打开如果用SQL Server,建议追加配置)
spring.datasource.aj.druid.initial-size=${SPRING_DATASOURCE_DRUID_INITIAL_SIZE:1}
spring.datasource.aj.druid.max-active=${SPRING_DATASOURCE_DRUID_MAX_ACTIVE:20}
spring.datasource.aj.druid.min-idle=${SPRING_DATASOURCE_DRUID_MIN_IDLE:1}
# 配置获取连接等待超时的时间
spring.datasource.aj.druid.max-wait=${SPRING_DATASOURCE_DRUID_MAX_WAIT:60000}
#打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.aj.druid.pool-prepared-statements=${SPRING_DATASOURCE_DRUID_POOL_PREPARED_STATEMENTS:true}
spring.datasource.aj.druid.max-pool-prepared-statement-per-connection-size=${SPRING_DATASOURCE_DRUID_MAX_POOL_PREPARED_STATEMENT_PER_CONNECTION_SIZE:20}
#spring.datasource.aj.druid.max-aj-prepared-statements=和上面的等价
spring.datasource.aj.druid.validation-query=${SPRING_DATASOURCE_DRUID_VALIDATION_QUERY:SELECT 'x'}
#spring.datasource.aj.druid.validation-query-timeout=
spring.datasource.aj.druid.test-on-borrow=${SPRING_DATASOURCE_DRUID_TEST_ON_BORROW:false}
spring.datasource.aj.druid.test-on-return=${SPRING_DATASOURCE_DRUID_TEST_ON_RETURN:false}
spring.datasource.aj.druid.test-while-idle=${SPRING_DATASOURCE_DRUID_TEST_WHILE_IDLE:true}
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.aj.druid.time-between-eviction-runs-millis=${SPRING_DATASOURCE_DRUID_TIME_BETWEEN_EVICTION_RUNS_MILLIS:60000}
#配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.aj.druid.min-evictable-idle-time-millis=${SPRING_DATASOURCE_DRUID_MIN_EVICTABLE_IDLE_TIME_MILLIS:300000}
#spring.datasource.aj.druid.max-evictable-idle-time-millis=
#配置多个英文逗号分隔
spring.datasource.aj.druid.filters=${SPRING_DATASOURCE_DRUID_FILTERS:stat}
# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
#是否启用StatFilter默认值true
spring.datasource.aj.druid.web-stat-filter.enabled=${SPRING_DATASOURCE_DRUID_FILTER_ENABLE:true}
spring.datasource.aj.druid.web-stat-filter.url-pattern=${SPRING_DATASOURCE_DRUID_FILTER_URL_PATTERN:/*}
spring.datasource.aj.druid.web-stat-filter.exclusions=${SPRING_DATASOURCE_DRUID_FILTER_EXCLUSIONS:*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*}
spring.datasource.aj.druid.web-stat-filter.session-stat-enable=${SPRING_DATASOURCE_DRUID_FILTER_SESSION_STAT_ENABLE:false}
spring.datasource.aj.druid.web-stat-filter.session-stat-max-count=${SPRING_DATASOURCE_DRUID_FILTER_SESSION_STAT_MAX_COUNT:1000}
spring.datasource.aj.druid.web-stat-filter.principal-session-name=${SPRING_DATASOURCE_DRUID_FILTER_PRINCIPAL_SESSION_NAME:admin}
spring.datasource.aj.druid.web-stat-filter.principal-cookie-name=${SPRING_DATASOURCE_DRUID_FILTER_PRINCIPAL_COOKIE_NAME:admin}
spring.datasource.aj.druid.web-stat-filter.profile-enable=${SPRING_DATASOURCE_DRUID_FILTER_PROFILE_ENABLE:TRUE}
# StatViewServlet配置
#展示Druid的统计信息,StatViewServlet的用途包括:1.提供监控信息展示的html页面2.提供监控信息的JSON API
#是否启用StatViewServlet默认值true
spring.datasource.aj.druid.stat-view-servlet.enabled=${SPRING_DATASOURCE_DRUID_VIEW_ENABLE:TRUE}
#根据配置中的url-pattern来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html例如:
#http://110.76.43.235:9000/druid/index.html
#http://110.76.43.235:8080/mini-web/druid/index.html
spring.datasource.aj.druid.stat-view-servlet.url-pattern=${SPRING_DATASOURCE_DRUID_VIEW_URL_PATTERN:/druid/*}
#允许清空统计数据
spring.datasource.aj.druid.stat-view-servlet.reset-enable=${SPRING_DATASOURCE_DRUID_VIEW_RESET_ENABLE:TRUE}
spring.datasource.aj.druid.stat-view-servlet.login-username=${SPRING_DATASOURCE_DRUID_VIEW_LOGIN_USERNAME:admin}
spring.datasource.aj.druid.stat-view-servlet.login-password=${SPRING_DATASOURCE_DRUID_VIEW_LOGIN_PASSWORD:admin}
配置文件中,命名一定要不同 spring.datasource.XX.druid
eg:第一个为spring.datasource.aaa.druid
第二个位spring.datasource.bbb.druid
3.编写配置类(细节看代码注释)
@Data
@Configuration
// 前缀为spring.datasource.druid的配置信息,此注解里的内容为你要读取那个配置文件!!!,一定要和配置文件中的命名一样
@ConfigurationProperties(prefix = "spring.datasource.aj.druid")
//扫描dao层目录
@MapperScan(basePackages = "com.linewell.aj.demo.dao", sqlSessionFactoryRef = "ajSqlSessionFactory")
public class AjDataBaseConfig {
/**
* dao层的包路径
*/
static final String PACKAGE = "com.linewell.aj.demo.dao";
/**
* mapper文件的相对路径
* 路径这里写你想扫描的路径
*/
private static final String MAPPER_LOCATION = "classpath:mybatis/mapper/**/*.xml";
/**
* 数据连接池的属性(读取你@ConfigurationProperties注解标识的properties文件里的属性)
* 直接复制
*/
private String filters;
private String url;
private String username;
private String password;
private String driverClassName;
private int initialSize;
private int minIdle;
private int maxActive;
private long maxWait;
private long timeBetweenEvictionRunsMillis;
private long minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean testOnBorrow;
private boolean testOnReturn;
private boolean poolPreparedStatements;
private int maxPoolPreparedStatementPerConnectionSize;
// 主数据源使用@Primary注解进行标识,我这里不是主数据源就不加了
@Bean(name = "ajDataSource")
public DataSource ajDataSource() throws SQLException {
DruidDataSource druid = new DruidDataSource();
// 配置基本属性
druid.setDriverClassName(driverClassName);
druid.setUsername(username);
druid.setPassword(password);
druid.setUrl(url);
//初始化时建立物理连接的个数
druid.setInitialSize(initialSize);
//最大连接池数量
druid.setMaxActive(maxActive);
//最小连接池数量
druid.setMinIdle(minIdle);
//获取连接时最大等待时间,单位毫秒。
druid.setMaxWait(maxWait);
//间隔多久进行一次检测,检测需要关闭的空闲连接
druid.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
//一个连接在池中最小生存的时间
druid.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
//用来检测连接是否有效的sql
druid.setValidationQuery(validationQuery);
//建议配置为true,不影响性能,并且保证安全性。
druid.setTestWhileIdle(testWhileIdle);
//申请连接时执行validationQuery检测连接是否有效
druid.setTestOnBorrow(testOnBorrow);
druid.setTestOnReturn(testOnReturn);
//是否缓存preparedStatement,也就是PSCache,oracle设为true,mysql设为false。分库分表较多推荐设置为false
druid.setPoolPreparedStatements(poolPreparedStatements);
// 打开PSCache时,指定每个连接上PSCache的大小
druid.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
return druid;
}
// 创建该数据源的事务管理
// 主数据源使用@Primary注解进行标识,我这里不是主数据源就不加了
@Bean(name = "ajTransactionManager")
public DataSourceTransactionManager ajTransactionManager(@Qualifier("ajDataSource") DataSource ajDataSource) throws SQLException {
return new DataSourceTransactionManager(ajDataSource);
}
// 创建Mybatis的连接会话工厂实例
// 主数据源使用@Primary注解进行标识,我这里不是主数据源就不加了
@Bean(name = "ajSqlSessionFactory")
public SqlSessionFactory ajSqlSessionFactory(@Qualifier("ajDataSource") DataSource ajDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(ajDataSource); // 设置数据源bean
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(AjDataBaseConfig.MAPPER_LOCATION)); // 设置mapper文件路径
return sessionFactory.getObject();
}
}
这样springboot会去加载这个配置类,扫描指定的Dao层和mapper文件,添加指定的数据库配置。有多个数据源就写多个配置类,内容都和上面一样,路径修改一下就行。