【问题标题】:Why Spring JdbcTemplate is thread-safe? [duplicate]为什么 Spring JdbcTemplate 是线程安全的? [复制]
【发布时间】:2019-04-01 11:40:22
【问题描述】:

我正在学习 Spring 如何支持多线程。我发现 Spring 文档说 JdbcTemplate 是 thread-safe 一旦配置。 人们建议为整个应用程序使用一个 JdbcTemplate 实例,因为它是线程安全的(这意味着不需要为每个类创建一个新实例)。

但是当我查看 JdbcTemplate 代码时,我没有看到任何同步方法、锁或 volatile 变量。它还包含许多实例变量。我的问题是 JdbcTemplate 在这种情况下如何是线程安全的?

【问题讨论】:

  • 因为没有状态被保存在实例级别,因此不需要synchronized 方法或对象锁。你看到的实例变量只是委托,用于异常翻译、获取连接等。
  • 因为一旦配置好,如果没有人尝试重新配置它,它的状态就永远不会改变。没有共享可变状态 == 线程安全。就像,如果您安全地发布一个简单的 ArrayList 并且从不调用任何修改列表的方法,即使是从多个线程中,它也是线程安全的。
  • @silfrede 您是否阅读了该页面上的答案?答案中标记为已接受的链接导致关闭的春季论坛。
  • 接受的答案并不意味着它是最佳答案,只是问题原始发布者接受的答案。第二个答案,更高的投票,基本上回答了你的问题。

标签: java spring multithreading spring-jdbc


【解决方案1】:

这是来自 JDBCTemplate Best Practices 部分的 Spring 参考文档中的 sn-p

一旦配置,JdbcTemplate 类的实例是线程安全的。这很重要,因为这意味着您可以配置 JdbcTemplate 的单个实例,然后安全地将这个共享引用注入到多个 DAO(或存储库)中。 JdbcTemplate 是有状态的,因为它维护对 DataSource 的引用,但这种状态不是会话状态。

正如文档中清楚解释的那样,您也可以在源代码中看到。这个类不持有任何会话状态。它只有配置信息。

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 2011-10-14
    • 2018-04-12
    • 1970-01-01
    • 2014-03-18
    • 2023-03-30
    • 2012-11-20
    • 2013-10-11
    • 2020-10-10
    相关资源
    最近更新 更多