java – 在Web应用程序中创建EntityManager每个HttpSession的潜在问题

在其中一个应用程序中,我看到Entity Manager是每个用户HttpSession创建的,EntityManagerFactory只创建一次.

Spring或EJB不适用于应用程序.
实体管理器缓存在http会话中,会话无效时关闭.

public EntityManager getEntityManager() { 
    //Logic to get entity manger from session
    //If its present , then return 
    //Else create new one , entityManagerFactory.createEntityManager();
    //Put it into session and then return.
    //Returned entity manager is not closed by dao methods , 
    //but clear() is invoked
}

>这个设计有什么潜在的问题.
>如果100K用户同时登录到应用程序怎么办,我们将用尽jdbc连接?
>每个实体管理器都有一个单独的JDBC连接?

最佳答案
2和3的答案是肯定的.至于Q1:

你会遇到的一个问题是,会话通常在上次访问后的2到24小时(或更多)的时间内持续.这意味着您的会话对象将尝试维持EntityManager的打开状态,并且EntityManager将尝试保持JDBC连接的活动并对其自身进行排他.即使每小时使用50个用户,由于这个原因,您也将拥有大量的异常和错误500页.

我相信Serge Ballesta列出了这种方法会引起的其他主要问题.

一个更安全的解决方案是拥有一个静态的ThreadLocal< EntityManager>单例访问和javax.servlet.Filter在所有URL上都带有一个try-finally语句,可以确保每个请求都正确关闭EntityManager.否则可能发生的任何异常将使连接悬空,并导致其他问题.

转载注明原文:java – 在Web应用程序中创建EntityManager每个HttpSession的潜在问题 - 代码日志