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