歡迎訪問個人博客,同步更新: 楓山別院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 修改運行時配置,則必須配置isRegisterMbeans
和isAllowPoolSuspension
。postgresql
其實比較重要的是運行時能夠修改的那幾個配置,只要搞明白了他們的含義,你們就能夠按照本身的狀況修改。code