我已经阅读了很多有关DAO和会话的问题,但不理解问题。现在,我使用这样的方式:核心DAO(我在核心DAO中添加了一些其他检查)和基于wicket框架的Web项目的DAO实现。通常,这种模式可以描述为:
1)每1个线程使用1个会话;
2)永不关闭会话;
3)始终在操作后提交事务。
我使用DDoS实用程序对其进行了测试,并且该实现工作有效(每秒100个连接)。但是,当我增加连接数时,在关闭会话而不是开始事务方面会有很多例外。我的理解是我应该使用getCurrentSession()而不是openSession(),但是当我使用getCurrentSession()在核心DAO中修改方法getSession()时,我没有解决错误:(。然后我尝试使用c3p0和bonecp。强大的工具对我没有帮助。也许您可以解释我的错误:(除了DNA中的错误
您从任何地方复制的DAO,将hibernate会话存储在ThreadLocal对象中,即,正如您提到的,一个hibernate会话绑定到一个线程。
但是您正在做一个Web项目。在那里,您应该将一个Hibernate会话绑定到一个用户(或浏览器),即一个Http会话。但是您不知道在哪个线程中处理来自一个http会话的请求。因此,在您的解决方案中,相同的Http会话可能会获得不同的Hibernate会话,或者也许不同的Http会话可能会获得相同的Hibernate会话。这取决于您的Http服务器。
解决方案:把Hibernate会话到HTTP会话(并 没有 使用ThreadLocal的对象)。你得到HTTP会话对象,具有HttpServletRequest.getSession()与HttpSession.getAttribute()/ HttpSession.setAttribute()你可以设置Hibernate的Session和其他HTTP会话相关的数据。
HttpServletRequest.getSession()
HttpSession.getAttribute()
HttpSession.setAttribute()