spring - Java EE 与独立

标签 spring hibernate jakarta-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 的案例的一些问题:
  • 我们还可以/应该将 CDI 与 spring 一起使用吗?还是我们应该切换到 EJB3?
  • 当我们在容器而不是独立模块中使用 JPA 时,它的后果是什么?有什么区别吗?
  • 由于我们的大多数模块都与 Web 无关,在 Java EE 容器中运行它们是否仍然有意义?
  • 最佳答案

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

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

  • JPA 在容器内部和外部是相同的。唯一的区别是您如何获得 EntityManager,这可以使用 Spring 配置为在容器内外都相同。 CDI 应该可以在容器外运行。

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

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

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

    关于spring - Java EE 与独立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13588236/

    相关文章:

    javascript - CouchDB AJAX 交互

    java - 带有条件注释的原型(prototype)作用域 bean

    java - 将 Spring tx 与任务混合

    jakarta-ee - Android 设备上的 JSF 流式下载返回 .htm 文件

    java - Hibernate可以保留哪些类型的类?

    java - 获得两列的不同组合

    eclipse - Wicket 口异常开始过滤器 Wicket 口

    java - 是否有可能在 Spring 制作@Aspect 请求范围

    java - JpaSpecificationExecutor<T> 似乎不像 JpaRepository<T, I> 那样工作

    hibernate - 为 hibernate 3.6 配置 pom.xml