休眠“在视图中打开会话”和异步任务

Posted

技术标签:

【中文标题】休眠“在视图中打开会话”和异步任务【英文标题】:hibernate 'open session in view' and asynchronous tasks 【发布时间】:2011-04-26 20:11:54 【问题描述】:

我正在为我的 jsf/icesfaces 应用程序使用 Open Session in View 模式。 像往常一样,servlet 过滤器在“Web 服务器线程”的开始和结束时打开和关闭所有休眠会话。

我现在的问题是我正在使用异步任务,例如。从数据库中加载大量对象。因此,我正在“手动”创建一个执行任务的新线程。

现在我的问题是:为此类异步任务处理休眠会话的最佳方式是什么?我应该在线程本身中手动创建会话,还是有类似 servlet 过滤器之类的线程(线程启动时打开会话并在结束时关闭它的东西)?

我将不胜感激任何最佳实践等。谢谢。

这是创建线程的代码:

protected static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5,
            15, 50, TimeUnit.SECONDS, new LinkedBlockingQueue(20));

// called by action method of a button
private void asyncLoading() 

        SessionRenderer.addCurrentSession(this.renderGroup);            

        threadPool.execute(new Thread()    
                // do the thing to do (...)
                

【问题讨论】:

【参考方案1】:

一般来说,“在视图中打开会话”过滤器非常简单:打开一个会话,将其附加到 ThreadLocal,最后关闭它。实现之间的变化是如何访问存储在 ThreadLocal 中的 Session。因此,根据您使用的“在视图中打开会话”部分实现,或者有一个与您正在使用的过滤器无关的可访问工厂,或者(在几乎所有情况下),您可以查看源过滤器,并围绕“//做该做的事情(...)”来模仿它的处理。

【讨论】:

以上是关于休眠“在视图中打开会话”和异步任务的主要内容,如果未能解决你的问题,请参考以下文章

C# ForEach 循环,带有异步任务和依赖的后异步任务

SpringBoot异步任务和定时任务

7.4 异步定时和邮件发送任务

同源和异步的区别

微服务架构中的任务调度:在 SpringBoot 框架中使用异步任务,定时任务和邮件任务

SpringBoot--任务:异步任务