我在JBoss 7中部署的Java EE应用程序中使用PostgreSQL 9.1 JDBC4驱动程序(postgresql-9.1-902.jdbc4.jar)。
我可以假设 javax.sql.DataSource 是线程安全的,这样多个线程可以同时调用它上面的getConnection()方法吗?
答案 0 :(得分:10)
javax.sql.DataSource本身是一个接口,因此如果它是线程安全的,它是特定于实现的。
对于postgres sql驱动程序,我建议您阅读官方文档中的Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment:
PostgreSQL JDBC驱动程序是线程安全的。 [...]
答案 1 :(得分:8)
通常,从Java EE容器获取的DataSource
实现将是由连接池支持的线程安全对象,并且底层JDBC连接的线程安全性(或其他)实际上并不相关。当您需要与数据库通信时,通常的模式是在数据源上调用getConnection()
以获取连接对象,进行必要的数据库调用,然后close()
连接。在封面下,这实际上不会关闭底层连接,而只是将其返回到连接池以供将来使用。任何单独的连接一次只能由一个线程使用。
这是像Spring JdbcTemplate
这样的习惯用法。
答案 2 :(得分:0)
如果它是一个连接池实现',那么它应该是线程安全的。