我读过很多关于 DAO 和会话的问题,但不明白问题所在。现在我用这样的东西:core DAO http://techtracer.com/wp-content/uploads/2008/12/daojava.txt(我在核心 DAO 中添加了一些额外的检查)并且DAO 实施 http://techtracer.com/wp-content/uploads/2008/12/admindaohibernateimpljava.txt基于wicket框架的网络项目。一般来说,这种模式可以描述如下:
1)每1个线程使用1个会话;
2)永不关闭会话;
3) 始终在操作后提交事务。
我使用 DDoS 实用程序对其进行测试,并且该实现工作正常(每秒 100 个连接)。但是当我增加连接数时,我会遇到很多关于关闭会话和未启动事务的异常。我如何理解我应该使用 getCurrentSession() 而不是 openSession() 但当我使用 getCurrentSession() 修改核心 DAO 中的方法 getSession() 时,我没有修复错误:(。然后我尝试使用 c3p0 和 Boncp。但是那些强大的工具对我没有帮助。也许你能解释一下我的错误:(除了 DNA 中的错误
您从任何地方复制的 DAO 将 hibernate 会话存储在 ThreadLocal 对象中,即。 e.正如您所提到的,一个休眠会话绑定到一个线程。
但你正在做一个网络项目。您应该将一个 Hibernate 会话绑定到一个用户(或浏览器),即。 e.到一个 Http 会话。但您不知道来自一个 http 会话的请求是在哪个线程中处理的。因此,在您的解决方案中,相同的 Http 会话可能会获得不同的 Hibernate 会话,或者不同的 Http 会话可能会获得相同的 Hibernate 会话。这取决于您的 Http 服务器。
解决方案:将 Hibernate 会话放入 Http 会话中(并执行not使用 ThreadLocal 对象)。您可以使用以下命令获取 Http 会话对象HttpServletRequest.getSession()
与HttpSession.getAttribute()
/HttpSession.setAttribute()
您可以设置Hibernate会话和其他Http会话相关的数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)