简体   繁体   中英

Spring JdbcTemplate with DBCP BasicDataSource still closes connections

I'm using postgres jdbc driver to connect to Amazon RedShift. Here are also BasicDataSource from DBCP 2.0.1 and JdbcTemplate from Spring 4 . I use DataSourceTransactionManager with Transactional annotations.

It looks like DataSource still keeps on creating new connections!

    // 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));

and I see in console for each operation another Connection object (they have different hashcodes). If I switch to SingleConnectionDataSource all works as expected, with a single connection object.

Before call to jdbcTemplate#execute I use TransactionSynchronizationManager.isActualTransactionActive to see that transactions are working (they are)...

What could I miss then? Why transactions are closed? Or what more can I do to investigate the problem. The url also have tcpKeepAlive=true parameter...

UPD thanks to Evgeniy, I've changed the code to see when connections are really created:

    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);

Now I really see that only two connections were created (and if I add setMaxIdle(0) they are instead recreated before each query).

So my suspicion was wrong and pool works as expected. Thanks a lot!

Different hash codes do not prove they are different physical connections. Try to watch sessions on the database and you will see that close on connection from BasicDataSource does not close a physical connection.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM