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

标签 java spring postgresql spring-jdbc

我正在使用 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/

相关文章:

java - 哦,不,不再 - 比较两碗矮牵牛 - 对不起 - 漂浮,为了平等

java - Spring Boot JPA ManyToMany MappingException

Spring Boot 。如何禁用 JPA Conditionaliy 的初始化

postgresql - 用于检查数据的 postgres 触发器

sql - 如何解决此查询中的 pgadmin 4 GRANT 语法错误?

java - 为什么 ArrayList.class.isInstance(ArrayList.class) 返回 false?

Java MySQL - 如何从每一行和每一列获取信息

java - 在Hql-Initialization中创建sessionFactory

java - 使用 Spring Boot 进行单元测试 Spring Batch 配置

python - 为什么我在一个失败的命令后得到所有后续命令的 peewee.InternalError,使用 peewee ORM 和 posgresql?