歡迎訪問我的博客,同步更新: 楓山別院
源代碼版本2.4.5-SNAPSHOT
使用HikariConfig初始化 HikariCP
在《HikariCP源碼分析之初始化分析一》中,我們解析了 HikariCP 的兩種初始化方式,其中提到了使用HikariConfig的方式:
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("123");
//設置數(shù)據(jù)庫獨有的屬性
config.addDataSourceProperty("cachePrepStmts", "true");
//使用HikariConfig構造HikariDataSource
HikariDataSource dataSource = new HikariDataSource(config);
//從連接池獲取連接
Connection connection = dataSource.getConnection();
這種方式是官方推薦的使用方式,會對性能有一定的提升。HikariConfig其實就是 HikariCP 的配置類,我們前面介紹過的HikariDataSource繼承了HikariConfig,所以我們也可以使用HikariDataSource直接初始化 HikariCP,但是這種方式性能比用HikariConfig稍差。
重要的配置
我們今天分析下 HikariCP 中的配置,幾乎所有的配置都在HikariConfig中,是HikariConfig的成員變量。我們看一下:
/* 可以在運行期通過JMX修改的屬性 */
//從連接池獲取連接時最大等待時間, 單位毫秒, 默認值 30秒, 至少 250ms
private volatile long connectionTimeout;
//檢測連接是否有效的超時時間,單位毫秒, 默認 5000ms, 最小 250ms, 不能大于connectionTimeout
//
private volatile long validationTimeout;
//連接可以在池中的最大閑置時間, 單位毫秒, 至少 10s, 默認 10 分鐘, 0 表示永不超時, 該配置不能大于maxLifetime
private volatile long idleTimeout;
//連接泄露檢測的最大時間, 默認 0, 最低 2000毫秒; 也就是說, 連接從拿出連接池到還回連接池的總時間, 不能超出這個時間,超出的話就判定為泄露
private volatile long leakDetectionThreshold;
//連接最大存活時間, 單位毫秒, 最小允許值30000 ms, 默認30分鐘, 推薦設置的比數(shù)據(jù)庫的 wait_timeout 小幾分鐘
private volatile long maxLifetime;
//連接池中可以保留連接的最大數(shù)量, 比如: 100, 則連接池中的連接不能超過 100 個
private volatile int maxPoolSize;
//最小空閑連接數(shù)量, 默認 10 個, 也就是說, 連接池中最多可以保留 10 個空閑的連接, 多的會被關閉
private volatile int minIdle;
/* 在運行期不能修改的屬性 */
//該屬性設置一個SQL語句, 從連接池獲取連接時, 先執(zhí)行改 sql, 驗證連接是否可用, 例子: select 1
//如果是使用了 JDBC 4 那么不建議配置這個選項, 因為JDBC 4 使用 ping 命令, 更加高效
private String connectionTestQuery;
//數(shù)據(jù)庫驅動的dataSource類名, 與jdbcUrl, 必須二選一, 都配置的話, 優(yōu)先使用該屬性, 例子 : org.postgresql.ds.PGSimpleDataSource
private String dataSourceClassName;
private String dataSourceJndiName;
//數(shù)據(jù)庫驅動類, 與dataSourceClassName不共存, 如果配置了這個屬性, 那么jdbcUrl不能為空, 例子: com.mysql.jdbc.Driver
private String driverClassName;
//與dataSourceClassName, 必須二選一, 都配置的話, 忽略該屬性, 例子: jdbc:mysql://localhost:3306/simpsons
private String jdbcUrl;
//必選, 數(shù)據(jù)庫連接密碼
private String password;
//連接池名稱, 默認自動生成, Hikari 將它一般用于記錄日志和 JMX 中, 如果有多個 Hikari 連接池, 建議配置一個有意義的名字
private String poolName;
private String transactionIsolationName;
//必選, 數(shù)據(jù)庫連接用戶名
private String username;
//自動提交事務, 默認值true
private boolean isAutoCommit;
//控制從池中獲取的連接是否是只讀模式, 需要數(shù)據(jù)庫支持只讀模式
private boolean isReadOnly;
//默認值true,是否快速失敗,即在啟動期間創(chuàng)建連接來驗證關鍵參數(shù)是否有錯誤,如果不能建立連接,立即拋出錯誤,方便用戶及時發(fā)現(xiàn)問題
private boolean isInitializationFailFast;
//
private boolean isIsolateInternalQueries;
//是否自動注冊 JMX 相關的 bean, 用于運行時可以修改連接池設置
private boolean isRegisterMbeans;
//是否允許JMX 將連接池掛起
private boolean isAllowPoolSuspension;
//用戶直接指定dataSource實例, 不使用 Hikari 創(chuàng)建的實例
private DataSource dataSource;
上面不是所有的屬性,一些不太重要的屬性我們忽略掉。
HikariConfig的配置可以分為兩部分:可以在運行期修改的,不可以在運行期修改的。
運行期可修改
| 屬性名 | 含義 | 備注 |
|---|---|---|
| connectionTimeout | 從連接池獲取連接時最大等待時間 | 默認值 30秒, 至少 250ms |
| validationTimeout | 檢測連接是否有效的超時時間 | 默認 5000ms, 最小 250ms, 不能大于connectionTimeout |
| idleTimeout | 連接可以在池中的最大閑置時間 | 至少 10s, 默認 10 分鐘, 0 表示永不超時, 該配置不能大于maxLifetime |
| leakDetectionThreshold | 連接泄露檢測的最大時間 | 默認 0表示不啟用, 最低 2000毫秒 |
| maxLifetime | 連接最大存活時間 | 最小允許值30000 ms, 默認30分鐘, 推薦設置的比數(shù)據(jù)庫的 wait_timeout 小幾分鐘 |
| maxPoolSize | 連接池中可以保留連接的最大數(shù)量 | |
| minIdle | 最小空閑連接數(shù)量 | 默認 10 個 |
所謂的運行期可以修改的屬性,就是可以使用 JMX 直接修改,我們再《HikariCP源碼分析之獲取連接流程二》中提到了作者推薦的用法,大家可以看一下。
運行期不可修改
| 屬性名 | 含義 | 備注 |
|---|---|---|
| connectionTestQuery | 驗證連接是否可用的 sql | 例子: select 1,如果是使用了 JDBC 4 那么不建議配置這個選項, 因為JDBC 4 使用 ping 命令, 更加高效 |
| dataSourceClassName | 數(shù)據(jù)庫驅動的dataSource類名 | 與jdbcUrl, 必須二選一, 都配置的話, 優(yōu)先使用該屬性, 例子 : org.postgresql.ds.PGSimpleDataSource |
| driverClassName | 數(shù)據(jù)庫驅動類 | 與dataSourceClassName不共存, 如果配置了這個屬性, 那么jdbcUrl不能為空, 例子: com.mysql.jdbc.Driver |
| jdbcUrl | url | 與dataSourceClassName, 必須二選一, 都配置的話, 忽略該屬性, 例子: jdbc:mysql://localhost:3306/simpsons |
| password | 數(shù)據(jù)庫連接密碼 | |
| username | 數(shù)據(jù)庫連接用戶名 | |
| isRegisterMbeans | 是否自動注冊 JMX 相關的 bean | 用于運行時可以修改連接池設置 |
| isAllowPoolSuspension | 是否允許JMX 將連接池掛起 |
值得一提的是,如果要用 JMX 修改運行時配置,則必須配置isRegisterMbeans和isAllowPoolSuspension。
其實比較重要的是運行時可以修改的那幾個配置,只要搞明白了他們的含義,大家就可以按照自己的情況修改。