Java EE vs Standalone

时间:2012-11-27 16:06:52

标签: spring hibernate java-ee jpa cdi

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

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

最初的计划是每个模块创建一个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容器中运行它们仍然有意义吗?

3 个答案:

答案 0 :(得分:3)

如果所有模块(批量+实时)与一个产品相关,那么将它们捆绑在一起是一种很好的方法。所以这是我的建议

  1. 将所有模块捆绑在一起。
  2. 使用Java EE 6并摆脱spring。 CDI旨在用于Java EE。对于批处理操作,请尝试使用Asynchronous EJBs或MDB。
  3. 回答您的具体问题

    • 我们还能/应该使用带弹簧的CDI吗?或者我们应该切换到EJB3吗?

    CDI也可以在没有EJB的情况下使用。无论如何摆脱弹簧,因为我没有看到你的简单项目的增值。

    • 当我们在容器内而不是独立模块中使用JPA时会对JPA产生什么影响?有什么不同吗?

    除了可以从JNDI获取DataSource之外没有区别。

    • 由于我们的大多数模块都不是与Web相关的,因此在Java EE容器中运行它们仍然有意义吗?

    是的,只要您没有看到任何性能问题,将单个产品的批处理和实时方面捆绑在一起是有意义的。

答案 1 :(得分:3)

其他人已经指出了一些优点,所以如果你将后台进程部署到与你的web应用程序相同的jvm中,这里有一些缺点。

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

JPA在容器内外都是一样的。唯一的区别是你如何获得一个EntityManager,这可以配置为Spring在容器内外都是一样的。 CDI应该可以在容器外运行。

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

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

在我的应用程序中,我没有后台进程,但每个需要实体管理器的类只是使用@PersistenceContext EntityManager em;注入它,而spring负责使它在容器内外都能正常工作。 Spring 3.1有一个称为配置文件的功能,这使得在容器外部运行相同的代码而不改变单行代码变得微不足道。我不是CDI用户,所以我不知道CDI是否具有弹簧3.1配置文件功能的等效功能。

答案 2 :(得分:1)

出于常见原因(例如

),在应用程序服务器而不是独立的java程序中运行是有意义的

1)您可以使用带弹簧的CDI,因为EJB3也基于类似的概念。 2)就JPA而言没有区别,除非你以后需要向应用程序添加更多卷,可以通过添加更多运行相同应用程序的机器来添加负载 - 但是,请注意这是非微不足道的工作量因此取决于做出选择的业务需求 3)应用服务器胜过独立应用程序,原因在于独立的Java应用程序的内置安全性,可靠性,管理和可扩展性。