我正在使用 postgres jdbc 驱动程序连接到 Amazon RedShift。这里还有 DBCP 2.0.1
的 BasicDataSource
和 Spring 4
的 JdbcTemplate
。我将 DataSourceTransactionManager
与 Transactional
注释一起使用。
看起来 DataSource
仍在继续创建新连接!
// that is how dataSource is created
BasicDataSource dataSource = new BasicDataSource() {
public Connection getConnection() throws SQLException {
Connection c = super.getConnection();
System.out.println("New connection: " + c);
return c;
}
};
dataSource.setUsername(env.getProperty(USERNAME));
dataSource.setPassword(env.getProperty(PASSWORD));
dataSource.setDriverClassName(env.getProperty(DRIVER_CLASS));
dataSource.setUrl(env.getProperty(CONNECTION_URL));
我在控制台中看到每个操作都有另一个 Connection 对象(它们具有不同的哈希码)。如果我切换到 SingleConnectionDataSource
,一切都按预期工作,只有一个连接对象。
在调用 jdbcTemplate#execute
之前,我使用 TransactionSynchronizationManager.isActualTransactionActive
来查看事务是否正在工作(它们正在工作)...
那我还能错过什么呢?为什么交易被关闭?或者我还能做些什么来调查这个问题。该 url 也有 tcpKeepAlive=true
参数...
UPD 感谢 Evgeniy,我更改了代码以查看何时真正创建了连接:
BasicDataSource dataSource = new BasicDataSource() {
protected ConnectionFactory createConnectionFactory() throws SQLException {
final ConnectionFactory cf = super.createConnectionFactory();
return new ConnectionFactory() {
public Connection createConnection() throws SQLException {
Connection c = cf.createConnection();
System.out.println("New connection from factory: " + c);
return c;
}
};
}
};
//dataSource.setMaxIdle(0);
现在我真的看到只创建了两个连接(如果我添加setMaxIdle(0)
,它们会在每次查询之前重新创建)。
所以我的怀疑是错误的,池按预期工作。非常感谢!
最佳答案
不同的哈希码并不能证明它们是不同的物理连接。尝试观察数据库上的 session ,您会看到关闭来自 BasicDataSource
的连接不会关闭物理连接。
关于java - 带有 DBCP BasicDataSource 的 Spring JdbcTemplate 仍然关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26776215/