How to set autocommit to false in spring jdbc template

bad programmer picture bad programmer · Aug 8, 2014 · Viewed 43.4k times · Source

Currently I'm setting autocommit to false in spring through adding a property to a datasource bean id like below :

   <property name="defaultAutoCommit" value="false" /> 

But i need to add it specifically in a single java method before executing my procedure. I used the below code snippet.

  getJdbcTemplate().getDataSource().getConnection().setAutoCommit(false);

But the above line was not setting autocommit to false?
Am i missing anything ?
or any alternative to set autocommit in a specific java method by spring

Thanks

Answer

Yosef Weiner picture Yosef Weiner · Aug 14, 2015

The problem is that you are setting autocommit on a Connection, but JdbcTemplate doesn't remember that Connection; instead, it gets a new Connection for each operation, and that might or might not be the same Connection instance, depending on your DataSource implementation. Since defaultAutoCommit is not a property on DataSource, you have two options:

  1. Assuming your concrete datasource has a setter for defaultAutoCommit (for example, org.apache.commons.dbcp.BasicDataSource), cast the DataSource to your concrete implementation. Of course this means that you can no longer change your DataSource in your Spring configuration, which defeats the purpose of dependency injection.

((BasicDataSource)getJdbcTemplate().getDataSource()).setDefaultAutoCommit(false);

  1. Set the DataSource to a wrapper implementation that sets AutoCommit to false each time you fetch a connection.

    final DataSource ds = getJdbcTemplate().getDataSource();
    getJdbcTemplate().setDataSource(new DataSource(){
      // You'll need to implement all the methods, simply delegating to ds
    
      @Override
      public Connection getConnection() throws SQLException {
        Connection c = ds.getConnection();
        c.setAutoCommit(false);
        return c;
      }
    });