我们目前有一个 Web 应用程序加载一个 Spring 应用程序上下文,它实例化一堆业务对象、DAO 对象和 Hibernate。我们希望与另一个 Web 应用程序共享此堆栈,以避免具有相同对象的多个实例。
我们研究了几种方法;使用 JMX 或 JNDI 或使用 EJB3 公开对象。
不同的方法都有自己的问题,我们正在寻找一种轻量级的方法。
关于如何解决这个问题的任何建议?
编辑:我收到了要求我详细说明的评论,所以这里是:
我们要解决的主要问题是我们只想拥有一个 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 之上的一组业务对象。
最好的祝福,
尼尔斯