为什么Spring JdbcTemplate是线程安全的?

3
我正在学习Spring如何支持多线程。我发现Spring文档称配置后JdbcTemplate是线程安全的。 人们建议为整个应用程序使用一个JdbcTemplate实例,因为它是线程安全的(这意味着不需要为每个类创建新的实例)。
但是当我查看JdbcTemplate代码时,我没有看到任何同步方法、锁或易失性变量。此外,它包含大量实例变量。我的问题是在这种情况下,JdbcTemplate如何是线程安全的?

1
因为在实例级别上没有状态被保留,因此不需要synchronized方法或对象锁。您看到的实例变量仅是委托,用于异常转换、获取连接等。 - M. Deinum
因为一旦配置完成,如果没有人尝试重新配置它,它的状态就永远不会改变。没有共享可变状态等于线程安全。就像,如果您安全地发布一个简单的ArrayList,并且从多个线程中甚至不调用任何修改列表的方法,它也是线程安全的。 - JB Nizet
https://dev59.com/4UbRa4cB1Zd3GeqPzE5e - silfrede
@silfrede,你看了那个页面上的答案吗?被标记为已接受答案的链接指向的Spring论坛已经关闭了。 - alexey kurbatov
一个被接受的答案并不意味着它是最好的答案,只是由问题的原始发布者接受的答案。第二个回答,得到更多赞同,基本上回答了你的问题。 - Mark Rotteveel
1个回答

4
这是来自Spring参考文档的代码片段,位于JDBCTemplate最佳实践部分下。

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

正如文档中清楚地解释的那样,并且您也可以在源代码中看到。该类不保存任何会话状态,只有配置信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接