DBCP object created 日期 by the following code was never closed:


1、分析    

  看到標題 DBCP 首先想到的肯定是 數據庫連接池哪方面有問題,那么先別着急去解決,不要一股腦就鑽進邏輯代碼中,然后啟用調試就開始一步一步

的分析。我們首先要做的就是想,想想數據庫連接池,在項目中是如何實現的,那么不管你或早或晚,都會想到數據庫連接池相關的配置文件和代碼。那么

問題來了,是否是配置文件配置的有問題(挖掘技術哪家強?)?

  那么先來分析下各項連接池配置的屬性:

  #回收被遺棄的(一般是忘了釋放的)數據庫連接到連接池中。
  dataBase.removeAbandoned =false

  # 數據庫連接過多長時間不用將被視為被遺棄而收回連接池中。
  dataBase.removeAbandonedTimeout = 30

  # 將被遺棄的數據庫連接的回收記入日志。
  dataBase.logAbandoned = false

  #連接池的最大數據庫連接數,設為0 表示無限制。
  dataBase.maxActive = 200

  #數據庫連接的最大空閑連接數。超過此空閑連接數,,數據庫連接將被標記為不可用,然后被釋放。設為0 表示無限制。
  dataBase.maxIdle=40

  #最大建立連接等待時間。如果超過此時間將接到異常。設為-1 表示無限制
  dataBase.maxWait=10000

  #取得、返回對象和空閑時是否進行驗證,檢查對象是否有效,默認都為false即不驗證
  dataBase.testOnBorrow=true
  dataBase.testWhileIdle=true
  dataBase.testOnReturn=true
  dataBase.validationQuery=select 1 from dual

  說明:

  1. #回收被遺棄的(一般是忘了釋放的)數據庫連接到連接池中。
  dataBase.removeAbandoned =false

  如果這個值為true一般是用來調試的時候用的,正式發布后應該改為false,2. # 將被遺棄的數據庫連接的回收記入日志。 

  dataBase.logAbandoned = false

  這個如果設置為true就會引起如下錯誤:
  DBCP object created 日期 by the following code was never closed:
  java.lang.Exception
  

  3.#連接池的最大數據庫連接數,設為0 表示無限制。 

  dataBase.maxActive = 200

  #數據庫連接的最大空閑時間。超過此空閑時間,數據庫連接將被標記為不可用,然后被釋放。設為0 表示無限制。
  dataBase.maxIdle=40

  會有可能出現:Cannot get a connection, pool error Timeout waiting for idle object這樣的錯誤

  (轉載網上資料)  

 

2、深入

  不小心暴露的解決方法,那么 到底是為什么呢?

  原因是:dataBase.removeAbandoned = true  

  設置為true以后,使用這個配置將會使用AbandonedObjectPool,同時上方也提到過,此配置只建議在開發階段使用

  因為,AbandonedObjectPool能幫你發現占用連接過長的代碼,比如LOG信息,說明getCustomerOnline占用連接的時間

  超過了removeAbandonedTimeout設定的時間,所以設置dataBase.removeAbandoned = false就行了,

  AbandonedObjectPool只在開發使用,在后續的版本會去掉,並且現在的API都棄用(不贊成)了,因此在使用此

  功能的時候多多注意。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM