java - 使用 JBoss 和 Spring 在 Java Web 应用程序之间共享业务对象实例的最佳方式是什么?

标签 java hibernate spring jboss ejb-3.0

我们目前有一个 Web 应用程序加载一个 Spring 应用程序上下文,该上下文实例化了一堆业务对象、DAO 对象和 Hibernate。我们希望与另一个 Web 应用程序共享此堆栈,以避免有多个相同对象的实例。

我们研究了几种方法;使用 JMX 或 JNDI 或使用 EJB3 公开对象。

不同的方法都有各自的问题,我们正在寻找一种轻量级的方法。

关于如何解决这个问题的任何建议?

编辑:我收到了要求我详细说明的评论,所以这里是:

我们要解决的主要问题是我们只想拥有一个 Hibernate 实例。这是由于在运行多个使用相同数据源的客户端应用程序时,Hibernate 的二级缓存失效的问题。此外,业务/DAO/Hibernate 堆栈越来越大,因此不复制它更有意义。

首先,我们尝试研究如何单独将业务层暴露给其他 Web 应用程序,Spring 以少量 XML 的价格提供了 JMX 包装。但是,我们无法将 JMX 实体绑定(bind)到 JNDI 树,因此我们无法从 Web 应用程序中查找对象。

然后我们尝试将业务层直接绑定(bind)到 JNDI。尽管 Spring 没有为此提供任何方法,但使用 JNDITemplate 绑定(bind)它们也很简单。但这导致了几个新问题: 1) 安全管理器拒绝访问 RMI 类加载器,因此一旦我们尝试调用 JNDI 资源上的方法,客户端就会失败。 2) 一旦安全问题得到解决,JBoss 抛出 IllegalArgumentException: object is not an instance of declaring class。稍微阅读一下,我们发现我们需要 JNDI 资源的 stub 实现,但这似乎很麻烦(也许 Spring 可以帮助我们?)

我们还没有过多地研究 EJB,但是在前两次尝试之后,我想知道我们想要实现的目标是否完全可行。

总结一下我们想要实现的目标:一个 JBoss 实例,多个 Web 应用程序利用 DAO 层和 Hibernate 之上的一组业务对象。

最好的问候,

尼尔斯

最佳答案

Web 应用程序是否部署在同一台服务器上?

我不能代表 Spring,但使用 Session Bean 将业务逻辑移入 EJB 层很简单。

应用程序组织是直截了当的。 Logic 进入 Session Bean,这些 Session Bean 捆绑在单个 jar 中,作为带有 ejb-jar.xml 文件的 Java EE 工件(在 EJB3 中,这可能实际上是空的)。

然后将您的实体类捆绑到一个单独的 jar 文件中。

接下来,您将在各自的 WAR 文件中构建每个 Web 应用程序。

最后,所有的 jars 和 war 都被捆绑到一个 Java EE EAR 中,并带有关联的 application.xml 文件(同样,这可能是非常小的,只需枚举 EAR 中的 jars)。

此 EAR 被批量部署到应用服务器。

每个 WAR 实际上是独立的——它们自己的 session 、上下文路径等。但它们共享公共(public) EJB 后端,因此您只有一个二级缓存。

您还可以使用本地引用和调用语义来与 EJB 对话,因为它们位于同一服务器中。这里不需要远程调用。

我认为这很好地解决了您遇到的问题,并且在带有 EJB 3 的 Java EE 5 中非常简单。

此外,据我所知,您仍然可以在大部分工作中使用 Spring,但我不是 Spring 人,所以我无法详细说明。

关于java - 使用 JBoss 和 Spring 在 Java Web 应用程序之间共享业务对象实例的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/268129/

相关文章:

Java ORM : Multiple (interface) inheritance

java - Jackson 根据字符串值将 JSON 反序列化为不同类型的列表

Java - 检查 JList 上的选择

java - 如何在我的代码中实现 GUI?

java - @NamedNativeQuery + @SqlResultSetMapping + @ConstructorResult + @ColumnResult 导致 classCastException

java - Spring MVC 网站管理/配置页面的推荐数据模型和数据源?

java - 是否可以定义多次aop :aspectj-autoproxy element

sql - 与 JPA 的 friend 关系

java - 使用 Spring、Hibernate 和 Spring Transaction Support 为单元测试设置数据库

java - Spring Security 使用 Web 服务进行验证并从数据库中检索角色