gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:29:40 24 4
gpt4 key购买 nike

我正在使用 postgres jdbc 驱动程序连接到 Amazon RedShift。这里还有 DBCP 2.0.1BasicDataSourceSpring 4JdbcTemplate。我将 DataSourceTransactionManagerTransactional 注释一起使用。

看起来 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com