2016-12-14 63 views
0

我使用了SQL Server 2008和得到警告/異常列表並未中斷或不能正常斷開數據庫的連接

WARNING [Tomcat JDBC Pool Cleaner[510210701:1481713957404]] org.apache.tomcat.jdbc.pool.ConnectionPool.suspect Connection has been marked suspect, possibly abandoned PooledConnection[[email protected]][67975 ms.]:java.lang.Exception 
後動態Java Web應用程序(的Tomcat 8.0.15,Java EE的7網頁)

相當經常我想知道我的源代碼深處的某處我忘了將JDBC或Hibernate連接斷開連接到數據庫。我想以某種方式列出它們。

定期

static 
    { 
     try { 
      Context context = new InitialContext(); 
      dataSource = (DataSource) context.lookup("java:comp/env/jdbc/sqlserv"); 
     } catch (NamingException ex) { 
      Logger.getLogger(Basisverbindung.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

做這項工作,在我的hibernate.cfg.xml這是相同的:

<property name="hibernate.connection.datasource">java:comp/env/jdbc/sqlserv</property> 

我通過#2看了一下,發現我已經諮詢了只有幾個條目(甚至upvoted):

但問題仍然存在,或一段時間後再次出現,所以我想找到一種方法如何追查,我忘了關閉連接。在我的Tomcat上,還有一個PSI Probe正在運行,告訴我在請求中會出現一些錯誤,並且有時候會延長響應時間。 我在那裏看到一個很好的請求列表,但不知道哪些請求被放棄。

SQL-Server Management Studio中的ActivityMonitor沒有太多的幫助,它列出了我知道它們關閉(或很好,應該是)的一些進程。

什麼是分析這類問題的最佳方法?

回答

0

你真正想要做的是啓用「廢棄連接」跟蹤和報告。

你沒有說你正在使用哪個Tomcat的JDBC數據源池(有兩個),但它們同樣配置:

  1. commons-dbcp2爲基礎的:logAbandoned=trueremoveAbandonedOnBorrow=true
  2. tomcat-jdbc爲基礎的: logAbandoned=trueremoveAbandoned=true

我總是建議大家在開發環境1最大池大小運行。這將幫助您快速識別池泄漏非常,再加上您可能已在您的代碼中植入的任何潛在的死鎖。

+0

我正在使用tomcat-jdbc並設置了兩個選項 – Qohelet

+0

......並且您沒有看到堆棧跟蹤的連接或Statement對象未正確關閉的位置? –

+0

我正在使用一個處理連接分配的靜態類(我可以發佈代碼的其餘部分,但它不是太好)。所以大多數堆棧只是指那個類... – Qohelet