복붙노트

[SPRING] 스프링 jdbc 템플릿에서 autocommit을 false로 설정하는 방법

SPRING

스프링 jdbc 템플릿에서 autocommit을 false로 설정하는 방법

현재 봄철에는 다음과 같이 데이터 소스 빈 id에 속성을 추가하여 autocommit을 false로 설정합니다.

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

하지만 난 내 프로 시저를 실행하기 전에 단일 자바 메서드를 구체적으로 추가해야합니다. 아래 코드를 사용했습니다.

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

그러나 위 라인은 자동 커밋을 false로 설정하지 않았습니다. 내가 놓친 게 있니? 또는 봄에 의해 특정 자바 메소드에서 자동 커밋을 설정하는 다른 방법

감사

해결법

  1. ==============================

    1.문제는 Connection에서 자동 커밋을 설정 중이지만 JdbcTemplate이 해당 Connection을 기억하지 않는다는 것입니다. 대신에 각 작업에 대해 새 Connection을 가져오고 DataSource 구현에 따라 동일한 Connection 인스턴스 일 수도 그렇지 않을 수도 있습니다. defaultAutoCommit은 DataSource의 속성이 아니기 때문에 두 가지 옵션이 있습니다.

    문제는 Connection에서 자동 커밋을 설정 중이지만 JdbcTemplate이 해당 Connection을 기억하지 않는다는 것입니다. 대신에 각 작업에 대해 새 Connection을 가져오고 DataSource 구현에 따라 동일한 Connection 인스턴스 일 수도 그렇지 않을 수도 있습니다. defaultAutoCommit은 DataSource의 속성이 아니기 때문에 두 가지 옵션이 있습니다.

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

  2. ==============================

    2.현재 연결을해야합니다. 예 :

    현재 연결을해야합니다. 예 :

    Connection conn = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
        try {
            conn.setAutoCommit(false);
    
            /**
             * Your Code
             */
            conn.commit();
        } catch (SQLException e) {
            conn.rollback();
            e.printStackTrace();
        }
    
  3. ==============================

    3.나는 방금이 문제에 직면했고, 해결책이 너무 늦었다 고해도 도움이 될 것이라고 생각했습니다.

    나는 방금이 문제에 직면했고, 해결책이 너무 늦었다 고해도 도움이 될 것이라고 생각했습니다.

    Yosef가 말했듯이, getJdbcTemplate (). getDataSource (). getConnection () 메소드를 호출하여 얻는 연결은 조작을 위해 데이터베이스와의 통신에 사용되는 연결 일 수도 있고 그렇지 않을 수도 있습니다.

    대신 데이터를 커밋하지 않고 스크립트를 테스트하는 것이 요구된다면 자동 커밋이 fault로 설정된 Apache Commons DBCP 데이터 소스를 가질 수 있습니다. Bean 정의는 다음과 같습니다.

    /**
     * A datasource with auto commit set to false.
     */
    @Bean
    public DataSource dbcpDataSource() throws Exception {
        BasicDataSource ds = new BasicDataSource();
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        ds.setDefaultAutoCommit(false);
        ds.setEnableAutoCommitOnReturn(false);
        return ds;
    }
    
    // Create either JdbcTemplate or NamedParameterJdbcTemplate as per your needs
    @Bean
    public NamedParameterJdbcTemplate dbcpNamedParameterJdbcTemplate() throws Exception {
        return new NamedParameterJdbcTemplate(dbcpDataSource());
    }
    

    그리고 이러한 작업에이 데이터 소스를 사용하십시오.

    트랜잭션을 커밋하려면 자동 커밋이 true로 설정된 데이터 소스의 빈을 하나 더 가지는 것이 좋습니다. 이것이 기본 동작입니다.

    누군가가 도움이되기를 바랍니다!

  4. ==============================

    4.jdbcTemplate이 실행하는 각 명령문에 대해 수행해야합니다. 왜냐하면 각 jdbcTemplate.execute () 등은 데이터 소스의 연결 풀에서 새로운 연결을 가져옵니다. 따라서 jdbcTemplate이 해당 쿼리에 사용하는 연결을 설정해야합니다. 그래서 당신은 뭔가를해야 할 것입니다.

    jdbcTemplate이 실행하는 각 명령문에 대해 수행해야합니다. 왜냐하면 각 jdbcTemplate.execute () 등은 데이터 소스의 연결 풀에서 새로운 연결을 가져옵니다. 따라서 jdbcTemplate이 해당 쿼리에 사용하는 연결을 설정해야합니다. 그래서 당신은 뭔가를해야 할 것입니다.

     jdbcTemplate.execute("<your sql query", new PreparedStatementCallback<Integer>(){
    
            @Override
            public  Integer doInPreparedStatement(PreparedStatement stmt) throws SQLException, DataAccessException 
            {
                Connection cxn = stmt.getConnection();
                // set autocommit for that cxn object to false
                cxn.setAutoCommit(false);
                // set parameters etc in the stmt
                ....
                ....
                cxn.commit();
                // restore autocommit to true for that cxn object. because if the same object is obtained from the CxnPool later, autocommit will be false
                cxn.setAutoCommit(true);
                return 0;
    
            }
        });
    

    희망이 도움이

  5. from https://stackoverflow.com/questions/25197774/how-to-set-autocommit-to-false-in-spring-jdbc-template by cc-by-sa and MIT license