天天看點

HikariCP在SpringBoot下的使用

說明

HiKariCP是資料庫連接配接池的一個後起之秀,号稱性能最好,可以完美地PK掉其他連接配接池。

性能比較圖:

HikariCP在SpringBoot下的使用
HikariCP在SpringBoot下的使用

官方github-> https://github.com/brettwooldridge/HikariCP,本文将HiKariCP應用到Springboot項目中,使用Springboot2.0.4.RELEASE+MySQL5+Mybatis進行資料庫查詢

快速開始

首先給出項目結構圖:

HikariCP在SpringBoot下的使用

初始化資料庫的SQL:

CREATE DATABASE `persontest` CHARACTER SET 'utf8';
 
use persontest;
 
CREATE TABLE `persontest`.`userinfo`  (
  `id` int(0) NOT NULL,
  `username` varchar(255) NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO userinfo(id,username) VALUES(0,'CSDN yunlingfly');
INSERT INTO userinfo(id,username) VALUES(1,'dakl');
INSERT INTO userinfo(id,username) VALUES(2,'dhasjk');
           

使用IDEA建立Springboot項目,更新pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.yunlingfly</groupId>
    <artifactId>hikaricp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>hikaricp</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- 引入HikariCP資料庫連接配接池 -->
        <!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>3.2.0</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.10</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
           

更新application.yml:

server:
  port: 8082
spring:
  application:
    name: HikariCP-test
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    type: com.zaxxer.hikari.HikariDataSource
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/persontest?useSSL=false&characterEncoding=utf8
    hikari:
      # 是否自動送出
      auto-commit: true
      # 如果在沒有連接配接可用的情況下超過此時間,則将抛出SQLException
      connection-timeout: 30000
      # 控制允許連接配接在池中空閑的最長時間
      idle-timeout: 600000
      # 控制池中連接配接的最長生命周期。使用中的連接配接永遠不會退役,隻有當它關閉時才會被删除
      max-lifetime: 1800000
      # 如果您的驅動程式支援JDBC4,強烈建議不要設定此屬性
      # connection-test-query:
      # 控制HikariCP嘗試在池中維護的最小空閑連接配接數。建議不要設定此值,而是允許HikariCP充當固定大小的連接配接池。 預設值:與maximumPoolSize相同
      # minimum-idle:
      # 此屬性控制允許池到達的最大大小,包括空閑和正在使用的連接配接。
      maximum-pool-size: 10
info:
  app:
    name: HikariCP-測試
    version: 0.0.1
           

更新Application啟動類:

package cn.yunlingfly.hikaricp;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("cn.yunlingfly.hikaricp.mapper")
public class HikaricpApplication {

    public static void main(String[] args) {
        SpringApplication.run(HikaricpApplication.class, args);
    }
}
           

編寫Person bean類:

package cn.yunlingfly.hikaricp.bean;

public class Person {
    private Integer id;
    private String username;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
           

編寫Mybatis的Mapper接口:

package cn.yunlingfly.hikaricp.mapper;

import cn.yunlingfly.hikaricp.bean.Person;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public interface IPersonMapper {
    @Select("SELECT id, username FROM personinfo WHERE id = #{id}")
    @Results({
            @Result(property = "id", column = "id"),
            @Result(property = "username", column = "username")
    })
    Person findById(@Param(value = "id") String id);

    @Select("SELECT * FROM personinfo")
    @Results({
            @Result(property = "id", column = "id"),
            @Result(property = "username", column = "username")
    })
    List<Person> getAll();

    @Insert("INSERT INTO personinfo(id,username) VALUES(#{id}, #{username})")
    void insert(Person user);

    @Update("UPDATE personinfo SET username=#{username} WHERE id =#{id}")
    void update(Person user);

    @Delete("DELETE FROM personinfo WHERE id =#{id}")
    void delete(Integer id);

}
           

Service接口和其實作類的編寫:

package cn.yunlingfly.hikaricp.service;

import cn.yunlingfly.hikaricp.bean.Person;

import java.util.List;

public interface IPersonService {
    List<Person> listAll();
    void insertOne(Person p);
}
           
package cn.yunlingfly.hikaricp.service.impl;

import cn.yunlingfly.hikaricp.bean.Person;
import cn.yunlingfly.hikaricp.mapper.IPersonMapper;
import cn.yunlingfly.hikaricp.service.IPersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class PersonServiceImpl implements IPersonService {
    @Autowired
    IPersonMapper iPersonMapper;

    @Override
    public List<Person> listAll() {
        return iPersonMapper.getAll();
    }

    // 使用@Transactional開啟事務,出錯抛出RuntimeException
    @Transactional(rollbackFor = RuntimeException.class)
    @Override
    public void insertOne(Person p) throws RuntimeException {
        iPersonMapper.insert(p);
    }
}
           

Controller層的編寫:

package cn.yunlingfly.hikaricp.controller;

import cn.yunlingfly.hikaricp.bean.Person;
import cn.yunlingfly.hikaricp.service.IPersonService;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class PersonController {

    @Autowired
    @Qualifier("personServiceImpl")
    IPersonService iPersonService;

    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public List<Person> getAll(){
        List<Person> list=iPersonService.listAll();
        System.out.println("選出所有的人:"+JSON.toJSONString(list));
        return list;
    }

    @RequestMapping(value = "/posttest",method = RequestMethod.POST)
    public List<Person> insertOne(Person p){
        System.out.println(p.getId()+" And "+p.getUsername());
        iPersonService.insertOne(p);
        return getAll();
    }
}
           

運作結果

HikariCP在SpringBoot下的使用

網頁通路http://localhost:8082/hello即可看到效果:

HikariCP在SpringBoot下的使用

最後放上筆者該項目的github倉庫->https://github.com/Yunlingfly/HikariCP

更多有關于HikariCP配置參數含義戳->https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby

HikariCP在SpringBoot下的使用

繼續閱讀