线程本地上下文用于Hibernate会话和异步请求处理

时间:2014-07-09 12:53:33

标签: hibernate asynchronous jetty embedded-jetty

我们的应用程序利用Jetty 7.x通过HTTP公开一些REST API。在过去,应用程序依赖于Hibernate 3.2.6和线程本地会话上下文,其中每个会话都是事务绑定的,并且在事务提交或回滚时将关闭。

在Jetty(SelectChannelConnector)使用异步通道的情况下,此类配置不起作用。同时(或几乎同时)请求将导致错误抱怨关闭Hibernate会话。因此,似乎在Jetty使用相同线程处理多个HTTP请求的情况下,重用了相同的线程绑定Hibernate会话。为了解决这个问题,使用了BlockingChannelConnector而不是SelectChannelConnector,一切运行良好。

但是,在迁移到Hibernate 3.6.x分支后,似乎可以使用SelectChannelConnector而不会导致上述错误。那些并行运行并且过去会失败的请求的测试在Hibernate 3.6.x下不会失败,但我不确定这是证明会话处理是否正常运行的充分条件。

任何有更深入理解的人都可以评论在异步环境中使用线程本地和事务绑定的Hibernate会话是否安全,其中可以重用相同的线程来处理多个HTTP请求?

请注意,请求绑定会话管理不是我们案例中的最佳选择。因此,我们希望坚持使用本地线程或可能的一些自定义会话上下文方法。

1 个答案:

答案 0 :(得分:0)

成功使用ThreadLocal容器来存储带有Hibernate 4.2.2的EntityManager实例。 目前我们在提交/回滚后从容器中删除实例,但以防万一某些线程可能被停止 - 以便不保留未使用的实例。 但无论如何,我清楚地记得它在将EM实例保存在容器中时工作得很好。