How to set autocommit to false in spring jdbc template

前端 未结 7 1860
天命终不由人
天命终不由人 2020-12-08 21:01

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

   

        
7条回答
  •  长情又很酷
    2020-12-08 21:22

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

提交回复
热议问题