我正在开发一个项目,我们需要构建几个连接到一个数据库的“独立”模块。这些模块主要是后台业务流程,因此前端不多。除了一个显示数据并允许基本CRUD功能的Web模块。为此,我们计划使用以下技术:
最初的计划是每个模块创建一个jar文件(使用main方法),并通过服务包装器将其安装为(windows)服务。对于我们的Web模块,我们将使用Glassfish或JBoss来运行它。然而,最近Java EE出现在我们的脑海中。我们可以在像Glassfish或JBoss这样的Java EE容器中运行我们所有的模块,而不仅仅是我们的web模块。关于Java EE的案例的一些问题:
答案 0 :(得分:3)
如果所有模块(批量+实时)与一个产品相关,那么将它们捆绑在一起是一种很好的方法。所以这是我的建议
回答您的具体问题
CDI也可以在没有EJB的情况下使用。无论如何摆脱弹簧,因为我没有看到你的简单项目的增值。
除了可以从JNDI获取DataSource之外没有区别。
是的,只要您没有看到任何性能问题,将单个产品的批处理和实时方面捆绑在一起是有意义的。
答案 1 :(得分:3)
其他人已经指出了一些优点,所以如果你将后台进程部署到与你的web应用程序相同的jvm中,这里有一些缺点。
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应用程序的内置安全性,可靠性,管理和可扩展性。