一、必须配置

HikariCP的必需配置主要有3个,一般来说配置了这3个以后,其他默认设置在大多数系统中都表现良好且无须额外调整。这 3 个必需配置如下:

dataSourceClassName或者jdbcUrl(二选一)。
username,用户名。
password,密码。

1.dataSourceClassName

dataSourceClassName和jdbcUr1是两种数据源的配置方式。
HikariCP更加建议使用dataSourceClassName,当然,两者都可以接受。需要注意的是,如果是SpringBoot自动装配的用户,需要使用jdbcUrl的基于配置的方式;当前已知的MySQL DataSource 并不支持网络超时,建议改用jdbcUrl的方式。
但是dataSourceClassName不支持XA数据源。XA需要像bitronix 这样的真正的事务
管理器。注意,如果用户使用的jdbcUrl是“老式”的、基于驱动程序管理器的JDBC驱动
程序配置,则不需要此属性
默认值:无。

2.jdbcUrl

jdbcUrl属性表示HikariCP使用的是传统的、基于驱动管理器 DriverManagerr的配置。
虽然HikariCP作者认为两种配置方式中,基于dataSourceClassName的配置由于各种原因而更优越,但对于许多部署而言,两者几乎没有显著差异。将此属性与“旧”驱动程序一起使用时,可能还需要设置driverClassName属性,所以建议尽量不使用该属性。如果必须使用此属性,则用户应使用DataSource属性来配置驱动程序,建议使用URL本身指定的驱动程序参数。
默认值:无。

3. username和password

username和password分别表示从基础驱动程序获取Connections时使用的默认身份验证用户名和密码。
注意,对于DataSources,
它通过调用DataSource.getConnection(username,password)
来操作底层DataSource,从而以一种非常确定的方式工作。但是,对于基于驱动程序的配置,每个驱动程序Driver都不同。在这种情况下,HikariCP 会将username属性和password 属性分别配置在Properties文件中,从而传递给驱动Driver的DriverManager.getConnection(jdbcUrl, props)调用。也可以直接跳过此方法,并调用addDataSourceProperty(“username”,…)或者 addDataSourceProperty(“pass”,…)。
默认值:无。

4. HikariCP 初始化配置示例

HikariCP采取的是基于DataSource的配置方式,可读性很高。dataSourceClassName或者jdbcUrl,以及username 用户名和password密码都是HikariCP初始化的必需配置,下面以 MySQL 为例来看一下如何运用这几个核心配置进行 HikariCP 的初始化。

第1种方式是HikariConfig。通过HikariConfig设置jdbcUrl、username、password等
核心配置,其他配置使用addDataSourceProperty集成进来。示例代码如下:

Hikariconfig config - new HikariConfig();
config.setJdbcUrl("jdbcimysql://localhost:3306/demo");
config.setUsername("root");
config.setPassword("123456");
config.addDatasourceProperty("cachePrepstmts", "true");
config.addDatasourceProperty("prepstmtCachesize", "250");
config addDatasourceProperty("prepstmtCacheSqlLimit", "2048");
HikariDataSource ds = new HikariDataSource(config)

对于这种方式可以扩展一下,如果需要启用SSL,也可以使用addDataSourceProperty
完成。代码如下:

config.addDatasourceProperty("ssl", "true");

对于一些驱动程序,比如Oracle的配置,也可以使用以下方式加载进来:

config.addDatasourceProperty("oracle.net.CONNECT_TIMEOUT", N ):
config addDatasourceProperty("oracle.jdbc.ReadTimeout", N );

但是使用addDataSourceProperty 这种方式需要注意的问题就是,对于许多驱动程序来说,驱动程序所遵循的属性与DataSource 上的setter之间不存在一对一的映射。使用驱动程序时,设置可能如下:

config.addDataSourceProperty("auto-commit", "true");

但是也有可能是如下所示(这样就很有可能导致DataSource抛出
Property X doesnot exist on target Y 的运行时异常 Runtime Exception):

config.addDatasourceProperty("autoCommit", "true");

HikariConfig的复制语义在实际生产中可以灵活重用以启动另一个池,例如:

HikariConfig config - new HikariConfig();
config.setMaximumPoolsize(8);
config.setPoolName("Pooll");
HikariDatasource ds1 - new HikariDatasource(config)://1Datasource
config.setMaximumPoolsize(20);
config.setPoolName("Pool2");
HikariDatasource ds2 - new HikariDatasource(config)://2Datasource

第2种方式是直接实例化一个HikariDataSource。
这种方式主要是为了方便Spring和其他 IOC 配置框架而提供的。和第1种方式构造函数导致赋值立即发生不一样,第2种方式是在运行getConnection时发生赋值的。赋值的目的就是在启动数据库连接池以后,使用户不要使用配置再次修改数据库连接池的参数。修改数据库连接池唯一支持的方法就是通过HikariConfigMXBean,
但是前提是需要开启HikariConfigMXBean的配置(需要注意的是,它和第1种方法不能合并混用,假如使用的是HikariConfig方法,那么就不要在
HikariDataSource 方法上调用setRegisterMBean(true)了,而是要在 HikariConfig 对象中设置并在创建 HikariDataSource 之前执行)。示例代码如下所示:

HikariDatasource ds - new HikariDatasource():
ds.setJdbcUrl("jdbcimysql://localhost:3306/demo"):
ds.setUsername("root");
ds.setPassword("123456");

第3种方式是加载外部property属性文件,示例代码如下:

// Examines both filesystem and classpath for .properties file
HikariConfig config - new HikariConfig("/some/path/hikari.properties");
HikariDataSource ds = new HikariDatasource(config);

以下是 property 属性文件的示例:

datasourceclassNamemorg.postgresql.ds.PGSimpleDataSource
datasource.user=test
datasource.password=test
datasource.databaseName=mydb
datasource.portNumber=5432
datasource.serverName=localhost

我们可以看到,这里使用了dataSourceClassName的方式进行了PGSimpleDataSource的初始化,而前面两种方式使用的是jdbcurl的方式。

第4种方式是使用java.util.Properties。示例代码如下:

Properties props - new Properties():
props.setProperty("datasourceclassName", "org.postgresql.ds. PGSimpleData-
Source"):
props.setProperty("datasource.user", "test");
props.setProperty("datasource.password", "test");
props.setProperty("datasource.databaseName", "mydb");
props put("datasource.logWriter", new PrintWriter(System.out));
HikariConfig config - new HikariConfig(props):
HikariDataSource ds - new HikariDataSource(config):

还有一个可用的System属性是hikaricp.configurationFile,它可用于指定properties属性文件的位置。如果用户打算使用此选项,应使用默认构造函数构造HikariConfig或HikariDataSource 实例,properties 文件就会被加载进来。
以上4种初始化HikariCP配置的方法,在实际使用时选择一种即可,尤其是前面两种方式,千万不要混合使用。

以 MariaDB 为例,
HikariConfig 的 setConnectionTimeout(1500)和 HikariConfigconfig.addDataSourceProperty(“connectTimeout”, “1500”)
是两个不同的概念,两者都有效,
但是用于不同的情况。前者代表设置应用程序等待池中连接的时间,后者设置池在MariaDB 驱动程序抛出异常之前等待连接数据库的时间。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐