带有DBCP BasicDataSource的Spring JdbcTemplate仍然会关闭连接

时间:2014-11-06 09:48:02

标签: java spring postgresql spring-jdbc

我使用postgres jdbc驱动程序连接到Amazon RedShift。以下是来自BasicDataSource的{​​{1}}和来自DBCP 2.0.1的{​​{1}}。我将JdbcTemplateSpring 4注释一起使用。

看起来DataSourceTransactionManager仍在继续创建新连接!

Transactional

我在控制台中看到每个操作另一个Connection对象(它们有不同的哈希码)。如果我切换到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)); 之前,我使用SingleConnectionDataSource查看交易是否有效(他们是)......

那时我能错过什么?交易为什么关闭?或者我还可以做些什么来调查问题。该网址还有jdbcTemplate#execute参数...

UPD 感谢Evgeniy,我已经更改了代码,以确定何时真正创建了连接:

TransactionSynchronizationManager.isActualTransactionActive

现在我确实看到只创建了两个连接(如果我添加tcpKeepAlive=true,则会在每次查询之前重新创建它们。)

所以我的怀疑是错误的,游泳池按预期工作。非常感谢!

1 个答案:

答案 0 :(得分:1)

不同的哈希码不能证明它们是不同的物理连接。尝试在数据库上观看会话,您将看到来自BasicDataSource的连接关闭并未关闭物理连接。