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

时间:2023-03-09 08:39:50
DB数据源之SpringBoot+MyBatis踏坑过程(五)手动使用Hikari连接池

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

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

系列目录连接

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

1.环境说明

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

  pom

  

 <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath />
</parent> <dependencies> <!-- spring boot web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- 添加MySQL依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> <!-- 添加JDBC依赖 重要-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<!--去掉默认的tomcat-jdbc的依赖 重要-->
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加 HikariCP数据源 重要-->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency> <!-- mybaits基础依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<!-- mybatis插件依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- mapper依赖 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.3.7</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency> <!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<!-- end of 热部署 -->
</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代码如下:

 package com.FM.config;

 import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import com.zaxxer.hikari.HikariDataSource; /**
* DataConfig,获取数据源,配置给SqlSessionFactory,并以此获取session
*
* @author liuyuhang
*/
@Configuration // 作为配置,交给spring管理
public class DataConfig { /**
* 数据源基础配置信息
*/
private String url = "jdbc:mysql://xxx.xxx.xxx.xxx:3306/DataBaseName?cuseUnicode=true&characterEncoding=utf-8&useSSL=false";
private String driver = "com.mysql.jdbc.Driver";
private String username = "root";
private String password = "root"; /**
* sqlSessionFactory
*/
private SqlSessionFactory sqlSessionFactory; /**
* 双验证单例模式
*/
private static volatile DataConfig dataConfig; /**
* 构造并对sqlSessionFactory进行一次实例化
* @throws Exception
*/
public DataConfig() throws Exception {
System.out.println("DataConfig init");
setSessionFactory(url, driver, username, password);
} /**
* 提供双重锁单例,保证sqlSessionFactory只创建一次
* @return
* @throws Exception
*/
public static DataConfig getInstenceSingle() throws Exception {
if (dataConfig == null) {
synchronized (DataConfig.class) {
if (dataConfig == null) {
dataConfig = new DataConfig();
}
}
}
return dataConfig;
} /**
* 获取sqlSessionFactory的方法
*/
public SqlSessionFactory getSqlSessionFactory() throws Exception {
return sqlSessionFactory;
} /**
* 配置sqlSessionFactory的方法
* @param url
* @param driver
* @param username
* @param password
* @throws Exception
*/
public void setSessionFactory(String url, String driver, String username, String password) throws Exception {
// 创建基础hikari数据源
DataSourceBuilder<HikariDataSource> hikariDataSourceBuilder = DataSourceBuilder.create().type(HikariDataSource.class);
HikariDataSource hikariDataSource = hikariDataSourceBuilder.driverClassName(driver).url(url).username(username).password(password).build(); //配置Hikari连接池
hikariDataSource.setAutoCommit(true);//update自动提交设置
hikariDataSource.setConnectionTestQuery("select 1");//连接查询语句设置
hikariDataSource.setConnectionTimeout(3000);//连接超时时间设置
hikariDataSource.setIdleTimeout(3000);//连接空闲生命周期设置
hikariDataSource.setIsolateInternalQueries(false);//执行查询启动设置
hikariDataSource.setMaximumPoolSize(3000);//连接池允许的最大连接数量
hikariDataSource.setMaxLifetime(1800000);//检查空余连接优化连接池设置时间,单位毫秒
hikariDataSource.setMinimumIdle(10);//连接池保持最小空余连接数量
hikariDataSource.setPoolName("hikariPool");//连接池名称 // 创建sessionFactory
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(hikariDataSource);// 注入Hikari数据源
// 扫描mapper.xml
Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:com/FM/mapper/*.xml");
factoryBean.setMapperLocations(resources);
// 读取config
factoryBean.setConfigLocation(new DefaultResourceLoader().getResource("classpath:mybatis-config.xml"));
sqlSessionFactory = factoryBean.getObject();
System.out.println("setSessionFactory init");
} }

5.说明

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

6.测试

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

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

以上!