2013-03-12 106 views
0

我遇到了問題,我的Web應用程序凍結了。使用JConsole監視工具,我發現應用程序正在達到maxPoolSize。這是導致應用程序凍結。由於達到maxPoolSize而導致應用程序凍結

系統上有大約20個用戶,每個用戶可以有多個網絡會話。

下面是應用程序中的HttpServlet示例。

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 
    Session sess = null; 
    Transaction tx = null; 
    try { 
     sess = RuntimeContext.getCurrentSession(); 
     tx = sess.beginTransaction(); 
     doingStuffWithSession(req, res, sess); 
     if (!tx.wasCommitted()) { 
      tx.commit(); 
     } 
    } catch (Exception e) { 
     handleException(e, req, sess); 
    } finally { 
     if (sess != null && sess.isOpen() && tx != null && tx.isActive()) { 
       tx.rollback(); 
     } 
    } 
} 

這裏是我的休眠特性在C3P0:

<properties> 
    <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/> 
    <property name="hibernate.archive.autodetection" value="class, hbm"/> 
    <property name="hibernate.c3p0.min_size" value="20" /> 
    <property name="hibernate.c3p0.max_size" value="200" /> 
    <property name="hibernate.c3p0.timeout" value="300" /> 
    <property name="hibernate.c3p0.max_statements" value="50" /> 
    <property name="hibernate.c3p0.idle_test_period" value="3000" /> 
</properties> 

回答

1

它看起來像你持有會話打開(在你的RuntimeContext在運行時),而不是打開和關閉()荷蘭國際集團他們在每次使用時。會話包裝連接;如果你不關閉你的會話,你會耗盡游泳池。承諾或回滾交易是不夠的。

您應該爲每個客戶端打開一個新的會話,並在客戶端完成後立即關閉它。見例如這裏介紹的成語:http://www.tutorialspoint.com/hibernate/hibernate_sessions.htm

相關問題