spring boot中使用druid多数据源配置Mybatis: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
由于不存在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,也没法,对此我很懵逼!