C3P0 連接池相關概念

C3P0 連接池相關概念

筆者爲了解決服務問題查閱了相關 C3P0 的文檔,然後爲了增強記憶手打該文,並將其作爲筆者自己其他文章的鏈接,故筆者仍將其作爲原創文章。網上有更多更全面的關於 C3P0 連接池的文檔,待包括筆者在內的衆讀者移步參考。
注:文中標紅的參數,是筆者解決項目問題時引起重要影響的參數。

一、簡要介紹

數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重複使用一個現有的數據庫連接,而不是重新再建立一個;釋放空間時間超過最大空閒時間的數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。
C3P0 十一個開源的 JDBC 連接池,它實現了數據源和 JNDI 綁定,支持 JDBC3 規範和 JDBC2 的標準擴展。目前使用它的開源項目有 Hibernate, Spring 等。

二、參數配置

1. 最常用配置:

  • acquireIncrement: 連接池在無空閒連接可用時,一次性創建的新數據庫連接數 (default: 3)
  • initialPoolSize: 連接池初始化時創建的連接數 (default: 3)
  • minPoolSize: 連接池保持的最小連接數 (default: 3)
  • maxPoolSize: 連接池中擁有的最大連接數;如果獲得新連接時會使連接總數超過這個值,則不會再獲取新連接,而是等待其他連接釋放,所以這個值有可能會設計的很大 (default: 15)
  • maxIdleTime: 連接的最大空閒時間,如果超過這個時間,某個數據庫連接還沒有被使用,則會斷開這個連接;如果爲 0,則永遠不會斷開連接,即回收這個連接 (default: 0)

2. 管理連接池的大小和連接的生存時間:

  • maxConnectionAge: 配置連接的生存時間,超過這個時間的連接將由連接池自動斷開丟棄掉。當然正在使用的連接不會馬上斷開。
  • maxIdelTimeExcessConnections: 這個配置主要是爲了快速減輕連接池的負載,比如連接池中連接數因爲某次數據訪問高峯導致創建了很多數據連接,但是後面的時間段需要的數據庫連接數很少,需要快速釋放,必須小於 maxIdleTime。其實這個沒必要配置,maxIdleTime 已經配置了。

3. 配置連接測試:

  • automaticTestTable: 配置一個表名,連接池根據這個表名用自己的測試 sql 語句在這個空表上測試數據庫連接,這個表只能由 C3P0 來使用,用戶不能操作(該參數不建議使用,default: null)
  • perferredTestQuery: 與上面的 automaticTestTable 二者只能選一。自己實現一條 SQL 檢測語句。(default: null)
  • idleConnectionTestPeriod: 用來配置測試空閒連接的間隔時間。測試方式還是上面的兩種之一,可以用來解決 MySQL 8 小時斷開連接的問題。因爲它保證連接池會每隔一定時間對空閒連接進行一次測試,從而保證有效的空閒連接能每隔一定時間訪問一次數據庫,將於 MySQL 8 小時無會話的狀態打破。爲 0 則不測試。(建議使用,default: 0)
  • testConnectionOnCheckin: 如果爲 true,則在 close 的時候測試連接的有效性。(不建議使用,default: false)
  • testConnectionOnCheckout: 性能消耗大。如果爲 true,在每次 getConnection 的時候都會測試,爲了提高性能,儘量不要用(不建議使用,default: false)

4. 配置 PreparedStatement 緩存:

  • maxStatements: 連接池爲數據源緩存的 PreparedStatement 的總數。由於 PreparedStatement 屬於單個 Connection,所以這個數量應該根據應用中平均連接數乘以每個連接的平均 PreparedStatement 來計算。同時 maxStatementsPerConnection 的配置無效。(不建議使用,default: 0)
  • maxStatementsPerConnection: 連接池爲數據源單個 Connection 緩存的 PreparedStatement 數,這個配置比 maxStatements 更有意義,因爲它緩存的服務對象是單個數據連接,如果設置的好,肯定是可以設置性能的。爲 0 時不緩存。(看情況而論,default: 0)

5. 重連相關配置:

  • acquireRetryAttempts: 連接池在獲得新連接失敗時重試的次數,如果小於等於 0 則無限重試直至連接獲得成功。(建議使用,default: 30)
  • acquireRetryDelay: 連接池在獲得新連接時的間隔時間。(建議使用,default: 1000)
  • checkoutTimeout: 配置當連接池所有連接用完時,應用程序 getConnection 的等待時間;爲 0 則無限等待直至有其他連接釋放或者創建新的連接,不爲 0 則當時間到的時候如果仍沒有獲得連接,則會拋出 SQLException。其實就是 acquireRetryAttempts * acquireRetryDelay (與上面兩個有重複,選擇其中兩個都行;default: 0)

6. 定製管理 Connection 的生命週期:

  • connectionZCustormizerClassName: 用來定製 Connection 的管理,比如在 Connection acquired 的時候設定 Connection 的隔離級別,或者在 Connection 丟棄的時候進行資源關閉,就可以通過繼承一個 AbstractConnectionCustomizer 來實現相關方法,配置的時候使用全類名。有點類似監聽器的作用。(不建議使用,default: null)

7. 配置未提交的事務處理:

  • autoCommitOnClose: 連接池在回收數據庫連接時是否自動提交事務。如果爲 false,則會回滾未提交的事務,如果爲 true,則會自動提交事務。(不建議使用,default: false)
  • forceIgnoreUnresolvedTransactions: 這個配置強烈不建議爲 true。(不建議使用,defualt: false)

8. 配置 debug 和回收 Connection:

  • unreturnedConnectionTimeout: 爲 0 時要求所有的 Connection 在應用程序中必須關閉。如果不爲 0,則強制在設定的時間到達後回收 Connection,所以必須小心設置,保證在回收之前所有數據庫操作都能夠完成。這種限制減少 Connection 未關閉情況的不是很實用。建議手動關閉。(不建議使用,default: 0,單位 s)
  • debugUnreturnedConnectionStackTraces: 如果爲 true 並且 unreturnedConnectionTimeout 設爲大於 0 的值,當所有被 getConnection 出去的連接 unreturnedConnectionTimeout 時間到的時候,就會打印出堆棧信息。只能在 debug 模式下適用,因爲打印堆棧信息會減慢 getConnection 的速度(不建議使用,default: false)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章