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


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

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

    系列目录连接

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

    1.环境说明

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

      

      pom

      1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      3     <modelVersion>4.0.0</modelVersion>
      4     <groupId>Tit</groupId>
      5     <artifactId>FM</artifactId>
      6     <version>0.0.1-SNAPSHOT</version>
      7     <packaging>war</packaging>
      8 
      9     <parent>
     10         <groupId>org.springframework.boot</groupId>
     11         <artifactId>spring-boot-starter-parent</artifactId>
     12         <version>1.5.3.RELEASE</version>
     13         <relativePath /> <!-- lookup parent from repository -->
     14     </parent>
     15     <dependencies>
     16 
     17         <!-- spring boot web -->
     18         <dependency>
     19             <groupId>org.springframework.boot</groupId>
     20             <artifactId>spring-boot-starter-web</artifactId>
     21         </dependency>
     22 
     23         <dependency>
     24             <groupId>junit</groupId>
     25             <artifactId>junit</artifactId>
     26             <version>3.8.1</version>
     27             <scope>test</scope>
     28         </dependency>
     29 
     30         <dependency>
     31             <groupId>org.apache.tomcat.embed</groupId>
     32             <artifactId>tomcat-embed-logging-juli</artifactId>
     33             <version>7.0.62</version>
     34         </dependency>
     35 
     36         <!-- 添加MySQL依赖 -->
     37         <dependency>
     38             <groupId>mysql</groupId>
     39             <artifactId>mysql-connector-java</artifactId>
     40         </dependency>
     41         <!-- 添加JDBC依赖 -->
     42         <dependency>
     43             <groupId>org.springframework.boot</groupId>
     44             <artifactId>spring-boot-starter-jdbc</artifactId>
     45         </dependency>
     46         <!-- mybaits基础依赖 -->
     47         <dependency>
     48             <groupId>org.mybatis</groupId>
     49             <artifactId>mybatis</artifactId>
     50             <version>3.4.0</version>
     51         </dependency>
     52         <!-- mybatis插件依赖 -->
     53         <dependency>
     54             <groupId>org.mybatis.spring.boot</groupId>
     55             <artifactId>mybatis-spring-boot-starter</artifactId>
     56             <version>1.1.1</version>
     57         </dependency>
     58         <!-- mapper依赖 -->
     59         <dependency>
     60             <groupId>tk.mybatis</groupId>
     61             <artifactId>mapper</artifactId>
     62             <version>3.3.7</version>
     63         </dependency>
     64 
     65 
     66         <dependency>
     67             <groupId>org.springframework.boot</groupId>
     68             <artifactId>spring-boot-configuration-processor</artifactId>
     69             <optional>true</optional>
     70         </dependency>
     71 
     72         <!-- 热部署 -->
     73         <dependency>
     74             <groupId>org.springframework.boot</groupId>
     75             <artifactId>spring-boot-devtools</artifactId>
     76             <optional>true</optional>
     77             <scope>true</scope>
     78         </dependency>
     79         <!-- end of 热部署 -->
     80     </dependencies>
     81 
     82     <properties>
     83         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     84         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     85         <java.version>1.7</java.version>
     86 
     87         <webVersion>3.0</webVersion>
     88     </properties>
     89     <build>
     90         <finalName>FM</finalName>
     91         <plugins>
     92             <plugin>
     93                 <groupId>org.springframework.boot</groupId>
     94                 <artifactId>spring-boot-maven-plugin </artifactId>
     95             </plugin>
    122         </plugins>
    143 
    144     </build>
    145 </project>

    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.apache.tomcat.jdbc.pool.DataSource;
      5 import org.apache.tomcat.jdbc.pool.PoolProperties;
      6 import org.mybatis.spring.SqlSessionFactoryBean;
      7 import org.springframework.context.annotation.Configuration;
      8 import org.springframework.core.io.DefaultResourceLoader;
      9 import org.springframework.core.io.Resource;
     10 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
     11 /**
     12  * 单例数据源配置
     13  * @author Liuyuhang
     14  *
     15  */
     16 @Configuration
     17 public class DataConfig {
     18 
     19     private static final String url = "jdbc:mysql://xxx.xxx.xxx.xxx:3306/dataBaseName?cuseUnicode=true&characterEncoding=utf-8&useSSL=false";
     20     private static final String driver = "com.mysql.jdbc.Driver";
     21     private static final String username = "root";
     22     private static final String password = "root";
     23 
     24     /**
     25      * SqlSessionFactory
     26      */
     27     private SqlSessionFactory sqlSessionFactory = null;
     28 
     29     /**
     30      * 单例的类对象
     31      */
     32     private static volatile DataConfig dataConfig;
     33     
     34     /**
     35      * 无参构造
     36      * @throws Exception
     37      */
     38     public DataConfig() throws Exception {
     39         setSqlSessionFactory();
     40         System.out.println("DataConfig init");
     41     }
     42     
     43     /**
     44      * 双验证单例模式
     45      * @return
     46      * @throws Exception
     47      */
     48     public static DataConfig getInstence() throws Exception{
     49         if(null==dataConfig){
     50             synchronized (DataConfig.class) {
     51                 if(null==dataConfig){
     52                     dataConfig = new DataConfig();
     53                     
     54                 }
     55             }
     56         }
     57         return dataConfig;
     58     }
     59 
     60     /**
     61      * tomcat pool配置
     62      * @param url
     63      * @param dirver
     64      * @param username
     65      * @param password
     66      * @return
     67      */
     68     public DataSource dataSource(String url, String dirver, String username, String password) {
     69         PoolProperties p = new PoolProperties();
     70         p.setUrl(url);
     71         p.setDriverClassName(dirver);
     72         p.setUsername(username);
     73         p.setPassword(password);
     74         p.setTestWhileIdle(false);
     75         p.setTestOnBorrow(true);
     76         p.setValidationQuery("SELECT 1");
     77         p.setTestOnReturn(false);
     78         p.setValidationInterval(30000);
     79         p.setTimeBetweenEvictionRunsMillis(30000);
     80         p.setMaxActive(100);
     81         p.setInitialSize(10);
     82         p.setMaxWait(10000);
     83         p.setRemoveAbandonedTimeout(60);
     84         p.setMinEvictableIdleTimeMillis(30000);
     85         p.setMinIdle(10);
     86         p.setLogAbandoned(true);
     87         p.setRemoveAbandoned(true);
     88         DataSource datasource = new DataSource();
     89         datasource.setPoolProperties(p);
     90         return datasource;
     91     }
     92 
     93     /**
     94      * setSqlSessionFactory,构造的时候运行一次,可实例化以后也可手动调用修改SqlSessionFactory
     95      * @throws Exception
     96      */
     97     public void setSqlSessionFactory() throws Exception {
     98         DataSource dataSource = dataSource(url, driver, username, password);
     99         // 创建sessionFactory
    100         SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
    101         factoryBean.setDataSource(dataSource);// 加载数据源
    102         // 扫描mapper.xml
    103         Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:com/FM/mapper/*.xml");
    104         factoryBean.setMapperLocations(resources);
    105         // 读取config
    106         factoryBean.setConfigLocation(new DefaultResourceLoader().getResource("classpath:mybatis-config.xml"));
    107         this.sqlSessionFactory = factoryBean.getObject();
    108         System.out.println("setSqlSessionFactory init");
    109     }
    110 
    111     /**
    112      * 获取SqlSessionFactory
    113      * @return
    114      * @throws Exception
    115      */
    116     public SqlSessionFactory getSessionFactory() throws Exception {
    117         if (null == sqlSessionFactory) {
    118             setSqlSessionFactory();
    119         }
    120         return this.sqlSessionFactory;
    121     }
    122 
    123 }

    5.说明

    •   在不使用连接池情况下,直接加载数据源时,会导致mysql数据库开启连接数量持续增长到最大值,导致mysql数据库无法使用

    6.测试

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

     

    以上!

  • 相关阅读:
    贴图UV动画
    编辑器开发读取LIGHTMAP的脚本
    一个角色旋转身体在向前行走的代码
    第一周
    《大道至简》读后感
    第二周
    Easyui,好的设计思路
    有关反射
    Easyui表格的行编辑
    冒泡排序
  • 原文地址:https://www.cnblogs.com/liuyuhangCastle/p/9721231.html
Copyright © 2020-2023  润新知