DB数据源之SpringBoot+MyBatis踏坑过程(五)手动使用Hikari连接池

 

liuyuhang原创,未经允许禁止转载 

 

 

系列目录连接

DB数据源之SpringBoot+Mybatis踏坑过程实录(一)

 

1.环境说明

 

  springboot2.0以上版本,java8,myeclipse2017 C1,使用的是mySql数据库

  pom

  

 1 <parent>
 2         <groupId>org.springframework.boot</groupId>
 3         <artifactId>spring-boot-starter-parent</artifactId>
 4         <version>2.0.2.RELEASE</version>
 5         <relativePath />
 6     </parent>
 7 
 8     <dependencies>
 9 
10         <!-- spring boot web -->
11         <dependency>
12             <groupId>org.springframework.boot</groupId>
13             <artifactId>spring-boot-starter-web</artifactId>
14         </dependency>
15 
16         <!-- 添加MySQL依赖 -->
17         <dependency>
18             <groupId>mysql</groupId>
19             <artifactId>mysql-connector-java</artifactId>
20         </dependency>
21 
22         <!-- 添加JDBC依赖 重要-->
23         <dependency>
24             <groupId>org.springframework.boot</groupId>
25             <artifactId>spring-boot-starter-jdbc</artifactId>
26             <exclusions>
27                 <!--去掉默认的tomcat-jdbc的依赖 重要-->
28                 <exclusion>
29                     <groupId>org.apache.tomcat</groupId>
30                     <artifactId>tomcat-jdbc</artifactId>
31                 </exclusion>
32             </exclusions>
33         </dependency>
34         <!-- 添加 HikariCP数据源 重要-->
35         <dependency>
36             <groupId>com.zaxxer</groupId>
37             <artifactId>HikariCP</artifactId>
38         </dependency>
39         
40         <!-- mybaits基础依赖 -->
41         <dependency>
42             <groupId>org.mybatis</groupId>
43             <artifactId>mybatis</artifactId>
44             <version>3.4.0</version>
45         </dependency>
46         <!-- mybatis插件依赖 -->
47         <dependency>
48             <groupId>org.mybatis.spring.boot</groupId>
49             <artifactId>mybatis-spring-boot-starter</artifactId>
50             <version>1.1.1</version>
51         </dependency>
52         <!-- mapper依赖 -->
53         <dependency>
54             <groupId>tk.mybatis</groupId>
55             <artifactId>mapper</artifactId>
56             <version>3.3.7</version>
57         </dependency>
58 
59 
60         <dependency>
61             <groupId>org.springframework.boot</groupId>
62             <artifactId>spring-boot-configuration-processor</artifactId>
63             <optional>true</optional>
64         </dependency>
65 
66         <!-- 热部署 -->
67         <dependency>
68             <groupId>org.springframework.boot</groupId>
69             <artifactId>spring-boot-devtools</artifactId>
70             <optional>true</optional>
71             <scope>true</scope>
72         </dependency>
73         <!-- end of 热部署 -->
74     </dependencies>

  使用Hikari连接池,需要禁用springboot内置的tomcat的连接池,同时要引入Hikari连接池的依赖

 

2.配置思路

 

  •   确保类单例,使用构造器实例化的sqlSessionFactory只设置一次
  •   提供getSqlSessionFactory获取sqlSessionFactory
  •   setSqlSessionFactory时初始化数据源,并设置连接池
  •   setSqlSessionFactory方法提供参数可对数据源进行更改,以确保数据源故障时可进行重新设置

 

3.所需类与结构

 

  3.1.pom,略

  3.2.DataConfig.java配置数据源获取SqlSessionFactory类

  3.3.mapper.xml,略

  3.4.HelloExample.java测试,略

  3.5.AppRun.java,Springboot启动类,略

 

4.代码

 

  DataConfig.java代码如下:

 

  1 package com.FM.config;
  2 
  3 import org.apache.ibatis.session.SqlSessionFactory;
  4 import org.mybatis.spring.SqlSessionFactoryBean;
  5 import org.springframework.boot.jdbc.DataSourceBuilder;
  6 import org.springframework.context.annotation.Configuration;
  7 import org.springframework.core.io.DefaultResourceLoader;
  8 import org.springframework.core.io.Resource;
  9 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 10 
 11 import com.zaxxer.hikari.HikariDataSource;
 12 
 13 /**
 14  * DataConfig,获取数据源,配置给SqlSessionFactory,并以此获取session
 15  * 
 16  * @author liuyuhang
 17  */
 18 @Configuration // 作为配置,交给spring管理
 19 public class DataConfig {
 20 
 21     /**
 22      * 数据源基础配置信息
 23      */
 24     private String url = "jdbc:mysql://xxx.xxx.xxx.xxx:3306/DataBaseName?cuseUnicode=true&characterEncoding=utf-8&useSSL=false";
 25     private String driver = "com.mysql.jdbc.Driver";
 26     private String username = "root";
 27     private String password = "root";
 28 
 29     /**
 30      * sqlSessionFactory
 31      */
 32     private SqlSessionFactory sqlSessionFactory;
 33 
 34     /**
 35      * 双验证单例模式
 36      */
 37     private static volatile DataConfig dataConfig;
 38 
 39     /**
 40      * 构造并对sqlSessionFactory进行一次实例化
 41      * @throws Exception
 42      */
 43     public DataConfig() throws Exception {
 44         System.out.println("DataConfig init");
 45         setSessionFactory(url, driver, username, password);
 46     }
 47 
 48     /**
 49      * 提供双重锁单例,保证sqlSessionFactory只创建一次
 50      * @return
 51      * @throws Exception
 52      */
 53     public static DataConfig getInstenceSingle() throws Exception {
 54         if (dataConfig == null) {
 55             synchronized (DataConfig.class) {
 56                 if (dataConfig == null) {
 57                     dataConfig = new DataConfig();
 58                 }
 59             }
 60         }
 61         return dataConfig;
 62     }
 63 
 64     /**
 65      * 获取sqlSessionFactory的方法
 66      */
 67     public SqlSessionFactory getSqlSessionFactory() throws Exception {
 68         return sqlSessionFactory;
 69     }
 70 
 71     /**
 72      * 配置sqlSessionFactory的方法
 73      * @param url
 74      * @param driver
 75      * @param username
 76      * @param password
 77      * @throws Exception
 78      */
 79     public void setSessionFactory(String url, String driver, String username, String password) throws Exception {
 80         // 创建基础hikari数据源
 81         DataSourceBuilder<HikariDataSource> hikariDataSourceBuilder = DataSourceBuilder.create().type(HikariDataSource.class);
 82         HikariDataSource hikariDataSource = hikariDataSourceBuilder.driverClassName(driver).url(url).username(username).password(password).build();
 83         
 84         //配置Hikari连接池
 85         hikariDataSource.setAutoCommit(true);//update自动提交设置
 86         hikariDataSource.setConnectionTestQuery("select 1");//连接查询语句设置
 87         hikariDataSource.setConnectionTimeout(3000);//连接超时时间设置
 88         hikariDataSource.setIdleTimeout(3000);//连接空闲生命周期设置
 89         hikariDataSource.setIsolateInternalQueries(false);//执行查询启动设置
 90         hikariDataSource.setMaximumPoolSize(3000);//连接池允许的最大连接数量
 91         hikariDataSource.setMaxLifetime(1800000);//检查空余连接优化连接池设置时间,单位毫秒
 92         hikariDataSource.setMinimumIdle(10);//连接池保持最小空余连接数量
 93         hikariDataSource.setPoolName("hikariPool");//连接池名称
 94         
 95         // 创建sessionFactory
 96         SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
 97         factoryBean.setDataSource(hikariDataSource);// 注入Hikari数据源
 98         // 扫描mapper.xml
 99         Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:com/FM/mapper/*.xml");
100         factoryBean.setMapperLocations(resources);
101         // 读取config
102         factoryBean.setConfigLocation(new DefaultResourceLoader().getResource("classpath:mybatis-config.xml"));
103         sqlSessionFactory = factoryBean.getObject();
104         System.out.println("setSessionFactory init");
105     }
106 
107 }

 

5.说明

 

  •   禁用tomcat连接池,并配置Hikari连接池很重要
  •   DataSourceBuilder使用的泛型应为HikariDataSource类
  •   DataSourceBuilder创建数据源时要一次性加载driverClassName,url,username,password,
  •   在不使用连接池情况下,直接加载数据源时,会导致mysql数据库开启连接数量持续增长到最大值,导致mysql数据库无法使用

 

6.测试

 

  测试时应观察mysql连接数量增长情况,总数量,对数据库进行多次请求。

 

 

后记:连接池的使用中应该也会有各种异常情况出现,将会一一记录下来,尝试解析!

 

 

以上!