2013-03-22 71 views
0

考虑服务,其中启动一些thread。 Will Tapestry 5管理此线程的一部分。在这样的线程中关闭hibernate会话还是不行? (例如,我们可以从服务中传递Session这个子线程内的对象,线程死后线程安全地关闭这个会话?)。Tapestry是否管理应用程序内的所有线程?

回答

0

Hibernate会话附加到正在处理当前请求的Web容器的线程。

如果您决定生成自己的线程并将它传递给它,那么只有在Tapestry提交之前完成或者上述Web容器的线程结束处理该请求之前完成了对该会话的更改。

在请求处理完会话关闭后,Tapestry对hibernate会话的控制被绑定到当前请求,因此产生另一个超出请求的线程来使用会话将是一个坏主意。

+0

没有明白。你能回答:是或否在我的问题上? – Andremoniy 2013-03-22 19:02:14

+0

tapestry中没有任何内容将hibernate会话与请求绑定在一起。 tapestry提供的休眠会话是一个延迟加载的perthread值。底层数据库连接是按需创建的。你只需要确保你打电话perthreadmanager.cleanup如果你在一个产卵的线程。如果在请求线程上,Tapestry会为您调用此函数 – 2013-03-23 16:43:26

+0

Session对象是代理;将代理传递给新线程,并为该新线程创建一个新的实例。因此,不需要这么做......只需注入全局会话对象即可。 – 2013-03-28 16:58:39

2

Tapestry只能管理你的AppModule中声明的东西。

作为一个简单的规则,如果您使用“新”关键字,它不是由挂毯管理。

如果你想挂毯来管理运行的,如果你想模仿挂毯管理线程ParallelExecutor

看一看,你必须调用Perthreadmanager.cleanup()一旦你可运行完毕。

+0

PerThreadManager服务具有API来协助解决此问题。请参阅http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/PerthreadManager.html#run(java.lang.Runnable) – 2013-03-28 17:00:01

相关问题