2

我已经阅读了很多关于 DAO 和会话的问题,但不理解问题。现在我使用这样的东西:核心 DAO(我在核心 DAO 中添加了一些额外的检查)和基于 wicket 框架的 Web 项目的DAO 实现。一般来说,这种模式可以描述为:

1) 每 1 个线程使用 1 个会话;

2) 从不关闭会话;

3)始终在操作后提交事务。

我使用 DDoS 实用程序对其进行了测试,并且此实现工作(每秒 100 个连接)。但是当我增加连接数时,我会有很多关于关闭会话而不是开始事务的异常。我如何理解我应该使用 getCurrentSession() 而不是 openSession() 但是当我使用 getCurrentSession() 在核心 DAO 中修改方法 getSession() 时,我没有修复错误:(。然后我尝试使用 c3p0 和 bonecp。但是那些强大的工具对我没有帮助。也许你可以解释我的错误 :( 除了 DNA 中的错误

4

2 回答 2

3

您从任何地方复制的 DAO 将休眠会话存储在 ThreadLocal 对象中,即,正如您所提到的,一个休眠会话绑定到一个线程。

但是你正在做一个网络项目。在那里,您应该将一个 Hibernate 会话绑定到一个用户(或浏览器),即绑定到一个 Http 会话。但是您不知道来自一个 http 会话的请求是在哪个线程中处理的。因此,在您的解决方案中,相同的 Http 会话可能会获得不同的 Hibernate 会话,或者不同的 Http 会话可能会获得相同的 Hibernate 会话。这取决于您的 Http 服务器。

解决方法:把Hibernate session放到Http session中(不要使用ThreadLocal对象)。你得到 Http session 对象HttpServletRequest.getSession()和 with ,HttpSession.getAttribute()HttpSession.setAttribute()可以设置 Hibernate session 和其他 Http session 相关数据。

于 2012-04-19T07:31:29.197 回答
0

这个问题已经有了答案,但是给未来来这里的人(如我)更多的想法如何处理它。

目前我正在实现一个无状态的 Restful API,所以我不想使用会话或在用户和服务器之间有任何类型的链接。我对这个问题的解决方案是在每次请求后使用过滤器(用于提交或回滚事务的同一过滤器)清理 EntityManager。它基本上从应用程序中删除了缓存,但我只需要在同一个事务中进行缓存,所以它完全没问题且可取。

于 2015-06-04T14:28:21.420 回答