2011-04-18 16 views
9

我在tomcat(版本7)中使用dbcp連接池,並且我的代碼中有一處連接泄漏。很短的時間量之後,一個新的連接請求返回以下異常:試圖確定在tomcat中放棄連接的來源

「無法獲取連接,池錯誤超時等待閒置對象」

我回去通過我的代碼和我來說看起來好像所有的連接都正常關閉(不是每個人都這樣說...)。

爲了調試這個我加入的context.xml以下屬性:

logAbandoned="true" removeAbandoned="true" removeAbandonedTimeout="300" 

所以資源標記現在看起來是這樣的:

<Resource name="jdbc/findata" auth="Container" type="javax.sql.DataSource" 
       maxActive="20" maxIdle="5" maxWait="10000" 
       username="root" password="xxxxxx" driverClassName="com.mysql.jdbc.Driver" 
       logAbandoned="true" removeAbandoned="true" removeAbandonedTimeout="300" 
       url="jdbc:mysql://localhost:3306/findata"/> 

我再啓動Tomcat和開始打網絡直到出現錯誤消息(在瀏覽器窗口中)。但是我還沒有弄清楚「logAbandoned」屬性在哪裏寫信息。我期待在

/usr/share/apache-tomcat-7.0.11/logs 

,但在那裏只在最近修改的日誌文件是

localhost_access_log.2011-04-18.txt 

任何援助深表感謝。

+0

我從來沒有想過如何讓廢棄的連接出現在日誌中,但我又回到了代碼,這次我成功了找出泄漏的來源。誰需要調試器或日誌 - 對嗎? ;) – opike 2011-04-18 19:40:54

回答

4

我在類似的情況所做的是節省線程threadstacks其請求連接,然後在另一個線程打印出有關在每分鐘左右每個打開的連接threadstacks。我想這是做到這一點的蠻力方式。但我很快解決了我的問題。

+1

好的。在close()上從地圖上移除堆棧,對吧?簡單而高效。 – 2011-04-18 14:15:55

3

確保始終關閉連接的一個相對簡單的方法是,將其放入Servlet篩選器中,將其放入ThreadLocal中,通過所有代碼使用該ThreadLocal,然後在響應通過篩選器返回時關閉它。 (優化是將代理放入ThreadLocal,它只在第一個請求上獲得連接)。

但你眼前的問題是要找到泄漏源,對不對?

首先,確保你關閉連接在最後{}語句,所以異常不會阻止你這樣做。

其次,目前還不清楚它需要多長時間logAbandoned找出連接處於空閒狀態。儘量等待一段時間,可能是15分鐘左右。

第三,你可以使用代理的JDBC驅動程序,如http://code.google.com/p/log4jdbc/。它們會生成一個關於連接的所有活動的日誌,因此您可以通過grep查看日誌以找到不匹配的open()和close()。

祝你好運!

7

根據this site必須從您的context.xml提供工廠到資源定義。資源的配置將由該工廠實例完成,因此所有「附加」參數都以此方式設置。更具體的你可以在你的context.xml(或者服務器)中找到類似的東西。XML - 取決於你在哪裏定義資源):

<Resource name="jdbc/db" auth="Container" type="javax.sql.DataSource" 
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1/db" 
username="hibernate" password="hibernate" maxActive="20" maxIdle="10" 
maxWait="1000" removeAbandoned="true" removeAbandonedTimeout="20" 
logAbandoned="true" /> 

通知的factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"這是我們的目的是必不可少的。沒有它removeAbandoned="true"沒有效果。

廢棄的每個連接的堆棧都存儲在catalina.log($tomcat_dir/logs)中。從那裏它將提供相當準確的調試連接細節。

除了「廢棄」參數外,您可以配置許多與tomcat jdbc pool性能,超時和其他色彩和螺栓相關的內容。當然,這需要一些深層次的知識。 (你可以在我最初提供的網站上找到詳細信息)

+0

你從哪裏找到工廠對於removeAbandoned至關重要的信息?我的本地配置沒有工廠。但是,放棄的連接正在關閉。 – KoenigGunther 2015-08-28 12:41:24

+0

這是根據需要在tomcat 7文檔https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html – 2017-01-03 14:47:34