Java EE vs Standalone

Rob*_*ers 8 spring hibernate jpa java-ee cdi

我正在开发一个项目,我们需要构建几个连接到一个数据库的"独立"模块.这些模块主要是后台业务流程,因此前端不多.除了一个显示数据并允许基本CRUD功能的Web模块.为此,我们计划使用以下技术:

  • JPA2(使用hibernate-jpa实现)
  • CDI(使用spring实现)
  • JSF2 + primefaces(用于我们的web模块)

最初的计划是每个模块创建一个jar文件(使用main方法),并通过服务包装器将其安装为(windows)服务.对于我们的Web模块,我们将使用Glassfish或JBoss来运行它.然而,最近Java EE出现在我们的脑海中.我们可以在像Glassfish或JBoss这样的Java EE容器中运行我们所有的模块,而不仅仅是我们的web模块.关于Java EE的案例的一些问题:

  1. 可以/我们还应该使用带弹簧的CDI吗?或者我们应该切换到EJB3?
  2. 当我们在容器内而不是独立模块中使用JPA时,会对JPA产生什么影响?有什么区别吗?
  3. 由于我们的大多数模块都不与Web相关,因此在Java EE容器中运行它们仍然有意义吗?

ams*_*ams 3

其他人指出了一些优点,因此如果将后台进程部署到与 Web 应用程序相同的 jvm 中,这里有一些缺点。

  • 启动和停止运行 Web 模块的服务器意味着您启动和停止后台进程,这对您来说可能是也可能不是问题。
  • 如果后台进程消耗大量内存或 CPU,则您将与所有三个应用程序共享堆,这可能会影响您的 Web 应用程序,或者如果 Web 应用程序消耗大量资源,则可能会影响后台进程。
  • Web 应用程序可能需要以可通过互联网访问的方式进行部署,但后台进程可能很乐意在不访问网络的情况下运行。那么,如果没有必要,为什么要将后台进程暴露给互联网呢?
  • 当您升级应用程序服务器、框架或配置时,这意味着要测试三件事,如果后台进程独立运行,您可以在与 Web 应用程序不同的发布周期中升级它们。
  • 在容器外开发和测试代码更简单。在容器内运行后台进程意味着后台进程的开发环境更加复杂,您必须等待服务器启动,您开始依赖容器资源,然后必须模拟单元测试......等等。

JPA在容器内外是一样的。唯一的区别是如何获取 EntityManager,可以使用 Spring 将其配置为在容器内和容器外都相同。CDI 应该可以在容器外运行。

主要区别在于如何使用数据库进行事务,例如使用 Spring 事务与 ejb 事务。

更新: 从评论中回答您的问题:在 JPA 中,EntityManager 不是线程安全的,因此在 Java EE 服务器中,每个线程的每个持久单元将有一个实体管理器。实体管理器的创建和关闭由应用程序服务器为您管理。每个实体管理器内部都有一个缓存。可以配置跨越多个实体管理器的二级缓存。在容器外部运行时,您必须自己管理 JPA 实体管理器的数量,这取决于后台进程中的线程数量以及您想要的事务边界。如果您看一本名为“Pro JPA2”的书,其中有一节讨论了在容器内部或外部运行的细节。

在我的应用程序中,我没有后台进程,但是每个需要实体管理器的类都可以使用它进行注入,@PersistenceContext EntityManager em;并且 spring 负责使其在容器内部和外部都可以工作。Spring 3.1 有一个称为配置文件的功能,它使得在容器外部运行相同的代码变得很简单,而无需更改任何一行代码。我不是 CDI 用户,所以我不知道 CDI 是否具有与 spring 3.1 配置文件功能等效的功能。