spring boot中使用druid多数据源配置Mybatis

本文介绍如何在Spring Boot项目中整合Druid数据源和MyBatis框架,包括配置多数据源、实现数据库连接池监控以及解决非默认数据源的事物处理问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首选必须吐槽下,不知道是我读书太少,还是Spring boot确实对druid和mybatis的支持不好,奈何用怪了druid的数据库、sql、url监控和mybatis数据源,只有硬着头皮上了。

相关配置

常例先给出build.gradle配置

"org.mybatis.spring.boot:mybatis-spring-boot-starter:1.2.0",
"mysql:mysql-connector-java:5.1.38",
"com.alibaba:druid:1.0.26"

druid的相关配置(虽然是放在默认配置中,但压根就不会自动加载)

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
spring.datasource.initialSize=8
spring.datasource.minIdle=1
spring.datasource.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒 
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小 
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 
spring.datasource.filters=stat, wall

接着是两个数据源配置

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://ip1:3306/springboot?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=xxxx
spring.datasource.password=xxxx

spring.datasource.siva.url=jdbc:mysql://ip2:3306/siva?useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.siva.username=xxx
spring.datasource.siva.password=xxx

druid的Servlet及拦截器

由于不存在web.xml文件,需要在java代码中进行配置

@Bean
public ServletRegistrationBean druidServlet() {
    ServletRegistrationBean reg = new ServletRegistrationBean();
    reg.setServlet(new StatViewServlet());
    reg.addUrlMappings("/druid/*");
    reg.addInitParameter("loginUsername", "sivannnn");
    reg.addInitParameter("loginPassword", "123456");
    return reg;
}

@Bean
public FilterRegistrationBean filterRegistrationBean() {
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    filterRegistrationBean.setFilter(new WebStatFilter());
    filterRegistrationBean.addUrlPatterns("/*");
    filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
    filterRegistrationBean.addInitParameter("profileEnable", "true");
    filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE");
    filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION");
    return filterRegistrationBean;
}

数据源配置

采用多数据源的情况下,要求必须有一个数据源为”主”.

...参数已经略去
@Bean(name = "rdsDataSource")
@Primary
public DataSource rdsDataSource() {
    DruidDataSource datasource = new DruidDataSource();
    datasource.setUrl(this.dbUrl);
    datasource.setUsername(username);
    datasource.setPassword(password);
    datasource.setDriverClassName(driverClassName);
    datasource.setInitialSize(initialSize);
    datasource.setMinIdle(minIdle);
    datasource.setMaxActive(maxActive);
    datasource.setMaxWait(maxWait);
     datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
    datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
    datasource.setValidationQuery(validationQuery);
    datasource.setTestWhileIdle(testWhileIdle);
    datasource.setTestOnBorrow(testOnBorrow);
    datasource.setTestOnReturn(testOnReturn);
    datasource.setPoolPreparedStatements(poolPreparedStatements);
    try {
        datasource.setFilters(filters);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return datasource;
 }

@Bean(name = "rdsTransactionManager")
@Primary
public DataSourceTransactionManager rdsTransactionManager() {
    return new DataSourceTransactionManager(rdsDataSource());
}

@Bean(name = "rdsSqlSessionFactory")
@Primary
public SqlSessionFactory rdsSqlSessionFactory(@Qualifier("rdsDataSource") DataSource rdsDataSource)
        throws Exception {
    final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(rdsDataSource);
    return sessionFactory.getObject();
}

其中rdsDataSource函数中对参数,即对druid对配置,采用@value注解从配置文件中引用。
@Primary注解即表示该数据源为默认数据源(主数据源)
其余数据源除了没有@primary注解,配置方式相同。@bean不能重复,否则会默认忽略第二个相同注解。

这里很重要

最后经过单元测试
1.两个数据源都能进行数据库操作。
2.非默认数据源无法进行事物处理,就算使用@Transactional注解选择事物bean,也没法,对此我很懵逼!!!
跪求大神解惑


参考:
1.https://yq.aliyun.com/articles/39195

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值