javax.sql.DataSource是否线程安全?

13

我在Java EE应用程序中使用JBoss 7部署的PostgreSQL 9.1 JDBC4驱动程序(postgresql-9.1-902.jdbc4.jar)。

我可以假设javax.sql.DataSource是线程安全的,因此多个线程可以同时调用它的getConnection()方法吗?


1
《Java并发编程实战》一书涉及到了这个问题,我在回答一个相关的问题时引用了相关段落,请参见 https://dev59.com/I43da4cB1Zd3GeqPyVML#31588609。 - Nathan Hughes
3个回答

11

javax.sql.DataSource本身是一个接口,因此它是否线程安全取决于具体的实现。

对于PostgreSQL驱动程序,官方文档随着时间的推移发生了变化。旧版文档(snapshot)写道它是线程安全的,而当前的文档则写道相反,即不是线程安全的。


链接已经失效了 :| - Teshte
1
@Teshte,我更新了链接并修正了结果。 - Dag

11
通常从Java EE容器获取的DataSource实现都是由连接池支持的线程安全对象,底层JDBC连接的线程安全性(或非线程安全性)并不重要。当需要访问数据库时,通常的模式是在数据源上调用getConnection()以获取连接对象,执行必要的数据库调用,然后close()连接。在底层,这实际上并不会关闭底层连接,而只会将其返回到连接池以供将来使用。任何单个连接每次只能被一个线程使用。

这是SpringJdbcTemplate之类的东西使用的习惯用法。


1
如果是“连接池实现”,那么它应该是线程安全的。

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