我们目前有一个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不是声明类的实例.一点阅读表明我们需要为JNDI资源实现存根实现,但这似乎有很多麻烦(也许Spring可以帮助我们?)
我们还没有看过太多关于EJB的事情,但是在前两次尝试之后,我想知道我们想要实现的目标是否完全可能.
总结一下我们要实现的目标:一个JBoss实例,几个Web应用程序在DAO层和Hibernate之上使用一堆业务对象.
最好的祝福,
尼尔斯
我目前正在尝试使用EJB3作为工作中一个重大项目的预先研究.我正在研究的一件事是查询缓存.
我使用JPA注释创建了一个非常简单的域模型,一个@Local业务接口和一个EJB-JAR中的@Stateless实现,在EAR中部署了一个非常简单的webapp来进行一些基本的测试.EAR部署在JBoss 5.0.1默认配置中,无需修改.这非常简单,并按预期工作.
但是,我最新的测试涉及查询缓存,我得到了一些奇怪的结果:
这让我很困惑,所以我启用了Hibernate的show_sql来查看日志.未缓存,并且在启用缓存的第一次执行时,按预期方式记录了一个SELECT.当我应该获得缓存命中时,Hibernate会为数据库表中的每一行记录一个SELECT.
这肯定会解释执行时间慢的问题,但任何人都可以告诉我为什么会这样吗?