一、为什么使用hikari?
1)在SpringBoot2.x的默认连接池是hikari
2)HikariCP使用Javassist字节码操作库来实现动态代理,优化并精简了字节码,HikariCP应该是目前速度最快的连接池了。
二、实战
1)引入包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
2)参数配置
# jdbc_config datasource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/product?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=123456
# Hikari
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10 #为了性能考虑,不建议设置此值,而是让HikariCP把连接池当做固定大小的处理,默认minimumIdle与maximumPoolSize一样
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000 #当minimumIdle<maximumPoolSize时才生效,空闲连接数超过minimumIdle且空闲时间超过idleTimeout,则会被移除
spring.datasource.hikari.pool-name=ProductHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
3)多数据源情况(扫描不同的package)
@Configuration
@MapperScan(basePackages = "com.test.repository.product", sqlSessionTemplateRef = "commonSqlSessionTemplate")
public class ProductDataSourceConfig {
@Bean(name = "commonDataSource")
@ConfigurationProperties(prefix = "spring.datasource.product")
@Primary
public DataSource commonDataSource() {
DataSource dataSource = DataSourceBuilder.create().type(HikariDataSource.class).build();
return dataSource;
}
@Bean(name = "commonSqlSessionFactory")
@Primary
public SqlSessionFactory commonSqlSessionFactory(@Qualifier("commonDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/product/*.xml"));
return bean.getObject();
}
@Bean(name = "commonTransactionManager")
@Primary
public DataSourceTransactionManager commonTransactionManager(@Qualifier("commonDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "commonSqlSessionTemplate")
@Primary
public SqlSessionTemplate commonSqlSessionTemplate(@Qualifier("commonSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);
return new SqlSessionTemplate(sqlSessionFactory);
}
}
@Configuration
@MapperScan(basePackages = "com.test.repository.order", sqlSessionTemplateRef = "orderSqlSessionTemplate")
public class OrderDataSourceConfig {
@Bean(name = "orderDataSource")
@ConfigurationProperties(prefix = "spring.datasource.order")
@Primary
public DataSource orderDataSource() {
DataSource dataSource = DataSourceBuilder.create().type(HikariDataSource.class).build();
return dataSource;
}
@Bean(name = "commonSqlSessionFactory")
@Primary
public SqlSessionFactory orderSqlSessionFactory(@Qualifier("orderDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/order/*.xml"));
return bean.getObject();
}
@Bean(name = "commonTransactionManager")
@Primary
public DataSourceTransactionManager orderTransactionManager(@Qualifier("orderDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "commonSqlSessionTemplate")
@Primary
public SqlSessionTemplate orderSqlSessionTemplate(@Qualifier("orderSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);
return new SqlSessionTemplate(sqlSessionFactory);
}
}