2014-04-04 2 views
1

JdbcTemplate-OracleDataSource를 통해 Oracle 11g에 값을 삽입하는 것은 Spring 구성 파일을 통해 실행됩니다. 트랜잭션은 DataSourceTransactionManager에서 관리하는 @Transactional을 통해 수행됩니다.Oracle 데이터 소스 연결에서 autocommit 값을 false로 설정하는 방법은 무엇입니까?

질문 1) autocommit 값을 false로 설정하는 방법은 무엇입니까? 기본값은 true입니다.

DataSource ds = (DataSource)ctx.getBean("dataSourceBean"); 
    try { 
     ds.getConnection().setAutoCommit(false); 
     System.out.println("Autocommit " +ds.getConnection().getAutoCommit()); 
    } catch (SQLException e) {   
     e.printStackTrace(); 
    } 

println 문은 true을주고있다 : 다음 는 코드입니다.

또한 getAutoCommit 값을 DAO 클래스의 insert 메소드에 인쇄합니다. 또한 사실이 다가옵니다.

질문 2) 고유 한 제약 조건 위반의 경우 롤백해야합니다. 이 경우 DuplicateKeyException이 발생하여 SQLIntegrityConstraintViolationException을 래핑합니다. 그래서 @Transactional (rollbackFor =? .class)에는 어떤 예외가 있어야합니까? 변수

DataSource ds = (DataSource)ctx.getBean("dataSourceBean"); 
try { 
    Connection con =ds.getConnection(); 
    con.setAutoCommit(false); 
    System.out.println("Autocommit " +con.getAutoCommit()); 
} catch (SQLException e) {   
    e.printStackTrace(); 
} 

에서

+0

한 번에 질문을 하나만하십시오. –

+0

연결 (또는 프록시)은 사용자가 아닌 컨테이너에 의해 자동으로 커밋이 처리되므로 true를 반환 할 수 있습니다. –

답변

1

1.Store 그것을 다시, 당신은 풀

2.Change 웹 로직 데이터 소스 구성
Auto commit transactions if not explicitly committed or rolledback

+0

@ Mahdi 예, 이것이 지금 제가 알아 낸 것입니다. 스프링 설정 자체에서 자동 커밋을 설정하는 방법이 있습니까? 다음과 같이 사용 : <= "oracle.jdbc.pool.OracleDataSource"콩 ID = "dataSourceBean"클래스> \t \t \t \t <속성 이름 = "databaseName을"값 = "XX"/> \t \t <속성 이름 = " URL "값 ="XX "/> \t \t <속성 이름 ="사용자 "값 ="XX "/> \t \t <속성 이름 ="암호 "값 ="XX "/> \t – kakoli

+0

<속성 이름 = "defaultAutoCommit"> false

+0

오류가 발생합니다. 'autoCommit'시도, org.springframework.beans.NotWritablePropertyException 같은 오류 : bean 클래스 [oracle.jdbc.pool.OracleDataSource]의 'defaultAutoCommit'속성이 잘못되었습니다. – kakoli

1
에서 다른 연결을 얻을)에 ds.getConnection을 (호출

프로그래밍 방식으로 연결하는 대신 연결 풀에서 풀에서 연결을 반환 할 때 자동 커밋을 false로 설정하는 옵션이 있는지 확인하십시오. DBCP의 BasicDataSource에는 이러한 옵션이 있습니다.

RuntimeException이 throw되면 스프링이 롤백을 수행합니다.