[SPRING] 스프링 jdbc 템플릿에서 autocommit을 false로 설정하는 방법
SPRING스프링 jdbc 템플릿에서 autocommit을 false로 설정하는 방법
현재 봄철에는 다음과 같이 데이터 소스 빈 id에 속성을 추가하여 autocommit을 false로 설정합니다.
<property name="defaultAutoCommit" value="false" />
하지만 난 내 프로 시저를 실행하기 전에 단일 자바 메서드를 구체적으로 추가해야합니다. 아래 코드를 사용했습니다.
getJdbcTemplate().getDataSource().getConnection().setAutoCommit(false);
그러나 위 라인은 자동 커밋을 false로 설정하지 않았습니다. 내가 놓친 게 있니? 또는 봄에 의해 특정 자바 메소드에서 자동 커밋을 설정하는 다른 방법
감사
해결법
-
==============================
1.문제는 Connection에서 자동 커밋을 설정 중이지만 JdbcTemplate이 해당 Connection을 기억하지 않는다는 것입니다. 대신에 각 작업에 대해 새 Connection을 가져오고 DataSource 구현에 따라 동일한 Connection 인스턴스 일 수도 그렇지 않을 수도 있습니다. defaultAutoCommit은 DataSource의 속성이 아니기 때문에 두 가지 옵션이 있습니다.
문제는 Connection에서 자동 커밋을 설정 중이지만 JdbcTemplate이 해당 Connection을 기억하지 않는다는 것입니다. 대신에 각 작업에 대해 새 Connection을 가져오고 DataSource 구현에 따라 동일한 Connection 인스턴스 일 수도 그렇지 않을 수도 있습니다. defaultAutoCommit은 DataSource의 속성이 아니기 때문에 두 가지 옵션이 있습니다.
((BasicDataSource) getJdbcTemplate (). getDataSource ()). setDefaultAutoCommit (false);
-
==============================
2.현재 연결을해야합니다. 예 :
현재 연결을해야합니다. 예 :
Connection conn = DataSourceUtils.getConnection(jdbcTemplate.getDataSource()); try { conn.setAutoCommit(false); /** * Your Code */ conn.commit(); } catch (SQLException e) { conn.rollback(); e.printStackTrace(); }
-
==============================
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.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; } });
희망이 도움이
from https://stackoverflow.com/questions/25197774/how-to-set-autocommit-to-false-in-spring-jdbc-template by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring AMQP Listener Container의 동시성은 어떻게 구현되고 있는가? (0) | 2019.01.17 |
---|---|
[SPRING] JPA 페이지 가능 객체의 기본 페이지 크기 설정 (0) | 2019.01.17 |
[SPRING] Spring 4 OSGi 번들은 어디서 구할 수 있습니까? (0) | 2019.01.17 |
[SPRING] Spring + Hibernate 세션 라이프 사이클 (0) | 2019.01.17 |
[SPRING] org.springframework.web.bind.annotation.RequestMapping에서 어떤 종속성이 누락 되었습니까? (0) | 2019.01.17 |