当前位置: 首页 > 面试题库 >

在Java EE应用程序中处理多个EntityManager

姜正初
2023-03-14
问题内容

我有大约10个EntityManager的Java EE应用程序(EM的数量可能会增加)。我的应用程序还包含许多无状态,有状态和消息驱动的bean。

与其将我的EM注入每个Bean @PersistenceContext(以及两种检测用户使用的EM的方法),不如将所有这些存储在一个singleton
bean中,并与其他bean一起访问。这样,无需担心可维护性。

但是,将EM存储在一个单例bean中是否安全?会出现瓶颈吗?

另一个解决方案是创建一个抽象类,所有bean都将对其进行扩展。

有什么更好的解决方案?


问题答案:

容器管理的实体管理器将与当前的JTA事务一起自动传播EntityManager,并且映射到同一持久性单元的引用提供对该事务中的持久性上下文的访问。因此,除了并发问题外,从一个实例中共享一个实体管理器不是一个好习惯,这将导致您在bean上调用的每种方法都使用相同的事务上下文。
一个满足您需求的简单解决方案是EntityManagerFactory在bean中注入引用并创建EntityManager调用该createEntityManager()方法的对象。缺点是您应该手动管理事务,而不再依赖容器。
否则,另一种方法可能是将所有实体管理器注入到主企业bean中,并使用向您传递适当管理器的方法在服务bean中实现业务逻辑。后一种解决方案的示例:

@Stateless
class MainBean {
    @PersistenceContext EntityManager em1;
    @PersistenceContext EntityManager em2;
    ...
    @EJB WorkerBean1 workerBean1;
    @EJB WorkerBean2 workerBean2;
    ...
    void method1(Object param1, Object param2) {
        workerBean1.method1(em1, param1, param2);
    }

    void method2(Object param1, Object param2, Object param3) {
        workerBean2.method2(em2, param1, param2, param3);
    }
    ...
}

@Stateless
class WorkerBean1 {
    void method1(EntityManager em, Object param1, Object param2) {
        ...
    }
    ...
}

@Stateless
class WorkerBean2 {
    void method2(EntityManager em, Object param1, Object param2, Object param3) {
        ...
    }
    ...
}


 类似资料:
  • 问题内容: 我已经看过很多关于此的文章和SO问题-但我只是没有使它起作用。我的目标是在JavaEE应用程序中将Jackson用作JSON处理器。到目前为止我有什么? pom.xml 要么这个 问题答案: 我的猜测是您使用的是Glassfish,它使用MOXy作为其默认JSON提供程序。您可以使用禁用它。 该具有自动发现功能,它应该自动注册。对于Glassfish,我不确定自动发现功能,以及它在内部

  • 问题内容: 我正在开发一个本机android应用程序,其中尝试使用2个开源库。问题是两个库都在各自的库中使用应用程序类。他们正在使用application标签下的“ android:name”在清单文件的相应源代码中注册这些类。问题是如何处理这种情况,因为众所周知,清单文件中只能使用ONE标签。我们是否可以在代码中注册/实例化应用程序类,以便我们在标记中仅提及一个库,而在代码中/实用地提及第二个库

  • 我有一个带post请求的控制器。我试图用一个简单的NotNull注释验证POJO。我正在使用ControllerAdvice来处理异常。 所以我尝试使用它,但当我启动应用程序时,我得到了以下信息: 因此,我想为BindException创建自己的处理程序,但当我为BindException类创建ExceptionHandler时,spring应用程序不会启动。如果我注释掉handleBindExc

  • 我正在使用以下源代码目录结构的JavaEE Web应用程序: 我感兴趣的文件夹是:它包含、用于设置servlet的xml文件、SpringBean连接上下文以及JSP标记和视图。我试图理解是什么限制/定义了这种结构。例如,JSP文件是否总是必须在中,或者它们可能在其他地方?在WEB-INF中是否还有其他内容?维基百科的WAR文件条目提到了Java类的,JAR文件的——我不确定除了其他源文件位置之外

  • 我将使用ADFS作为身份提供者(IDP)实现对java应用程序的单点登录。通过OneLogin找到了此解决方案SSO,并使用了其示例应用程序。除此之外,还有另一个解决方案Shibboleth。 我想知道与我的上下文匹配的最佳解决方案是什么。之间,这不是Spring应用程序。 谢谢

  • 问题内容: 在多线程应用程序中如何使用Hibernate(例如,每个客户端连接在服务器上启动它自己的线程)。 EntityManager应该仅由EntityManagerFactory创建一次,例如: 还是我必须为每个线程以及关闭EM的每个事务重新创建实体? 我的CRUD方法如下所示: 我要不要每次都跑?还是因为每个人都使用自己的缓存创建自己的EntityManager实例而使我陷入麻烦了? 问题