說明
HiKariCP是資料庫連接配接池的一個後起之秀,号稱性能最好,可以完美地PK掉其他連接配接池。
性能比較圖:
官方github-> https://github.com/brettwooldridge/HikariCP,本文将HiKariCP應用到Springboot項目中,使用Springboot2.0.4.RELEASE+MySQL5+Mybatis進行資料庫查詢
快速開始
首先給出項目結構圖:
初始化資料庫的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();
}
}
運作結果
網頁通路http://localhost:8082/hello即可看到效果:
最後放上筆者該項目的github倉庫->https://github.com/Yunlingfly/HikariCP
更多有關于HikariCP配置參數含義戳->https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby