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:
- Assuming your concrete datasource has a setter for
defaultAutoCommit(for example, org.apache.commons.dbcp.BasicDataSource), cast theDataSourceto your concrete implementation. Of course this means that you can no longer change yourDataSourcein your Spring configuration, which defeats the purpose of dependency injection.
((BasicDataSource)getJdbcTemplate().getDataSource()).setDefaultAutoCommit(false);
-
Set the
DataSourceto 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; } });