我在Java EE应用程序中使用JBoss 7部署的PostgreSQL 9.1 JDBC4驱动程序(postgresql-9.1-902.jdbc4.jar)。
我可以假设javax.sql.DataSource是线程安全的,因此多个线程可以同时调用它的getConnection()方法吗?
我在Java EE应用程序中使用JBoss 7部署的PostgreSQL 9.1 JDBC4驱动程序(postgresql-9.1-902.jdbc4.jar)。
我可以假设javax.sql.DataSource是线程安全的,因此多个线程可以同时调用它的getConnection()方法吗?
javax.sql.DataSource本身是一个接口,因此它是否线程安全取决于具体的实现。
对于PostgreSQL驱动程序,官方文档随着时间的推移发生了变化。旧版文档(snapshot)写道它是线程安全的,而当前的文档则写道相反,即不是线程安全的。
DataSource
实现都是由连接池支持的线程安全对象,底层JDBC连接的线程安全性(或非线程安全性)并不重要。当需要访问数据库时,通常的模式是在数据源上调用getConnection()
以获取连接对象,执行必要的数据库调用,然后close()
连接。在底层,这实际上并不会关闭底层连接,而只会将其返回到连接池以供将来使用。任何单个连接每次只能被一个线程使用。
这是SpringJdbcTemplate
之类的东西使用的习惯用法。