我们目前有一个Web应用程序,加载了Spring应用程序上下文,实例化了一些业务对象、DAO对象和Hibernate。我们希望与另一个Web应用程序共享此堆栈,以避免出现多个相同对象的实例。
我们已经研究了几种方法:使用JMX或JNDI公开对象,或使用EJB3。
不同的方法都有自己的问题,我们正在寻找一种轻量级的方法。
有任何解决此问题的建议吗?
编辑:我收到了要求我稍微详细解释一点的评论,所以在这里我就开始解释:
我们想要解决的主要问题是我们希望只有一个 Hibernate 实例。这是由于在使用相同数据源的多个客户端应用程序运行时,Hibernate 的第二级缓存无效的问题。另外,业务/DAO/Hibernate 技术栈越来越大,因此不重复它更加明智。
首先,我们尝试查看仅暴露业务层如何与其他Web应用程序交互,Spring提供JMX封装以极小的XML代价。但是,我们无法将JMX实体绑定到JNDI树,因此我们无法从Web应用程序中查找对象。
然后我们尝试将业务层直接绑定到JNDI。尽管Spring没有提供任何方法进行此操作,但使用JNDITemplate进行绑定也很简单。但是这引发了一些新问题:1)安全管理器拒绝访问RMI类加载器,因此一旦我们尝试在JNDI资源上调用方法,客户端就失败了。2)一旦解决了安全问题,JBoss抛出了IllegalArgumentException:对象不是声明类的实例。稍微阅读一下发现,我们需要JNDI资源的存根实现,但这似乎很麻烦(也许Spring可以帮助我们吗?)。
我们还没有深入研究EJB,但在前两次尝试后,我在想我们所尝试的是否可能实现。
总体来说,我们所试图实现的是:一个JBoss实例,多个Web应用程序,在DAO层和Hibernate之上利用一套业务对象的堆栈。
最好的祝愿,
尼尔斯