HikariCP連接池各屬性詳解

寫在前面

HikariCP是一個非常優秀的數據庫連接池組件,這裏我之所以要專門弄一篇文章來講它的相關屬性,是因爲我最近使用SpringBoot架構了一個系統,需要比較細緻的針對數據庫連接池進行配置,所以查閱了相關在資料。GitHub上找到了一個屬性介紹的項目,有興趣的可以直接去看看,這裏我就是基於這個項目進行翻譯,在需要的地方加上我的一些理解。如果覺得有所幫助,記得點個贊以及點個關注哦。

什麼是HikariCP

HikariCP是由日本程序員開源的一個數據庫連接池組件,代碼非常輕量,並且速度非常的快。根據官方提供的數據,在i7,開啓32個線程32個連接的情況下,進行隨機數據庫讀寫操作,HikariCP的速度是現在常用的C3P0數據庫連接池的數百倍。在SpringBoot2.0中,官方默認也是使用的HikariCP作爲數據庫連接池,可見HikariCP連接池的目的就是爲了極致的數據庫連接性能體驗。HikariCP優化機制相對於其他的數據庫連接池,有着以下的優勢。

  • 字節碼精簡,HikariCP優化了代碼,儘量減少了生成的字節碼,使得cpu可以加載更多程序代碼。
  • 優化了攔截和代理機制,HikariCP對攔截器機制和代理機制進行了代碼優化處理,例如Statement proxy只有100行代碼,大大減少了代碼量,只有其他連接池例如BoneCP的十分之一。
  • 自定義數組,HikariCP針對數組操作進行了自定義數組–FastStatementList,用來替代jdk的ArrayList,優化了get、remove等方法,避免了每次調用get的時候進行範圍檢查,也避免了每次remove操作的時候會將數據從頭到尾進行掃描的性能問題。
  • 自定義集合,同樣的,針對jdk自帶的集合類,HikariCP專門封裝了無鎖的集合類型 ,用來提高在使用中的讀寫併發的效率,減少併發造成的資源競爭問題。
  • CPU時間片算法優化,HikariCP也對cpu時間片分配算法進行了優化,儘可能使得一個時間片內完成相關的操作。

主要的屬性詳解

  • dataSourceClassName

這是DataSourceJDBC驅動程序提供的類的名稱。請查閱您的特定JDBC驅動程序的文檔以獲取此類名稱,或參閱下表。注XA數據源不受支持。XA需要像bitronix這樣的真正的事務管理器 。請注意,如果您正在使用jdbcUrl“舊式”基於DriverManager的JDBC驅動程序配置,則不需要此屬性 。 默認值:無

  • jdbcUrl

該屬性指示HikariCP使用“基於DriverManager的”配置。我們認爲基於DataSource的配置(上圖)由於各種原因(參見下文)是優越的,但對於許多部署來說,幾乎沒有顯着差異。 在“舊”驅動程序中使用此屬性時,您可能還需要設置該driverClassName屬性,但不要先嚐試。 請注意,如果使用此屬性,您仍然可以使用DataSource屬性來配置您的驅動程序,實際上建議您使用URL本身中指定的驅動程序參數。 默認值:無

  • username

此屬性設置從基礎驅動程序獲取連接時使用的默認身份驗證用戶名。請注意,對於DataSources,這通過調用DataSource.getConnection(username, password)基礎DataSource 以非常確定的方式工作。但是,對於基於驅動程序的配置,每個驅動程序都不同。在基於驅動程序的情況下,HikariCP將使用此username屬性來設置傳遞給驅動程序調用的user屬性。如果這不是你所需要的,例如完全跳過這個方法並且調用。 默認值:無PropertiesDriverManager.getConnection(jdbcUrl, props)addDataSourceProperty(“username”, …)

  • password

此屬性設置從基礎驅動程序獲取連接時使用的默認身份驗證密碼。請注意,對於DataSources,這通過調用DataSource.getConnection(username, password)基礎DataSource 以非常確定的方式工作。但是,對於基於驅動程序的配置,每個驅動程序都不同。在基於驅動程序的情況下,HikariCP將使用此password屬性來設置傳遞給驅動程序調用的password屬性。如果這不是你所需要的,例如完全跳過這個方法並且調用。 默認值:無PropertiesDriverManager.getConnection(jdbcUrl, props)addDataSourceProperty(“pass”, …)

  • autoCommit

此屬性控制從池返回的連接的默認自動提交行爲。它是一個布爾值。 默認值:true

  • connectionTimeout

此屬性控制客戶端(即您)將等待來自池的連接的最大毫秒數。如果在沒有可用連接的情況下超過此時間,則會拋出SQLException。最低可接受的連接超時時間爲250 ms。 默認值:30000(30秒)

  • idleTimeout

此屬性控制允許連接在池中閒置的最長時間。 此設置僅適用於minimumIdle定義爲小於maximumPoolSize。一旦池達到連接,空閒連接將不會退出minimumIdle。連接是否因閒置而退出,最大變化量爲+30秒,平均變化量爲+15秒。在超時之前,連接永遠不會退出。值爲0意味着空閒連接永遠不會從池中刪除。允許的最小值是10000ms(10秒)。 默認值:600000(10分鐘)

  • maxLifetime

此屬性控制池中連接的最大生存期。正在使用的連接永遠不會退休,只有在關閉後纔會被刪除。在逐個連接的基礎上,應用較小的負面衰減來避免池中的大量消失。 我們強烈建議設置此值,並且應該比任何數據庫或基礎設施規定的連接時間限制短几秒。 值爲0表示沒有最大壽命(無限壽命),當然是idleTimeout設定的主題。 默認值:1800000(30分鐘)

  • connectionTestQuery

如果您的驅動程序支持JDBC4,我們強烈建議您不要設置此屬性。這是針對不支持JDBC4的“傳統”驅動程序Connection.isValid() API。這是在連接從池中獲得連接以確認與數據庫的連接仍然存在之前將要執行的查詢。再一次,嘗試運行沒有此屬性的池,如果您的驅動程序不符合JDBC4的要求,HikariCP將記錄一個錯誤以告知您。 默認值:無

  • minimumIdle

該屬性控制HikariCP嘗試在池中維護的最小空閒連接數。如果空閒連接低於此值並且連接池中的總連接數少於此值maximumPoolSize,則HikariCP將盡最大努力快速高效地添加其他連接。但是,爲了獲得最佳性能和響應尖峯需求,我們建議不要設置此值,而是允許HikariCP充當固定大小的連接池。 默認值:與maximumPoolSize相同

  • maximumPoolSize

此屬性控制池允許達到的最大大小,包括空閒和正在使用的連接。基本上這個值將決定到數據庫後端的最大實際連接數。對此的合理價值最好由您的執行環境決定。當池達到此大小並且沒有空閒連接可用時,對getConnection()的調用將connectionTimeout在超時前阻塞達幾毫秒。請閱讀關於游泳池尺寸。 默認值:10

  • metricRegistry

該屬性僅通過編程配置或IoC容器可用。該屬性允許您指定池使用的Codahale / Dropwizard 實例MetricRegistry來記錄各種指標。有關 詳細信息,請參閱Metrics維基頁面。 默認值:無

  • healthCheckRegistry

該屬性僅通過編程配置或IoC容器可用。該屬性允許您指定池使用的Codahale / Dropwizard 的實例HealthCheckRegistry來報告當前的健康信息。有關 詳細信息,請參閱健康檢查 wiki頁面。 默認值:無

  • poolName

此屬性表示連接池的用戶定義名稱,主要出現在日誌記錄和JMX管理控制檯中以識別池和池配置。 默認:自動生成

  • initializationFailTimeout

如果池無法成功初始化連接,則此屬性控制池是否將“快速失敗”。任何正數都取爲嘗試獲取初始連接的毫秒數; 應用程序線程將在此期間被阻止。如果在超時發生之前無法獲取連接,則會引發異常。此超時被應用後的connectionTimeout 期。如果值爲零(0),HikariCP將嘗試獲取並驗證連接。如果獲得連接但未通過驗證,將拋出異常並且池未啓動。但是,如果無法獲得連接,則會啓動該池,但後續獲取連接的操作可能會失敗。小於零的值將繞過任何初始連接嘗試,並且在嘗試獲取後臺連接時,池將立即啓動。因此,以後努力獲得連接可能會失敗。 默認值:1

  • isolateInternalQueries

此屬性確定HikariCP是否在其自己的事務中隔離內部池查詢,例如連接活動測試。由於這些通常是隻讀查詢,因此很少有必要將它們封裝在自己的事務中。該屬性僅適用於autoCommit禁用的情況。 默認值:false

  • allowPoolSuspension

該屬性控制池是否可以通過JMX暫停和恢復。這對於某些故障轉移自動化方案很有用。當池被暫停時,呼叫 getConnection()將不會超時,並將一直保持到池恢復爲止。 默認值:false

  • readOnly

此屬性控制默認情況下從池中獲取的連接是否處於只讀模式。注意某些數據庫不支持只讀模式的概念,而其他數據庫則在Connection設置爲只讀時提供查詢優化。無論您是否需要此屬性,都將主要取決於您的應用程序和數據庫。 默認值:false

  • registerMbeans

該屬性控制是否註冊JMX管理Bean(“MBeans”)。 默認值:false

  • catalog

該屬性設置默認目錄爲支持目錄的概念數據庫。如果未指定此屬性,則使用由JDBC驅動程序定義的默認目錄。 默認:驅動程序默認

  • connectionInitSql

該屬性設置一個SQL語句,在將每個新連接創建後,將其添加到池中之前執行該語句。如果這個SQL無效或引發異常,它將被視爲連接失敗並且將遵循標準重試邏輯。 默認值:無

  • driverClassName

HikariCP將嘗試通過DriverManager僅基於驅動程序來解析驅動程序jdbcUrl,但對於一些較舊的驅動程序,driverClassName還必須指定它。除非您收到明顯的錯誤消息,指出找不到驅動程序,否則請忽略此屬性。 默認值:無

  • transactionIsolation

此屬性控制從池返回的連接的默認事務隔離級別。如果未指定此屬性,則使用由JDBC驅動程序定義的默認事務隔離級別。如果您有針對所有查詢通用的特定隔離要求,請僅使用此屬性。此屬性的值是從不斷的名稱Connection 類,如TRANSACTION_READ_COMMITTED,TRANSACTION_REPEATABLE_READ等 默認值:驅動程序默認

  • validationTimeout

此屬性控制連接測試活動的最長時間。這個值必須小於connectionTimeout。最低可接受的驗證超時時間爲250 ms。 默認值:5000

  • leakDetectionThreshold

此屬性控制在記錄消息之前連接可能離開池的時間量,表明可能存在連接泄漏。值爲0意味着泄漏檢測被禁用。啓用泄漏檢測的最低可接受值爲2000(2秒)。 默認值:0

  • dataSource

此屬性僅通過編程配置或IoC容器可用。這個屬性允許你直接設置DataSource池的實例,而不是讓HikariCP通過反射來構造它。這在一些依賴注入框架中可能很有用。當指定此屬性時,dataSourceClassName屬性和所有DataSource特定的屬性將被忽略。 默認值:無

  • schema

該屬性設置的默認模式爲支持模式的概念數據庫。如果未指定此屬性,則使用由JDBC驅動程序定義的默認模式。 默認:驅動程序默認

  • threadFactory

此屬性僅通過編程配置或IoC容器可用。該屬性允許您設置java.util.concurrent.ThreadFactory將用於創建池使用的所有線程的實例。在一些只能通過ThreadFactory應用程序容器提供的線程創建線程的有限執行環境中需要它。 默認值:無

  • scheduledExecutor

此屬性僅通過編程配置或IoC容器可用。該屬性允許您設置java.util.concurrent.ScheduledExecutorService將用於各種內部計劃任務的實例。如果爲ScheduledThreadPoolExecutor 實例提供HikariCP,建議setRemoveOnCancelPolicy(true)使用它。 默認值:無

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章