HikariConfig配置解析

歡迎訪問個人博客,同步更新: 楓山別院mysql

源代碼版本2.4.5-SNAPSHOTsql

使用HikariConfig初始化 HikariCP

在《HikariCP源碼分析之初始化分析一》中,咱們解析了 HikariCP 的兩種初始化方式,其中提到了使用HikariConfig的方式:數據庫

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("123");
//設置數據庫獨有的屬性
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的成員變量。咱們看一下:post

/* 能夠在運行期經過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分鐘, 推薦設置的比數據庫的 wait_timeout 小几分鐘
   private volatile long maxLifetime;
   //鏈接池中能夠保留鏈接的最大數量, 好比: 100, 則鏈接池中的鏈接不能超過 100 個
   private volatile int maxPoolSize;
   //最小空閒鏈接數量, 默認 10 個, 也就是說, 鏈接池中最多能夠保留 10 個空閒的鏈接, 多的會被關閉
   private volatile int minIdle;

   /* 在運行期不能修改的屬性 */

   //該屬性設置一個SQL語句, 從鏈接池獲取鏈接時, 先執行改 sql, 驗證鏈接是否可用, 例子: select 1
   //若是是使用了 JDBC 4 那麼不建議配置這個選項, 由於JDBC 4 使用 ping 命令, 更加高效
   private String connectionTestQuery;
   //數據庫驅動的dataSource類名, 與jdbcUrl, 必須二選一, 都配置的話, 優先使用該屬性, 例子 : org.postgresql.ds.PGSimpleDataSource
   private String dataSourceClassName;
   private String dataSourceJndiName;
   //數據庫驅動類, 與dataSourceClassName不共存, 若是配置了這個屬性, 那麼jdbcUrl不能爲空, 例子: com.mysql.jdbc.Driver
   private String driverClassName;
   //與dataSourceClassName, 必須二選一, 都配置的話, 忽略該屬性, 例子: jdbc:mysql://localhost:3306/simpsons
   private String jdbcUrl;
   //必選, 數據庫鏈接密碼
   private String password;
   //鏈接池名稱, 默認自動生成, Hikari 將它通常用於記錄日誌和 JMX 中, 若是有多個 Hikari 鏈接池, 建議配置一個有意義的名字
   private String poolName;
   private String transactionIsolationName;
   //必選, 數據庫鏈接用戶名
   private String username;
   //自動提交事務, 默認值true
   private boolean isAutoCommit;
   //控制從池中獲取的鏈接是不是隻讀模式, 須要數據庫支持只讀模式
   private boolean isReadOnly;
   //默認值true,是否快速失敗,即在啓動期間建立鏈接來驗證關鍵參數是否有錯誤,若是不能創建鏈接,當即拋出錯誤,方便用戶及時發現問題
   private boolean isInitializationFailFast;
   //
   private boolean isIsolateInternalQueries;
   //是否自動註冊 JMX 相關的 bean, 用於運行時能夠修改鏈接池設置
   private boolean isRegisterMbeans;
   //是否容許JMX 將鏈接池掛起
   private boolean isAllowPoolSuspension;
   //用戶直接指定dataSource實例, 不使用 Hikari 建立的實例
   private DataSource dataSource;

上面不是全部的屬性,一些不過重要的屬性咱們忽略掉。性能

HikariConfig的配置能夠分爲兩部分:能夠在運行期修改的,不能夠在運行期修改的。url

運行期可修改

屬性名 含義 備註
connectionTimeout 從鏈接池獲取鏈接時最大等待時間 默認值 30秒, 至少 250ms
validationTimeout 檢測鏈接是否有效的超時時間 默認 5000ms, 最小 250ms, 不能大於connectionTimeout
idleTimeout 鏈接能夠在池中的最大閒置時間 至少 10s, 默認 10 分鐘, 0 表示永不超時, 該配置不能大於maxLifetime
leakDetectionThreshold 鏈接泄露檢測的最大時間 默認 0表示不啓用, 最低 2000毫秒
maxLifetime 鏈接最大存活時間 最小容許值30000 ms, 默認30分鐘, 推薦設置的比數據庫的 wait_timeout 小几分鐘
maxPoolSize 鏈接池中能夠保留鏈接的最大數量
minIdle 最小空閒鏈接數量 默認 10 個

所謂的運行期能夠修改的屬性,就是可使用 JMX 直接修改,咱們再《HikariCP源碼分析之獲取鏈接流程二》中提到了做者推薦的用法,你們能夠看一下。日誌

運行期不可修改

屬性名 含義 備註
connectionTestQuery 驗證鏈接是否可用的 sql 例子: select 1,若是是使用了 JDBC 4 那麼不建議配置這個選項, 由於JDBC 4 使用 ping 命令, 更加高效
dataSourceClassName 數據庫驅動的dataSource類名 與jdbcUrl, 必須二選一, 都配置的話, 優先使用該屬性, 例子 : org.postgresql.ds.PGSimpleDataSource
driverClassName 數據庫驅動類 與dataSourceClassName不共存, 若是配置了這個屬性, 那麼jdbcUrl不能爲空, 例子: com.mysql.jdbc.Driver
jdbcUrl url 與dataSourceClassName, 必須二選一, 都配置的話, 忽略該屬性, 例子: jdbc:mysql://localhost:3306/simpsons
password 數據庫鏈接密碼
username 數據庫鏈接用戶名
isRegisterMbeans 是否自動註冊 JMX 相關的 bean 用於運行時能夠修改鏈接池設置
isAllowPoolSuspension 是否容許JMX 將鏈接池掛起

值得一提的是,若是要用 JMX 修改運行時配置,則必須配置isRegisterMbeansisAllowPoolSuspensionpostgresql

其實比較重要的是運行時能夠修改的那幾個配置,只要搞明白了他們的含義,你們就能夠按照本身的狀況修改。code

相關文章
相關標籤/搜索