【发布时间】:2008-11-06 09:54:26
【问题描述】:
我们目前有一个 Web 应用程序加载一个 Spring 应用程序上下文,该上下文实例化了一堆业务对象、DAO 对象和 Hibernate。我们希望与另一个 Web 应用程序共享此堆栈,以避免有多个相同对象的实例。
我们研究了几种方法;使用 JMX 或 JNDI 或使用 EJB3 公开对象。
不同的方法都有各自的问题,我们正在寻找一种轻量级的方法。
关于如何解决这个问题的任何建议?
编辑:我收到了 cmets 要求我详细说明一下,所以这里是:
我们要解决的主要问题是我们只想拥有一个 Hibernate 实例。这是由于在运行多个使用同一数据源的客户端应用程序时,Hibernate 的二级缓存失效的问题。此外,业务/DAO/Hibernate 堆栈越来越大,因此不复制它更有意义。
首先,我们尝试研究如何将业务层单独暴露给其他 Web 应用程序,Spring 以少量 XML 的价格提供了 JMX 包装。但是,我们无法将 JMX 实体绑定到 JNDI 树,因此我们无法从 Web 应用程序中查找对象。
然后我们尝试将业务层直接绑定到 JNDI。尽管 Spring 没有为此提供任何方法,但使用 JNDITemplate 绑定它们也很简单。但这导致了几个新问题: 1) 安全管理器拒绝访问 RMI 类加载器,因此一旦我们尝试调用 JNDI 资源上的方法,客户端就会失败。 2) 一旦安全问题得到解决,JBoss 抛出 IllegalArgumentException: object is not an instance of declaring class。稍微阅读一下,我们发现我们需要 JNDI 资源的存根实现,但这似乎很麻烦(也许 Spring 可以帮助我们?)
我们还没有过多地研究 EJB,但是在前两次尝试之后,我想知道我们想要实现的目标是否完全可行。
总结一下我们想要实现的目标:一个 JBoss 实例,多个 Web 应用程序利用 DAO 层和 Hibernate 之上的一组业务对象。
最好的问候,
尼尔斯
【问题讨论】:
-
您能评论一下 1. 您要解决什么问题; 2.您在提到的各个方法中发现的问题。这将允许一个更集中的答案......
-
很难用 300 个字符全部说完,所以我编辑了问题以添加更多细节 :-)
标签: java hibernate spring jboss ejb-3.0