Spring-boot中mybatis数据源配置
数据源配置
SpringBoot数据源配置一般都是写在application中的。application有两中格式:yml和properties。
yml采用树形结构,空格区分层级; properties采用类结构,点区分属性和层级。
一般来说,需要在配置文件的datasource下配置相关的属性,然后创建配置文件的加载类,根据配置文件建立数据库连接。
datasource下必要属性:
spring:
datasource:
jdbc_url: jdbc:mysql://localhost:3306/***?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver username: root password: ******
一般来说,如果是mysql8.0以上,需要在driver-class-name中,添加cj,不然引擎无法加载
多数据源配置
有的项目,需要分库分表,因此需要从多个库中去获取数据,这时候就需要进行多数据源的配置。
多数据源配置就需要在datasource下分出多个不同的标签,来区分数据源,每个数据源之间都是需要一个单独的配置加载类。
spring:
datasource: main: jdbc_url: jdbc:mysql://localhost:3306/fdi?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver username: root password: ***** user: jdbc-url: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver username: root password: *****
配置类的加载需要通过 bean 映射到类中去
/**
* 数据源配置
* @author Datousu
*/
@Configuration
public class DataSourceConfig {
@Bean(name="datasourceMain")
@ConfigurationProperties(prefix = "spring.datasource.main")
public DataSource datasourceMain() throws Exception{
return DataSourceBuilder.create().build();
}
@Bean(name="datasourceUser")
@ConfigurationProperties(prefix = "spring.datasource.user")
public DataSource datasourceUser() {
return DataSourceBuilder.create().build();
}
}
上述类中,我在自己处理的时候,存在读取不到bean属性的问题;
一开始采用的网上url改为jdbc-url的处理方式,但是未能解决问题。利用较长的dataSourceBuilder也不能解决问题。后来调用获取配置文件属性值的函数进行查看,返现创建dataSource时没有传入对应的值,导致构建失败,后面怎么找到问题的,忘记了。。。
除了在创建dataSource类加载文件,还有可能会用到其他的功能
package com.finedoit.fdicode.config; import com.zaxxer.hikari.HikariDataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; 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 org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; /** * 数据库1配置 * @author */ @Configuration @MapperScan(basePackages = "com.finedoit.fdicode.mbg.mapper.main", sqlSessionFactoryRef = "sqlSessionFactoryMain") public class MyBatisMainConfig { @Bean(name = "sqlSessionFactoryMain") public SqlSessionFactory sqlSessionFactoryMain(@Qualifier("datasourceMain") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //指定mapper位置 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/finedoit/fdicode/mbg/mapper/main/*.xml")); return bean.getObject(); } @Bean(name = "transactionManagerMain") public DataSourceTransactionManager mainTransactionManager(@Qualifier("datasourceMain") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "mainSqlSessionTemplate") public SqlSessionTemplate mainSqlSessionTemplate(@Qualifier("sqlSessionFactoryMain") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
以上文件配置了其他的功能模块
在配置了两个差不多的上述文件后,进行构建时,发现一个ioc 创建mapper 类的时候导航到了多个创建类上(MyBatisMainConfig和另外一个MyBatisConfig类,都要去创建同一个mapper接口)
后来发现是因为我在mapper的接口上添加了@Mapper注释,又在对应的MyBatisXXXConfig上添加了@MapperScan扫描器,在创建的时候,@Mapper的优先级好像要高一点,优先使用了@Mapper去着@MyBatisXXXConfig,导致找到了两个。。。。
解决方式就是不要用@Mapper来标记 mapper接口,这样,它就不会去乱着对象了。
以上构建可以进行多数据源的配置和调用,相对来说还是比较简单
数据库连接池
有了数据源,但是当请求过大的时候怎么去提高性能?这个时候应该就需要用到数据库连接池了
数据库连接池,在选择权衡过程中,我选择了druid的数据库连接池。
首先在对应的数据源下编写相关的数据源配置:
main: jdbc_url: jdbc:mysql://localhost:3306/fdi?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver username: root password: ****** type: com.alibaba.druid.pool.DruidDataSource #初始化连接池的连接数量 大小,最小,最大 initial-size: 10 min-idle: 5 max-active: 20 #配置获取连接等待超时的时间 max-wait: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 time-between-eviction-runs-millis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 min-evictable-idle-time-millis: 30000 validation-query: SELECT 1 FROM DUAL test-while-idle: true test-on-borrow: true test-on-return: false # 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开 pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filter: stat: merge-sql: true slow-sql-millis: 5000 #3.基础监控配置 web-stat-filter: enabled: true url-pattern: /* # 设置不统计哪些URL exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" session-stat-enable: true session-stat-max-count: 100 stat-view-servlet: enabled: true url-pattern: /druid/* reset-enable: true # 设置监控页面的登录名和密码 login-username: admin login-password: admin # 允许访问的端口 allow: 127.0.0.1 # 禁止访问的端口 #deny: 192.168.1.100
添加这部分,然后再数据加载页面添加修改新的加载数据源操作
添加druid:
spring:
datasource:
druid:
main:
url: jdbc:mysql://localhost:3306/i?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: *******
type: com.alibaba.druid.pool.DruidDataSource
user:
url: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: *******
type: com.alibaba.druid.pool.DruidDataSource
#初始化连接池的连接数量 大小,最小,最大
initial-size: 10
min-idle: 5
max-active: 20
#配置获取连接等待超时的时间
max-wait: 60000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 30000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: true
test-on-return: false
# 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall
filter:
stat:
merge-sql: true
slow-sql-millis: 5000
enabled: true
#3.基础监控配置
web-stat-filter:
enabled: true
url-pattern: /*
#设置不统计哪些URL
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
session-stat-enable: true
session-stat-max-count: 100
stat-view-servlet:
enabled: true
url-pattern: /druid/*
reset-enable: true
#设置监控页面的登录名和密码
login-username: admin
login-password: admin
#允许访问的端口
allow: 127.0.0.1
#禁止访问的端口
#deny: 192.168.1.100
/**
* 数据源配置
* @author Datousu
*/
@Configuration
public class DataSourceConfig {
@Bean(name="datasourceMain")
@ConfigurationProperties(prefix = "spring.datasource.druid.main")
public DataSource datasourceMain() throws Exception{
return DruidDataSourceBuilder.create().build();
}
@Bean(name="datasourceUser")
@ConfigurationProperties(prefix = "spring.datasource.druid.user")
public DataSource datasourceUser() {
return DruidDataSourceBuilder.create().build();
}
}

浙公网安备 33010602011771号