HikariConfig配置解析

歡迎訪問我的博客,同步更新: 楓山別院

源代碼版本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 修改運行時配置,則必須配置isRegisterMbeansisAllowPoolSuspension。

其實比較重要的是運行時可以修改的那幾個配置,只要搞明白了他們的含義,大家就可以按照自己的情況修改。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容