休眠“在视图中打开会话”和异步任务
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。因此,根据您使用的“在视图中打开会话”部分实现,或者有一个与您正在使用的过滤器无关的可访问工厂,或者(在几乎所有情况下),您可以查看源过滤器,并围绕“//做该做的事情(...)”来模仿它的处理。
【讨论】:
以上是关于休眠“在视图中打开会话”和异步任务的主要内容,如果未能解决你的问题,请参考以下文章