ThreadLocal在使用hibernate session / JDO persistenceManager时

时间:2009-08-17 15:15:35

标签: java spring java-ee

我试图理解使用ThreadLocal解决上述问题的最佳方式。根据我的理解,使用它的原因是确保只为整个应用程序创建一个会话/ pm。我的问题是

  1. 在群集应用程序上使用threadlocal有什么影响吗? (例如谷歌应用引擎)?

  2. 如果你使用“transactional”开始,在我的应用程序上提交,我不需要使用threadlocal吗?既然“交易”已经确保我的会话正常开放和关闭?

  3. 如果我需要使用“transactional”,tx,它也应该在threadlocal中?

  4. 为什么不使用“static”而不是“threadlocal”?

  5. 我有兴趣听取您对使用此技术的优缺点的反馈意见吗?

3 个答案:

答案 0 :(得分:4)

  1. 除非您的群集软件可以在节点之间迁移线程,否则可能不会。在这种情况下,您还需要迁移线程本地数据。

  2. 没有。事务附加到会话,因此您必须保持同步。当你可以在线程A中开始一个事务并在线程B中提交它时,通常很难确保它可靠地工作。因此:不要。

  3. static是整个应用程序的全局。每个线程threadlocal是全局的。

  4. 结论:如果您是这方面的初学者,我建议使用Spring。 Spring Framework为您解决了许多问题,并在出现问题时帮助您处理有用的错误消息。

    请遵循文件中的文件,特别是在没有意义的情况下。很可能你错过了一些重要的东西,春天的家伙是对的。

答案 1 :(得分:2)

ThreadLocal不用于为整个应用程序创建一个会话。它用于为每个线程创建一个会话。每个用户会话都是一个线程,因此ThreadLocal确保访问您的网页/数据库的每个用户都将获得自己的数据库连接。如果你使用静态单例模式,服务器上的每个用户都将使用相同的数据库连接,我不知道如何解决这个问题。

答案 2 :(得分:0)

许多事务引擎的实现实际上是使用ThreadLocal将您拥有的会话状态与数据库关联到特定线程。这使得例如在事务内部运行多个线程非常困难。

ThreadLocal是线程安全的保证,但稍后可以通过另一段代码以半静态方式查询。它是一个线程全局变量。这使得它对临时但会话感知信息很有用。超出事务的另一个用途可能是保留授权的内部参数,然后使用代理进行检查。