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连接数量增长情况,总数量,对数据库进行多次请求。
后记:连接池的使用中应该也会有各种异常情况出现,将会一一记录下来,尝试解析!
以上!