我有一個Java應用程序,每1分鐘後安排一個cron作業。它運行在Glassfish 4上。我們將Hibernate與JTA Entity Manager一起使用,該容器管理用於執行SQL Server數據庫上的查詢。獲取連接突然增長,導致服務器崩潰
JDBC連接池設置有:
初始和最小池大小:16
最大池尺寸:64
普爾調整產品數量:4
空閒超時:300
最大等待時間:60000
運行22小時後的JDBC連接池統計數據:
NumConnUsed 0count
NumConnAcquired 14404count
NumConnReleased 14404count NumConnCreated 16count
NumConnFree 16count
獲取連接數不斷後10天左右下方例外遞增和GlassFish 4崩潰。
RAR5117:無法從連接池[com.beonic.tiv5]獲取/創建連接。原因:com.sun.appserv.connectors.internal.api.PoolingException:了java.lang.RuntimeException:XAResource.start期間得到了異常:
請建議如何避免Glassfish的崩潰。
你可以把運行作業的代碼?你關閉關閉持久性管理器嗎? – Gatusko
根據文檔 「容器管理的持久性上下文 - 作爲名稱狀態 - 由企業容器管理,容器負責將持久性上下文注入到企業組件中,並且負責在當前的末尾處理它的處置交易。」 我們不能顯式關閉容器管理事務中的實體管理器,因爲它會拋出IllegalStateException異常。 – Rashmi
這是示例代碼示例: public Insight findInsightByName(String name){ \t Context ic; \t EntityManager em; \t Insight loc = null; \t嘗試{ \t \t ic = new InitialContext(); \t \t em =(EntityManager)ic.lookup(kTIv5PU); \t \t LOC =(透視)em.createQuery( 「從洞察d選擇d WHERE d.name =:名稱 」) \t \t \t .setParameter(「 姓名」,名字).getSingleResult(); \t \t \t } \t趕上(NamingException的前){ \t \t Logger.getLogger(TInsightDAO.class.getName())的日誌(Level.SEVERE,空,前)。 \t} \t finally { \t \t em = null; \t \t ic = null; \t} \t return loc; } – Rashmi