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

rryofs0p  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(93)

我们的应用程序利用Jetty 7.x通过HTTP公开一些REST API。在过去,应用程序依赖于Hibernate 3.2.6的线程本地会话上下文,其中每个会话都是事务绑定的,并在事务提交或回滚时关闭。
如果Jetty(SelectPaddelConnector)使用了一个Paddle通道,则此配置将无法正常工作。同时(或几乎同时)的请求将导致错误,抱怨一个关闭的Hibernate会话。因此,在Jetty使用同一个线程处理多个HTTP请求的情况下,似乎重用了同一个线程绑定的Hibernate会话。为了避免这个问题,使用BlockingWebelConnector代替SelectWebelConnector,一切都很好。
然而,在迁移到Hibernate 3.6.x分支之后,似乎可以使用SelectsockelConnector而不会导致上述错误。在Hibernate 3.6.x下,那些在过去会失败的并行请求测试不会失败,但我不确定这是否是证明会话处理正确运行的充分条件。
有更深入理解的人可以评论一下在一个可以重用同一个线程来处理多个HTTP请求的Java环境中使用线程本地和事务绑定的Hibernate会话是否安全吗?
请注意,在我们的例子中,请求绑定的会话管理不是最好的选择。因此,我们希望坚持使用线程本地或潜在的一些自定义会话上下文方法。

xdyibdwo

xdyibdwo1#

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

相关问题