zoukankan      html  css  js  c++  java
  • DB数据源之SpringBoot+MyBatis踏坑过程(五)手动使用Hikari连接池

    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连接数量增长情况,总数量,对数据库进行多次请求。

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

    以上!

  • 相关阅读:
    软工实践个人总结
    第05组 每周小结 (3/3)
    第05组 每周小结 (2/3)
    第05组 每周小结 (1/3)
    第05组 Beta冲刺 总结
    第05组 Beta冲刺 (5/5)
    第05组 Beta冲刺 (4/5)
    第六次作业
    第05组 Beta冲刺 (3/5)
    第05组 Beta冲刺 (2/5)
  • 原文地址:https://www.cnblogs.com/liuyuhangCastle/p/9689736.html
Copyright © 2011-2022 走看看