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

问题描述 投票:0回答:1

我们的应用程序利用 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 请求?

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

hibernate asynchronous jetty embedded-jetty
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.