hikari如何切换数据源_HikariCP配置详解+多数据源

本文详细介绍了HikariCP在SpringBoot中的配置,包括基本配置、默认参数及其意义,并展示了如何设置多数据源,包括primary和second两个数据源的配置实例。
摘要由CSDN通过智能技术生成

SpringBoot 2.0 开始推 HikariCP ,将默认的数据库连接池从 tomcat jdbc pool 改为了 hikari , HikariCP 在性能和并发方面确实表现不俗(号称最快的连接池)。

如果你使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa ,会自动添加对 HikariCP 的依赖,也就是说此时使用 HikariCP 。当然你也可以强制使用其它的连接池技术,可以通过在 application.properties 或 application.yml 中配置 spring.datasource.type 指定。

基本配置

因为已经默认使用 HikariCP,所以只需要在 yaml 中添加数据库配置即可:

url: jdbc:mysql://localhost:3306?useSSL=false

username: root

password: 1234

HikariCP 默认配置

主要参数是在 com.zaxxer.hikari.HikariConfig 中初始化的,部分参数是在 com.zaxxer.hikari.pool.PoolBase 中初始化的。

springboot的HikariDataSource默认配置的默认值如下

name构造器默认值默认配置validate之后的值validate重置

minIdle

-1

10

minIdle<0或者minIdle>maxPoolSize,则被重置为maxPoolSize

maxPoolSize

-1

10

如果maxPoolSize小于1,则会被重置。当minIdle<=0被重置为DEFAULT_POOL_SIZE则为10;如果minIdle>0则重置为minIdle的值

maxLifetime

MINUTES.toMillis(30) = 1800000

1800000

如果不等于0且小于30秒则会被重置回30分钟

connectionTimeout

SECONDS.toMillis(30) = 30000

30000

如果小于250毫秒,则被重置回30秒

validationTimeout

SECONDS.toMillis(5) = 5000

5000

如果小于250毫秒,则会被重置回5秒

loginTimeout

10

30

Math.max(1, (int) MILLISECONDS.toSeconds(500L + connectionTimeout)),为connectionTimeout+500ms转为秒数取整 与 1 取最大者

idleTimeout

MINUTES.toMillis(10) = 600000

600000

如果idleTimeout+1秒>maxLifetime 且 maxLifetime>0,则会被重置为0;如果idleTimeout!=0且小于10秒,则会被重置为10秒

leakDetectionThreshold

0

0

如果大于0且不是单元测试,则进一步判断:(leakDetectionThreshold < SECONDS.toMillis(2) or (leakDetectionThreshold > maxLifetime && maxLifetime > 0),会被重置为0 . 即如果要生效则必须>0,而且不能小于2秒,而且当maxLifetime > 0时不能大于maxLifetime

initializationFailTimeout

1

1

-

isAutoCommit

true

true

-

isReadOnly

false

fasle

-

isAllowPoolSuspension

false

false

-

isIsolateInternalQueries

false

false

-

isRegisterMbeans

false

false

-

sealed

false

true

运行启动后这个标志为true,表示不再运行修改

poolName

null

HikariPool-1

-

catalog

null

null

-

connectionInitSql

null

null

-

connectionTestQuery

null

null

-

dataSourceClassName

null

null

-

schema

null

null

-

transactionIsolationName

null

null

-

dataSource

null

null

-

dataSourceProperties

{}

{}

-

threadFactory

null

null

-

scheduledExecutor

null

null

-

metricsTrackerFactory

null

null

-

metricRegistry

null

null

-

healthCheckRegistry

null

null

-

healthCheckProperties

{}

{}

-

HikariCP 配置多数据源

application.yml :

hikari:

primary:

jdbc-url: jdbc:mysql://localhost:3306/xu?useSSL=false

username: root

password: 1234

second:

jdbc-url: jdbc:mysql://localhost:3306/hua?useSSL=false

username: root

password: 1234

PrimaryDatasourceConfig:

@Configuration

@MapperScan(basePackages = PrimaryDatasourceConfig.PACKAGE,sqlSessionFactoryRef = "primarySqlSessionFactory")

public class PrimaryDatasourceConfig {

static final String PACKAGE = "com.xu.scaffold.repository.primary";

@Bean(name = "primaryDataSource")

@Primary

@ConfigurationProperties(prefix = "hikari.primary")

public HikariDataSource dataSource() {

return new HikariDataSource();

}

@Bean(name = "primaryTransactionManager")

@Primary

public DataSourceTransactionManager transactionManager() {

return new DataSourceTransactionManager(this.dataSource());

}

@Bean(name = "primarySqlSessionFactory")

@Primary

public SqlSessionFactory sqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {

final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

sessionFactory.setDataSource(dataSource);

sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);

return sessionFactory.getObject();

}

}

SecondDatasourceConfig:

@Configuration

@MapperScan(basePackages = SecondDatasourceConfig.PACKAGE, sqlSessionFactoryRef = "secondSqlSessionFactory")

public class SecondDatasourceConfig {

static final String PACKAGE = "com.xu.scaffold.repository.second";

@Bean(name = "secondDataSource")

@ConfigurationProperties(prefix = "hikari.second")

public HikariDataSource dataSource() {

return new HikariDataSource();

}

@Bean(name = "secondTransactionManager")

public DataSourceTransactionManager transactionManager() {

return new DataSourceTransactionManager(this.dataSource());

}

@Bean(name = "secondSqlSessionFactory")

public SqlSessionFactory sqlSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception {

final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

sessionFactory.setDataSource(dataSource);

sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);

return sessionFactory.getObject();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值