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();
    }
}

  

 

posted @ 2022-06-17 16:50  100多斤派大星  阅读(1128)  评论(0编辑  收藏  举报