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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /** * 数据源配置 * @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(); } } |
本文作者:100多斤派大星
本文链接:https://www.cnblogs.com/datousu/p/16386311.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步