2016-10-07 2 views
1

MyBatis 3.3.1, Spring 4.3, Jersey 2.22 및 Oracle 12c를 사용하여 나머지 서비스를 만들고 있습니다. 내 트랜잭션은 Spring이 DataSourceTransactionManager와 @Transaction annotation을 사용하여 관리합니다. 또한 MyBatis 풀링 된 데이터 소스를 javax.sql.DataSource로 사용하고 있습니다. 왜 데이터베이스 세션이 재사용되고 있는지 이해할 수 없습니다.오라클과 MyBatis + Spring + Jersey는 SQL 세션을 재사용합니다.

내 응용 프로그램에서는 Oracle 클라이언트 식별자 DBMS_SESSION.SET_IDENTIFIER ("my id")를 설정하고 있습니다. 디버그 로깅 문을 사용하면 MyBatis가 각각의 MyBatis SQL 작업에 대해 새로운 세션을 생성하는 것을 볼 수 있습니다. DBMS_SESSION.UNIQUE_SESSION_ID에서 데이터베이스 세션 식별자를 출력하는 디버그도 있습니다.

내가 알지 못하는 점은 휴식 엔드 포인트에 여러 번 액세스하면 고유 세션 ID가 동일하고 마지막 액세스 ID가 여전히 설정된다는 것입니다.

MyBatis가 새로운 SQLSession을 가져올 때마다 새로운 oracle 세션을 사용해야합니까? Oracle 세션이 항상 같은 이유는 무엇입니까?

감사합니다.

답변

0

Oracle의 세션은 연결에 바인딩되어 있습니다. 연결 풀링을 사용 중이므로 하나의 나머지 요청이 완료된 후 연결 풀로 연결이 반환됩니다. 이 경우 세션이 종료되지 않습니다.

풀에 연결을 반환 할 때 식별자를 지우고 풀에서 연결을 검색 할 때 식별자를 설정하려고합니다. 이를 수행하는 정확한 방법은 사용중인 연결 풀에 따라 다릅니다. 빌트인 mybatis 연결 풀에 대해서는 this answer을 참조하십시오.

+0

안녕하세요, 귀하의 의견에 감사드립니다. Transaction과 비슷한 일을 시도했는데 트랜잭션이 시작될 때 올바른 세션 변수가 설정되고 트랜잭션이 끝나면 제거되었습니다. 그러나 디버그를 기반으로 MyBatis 호출이 @Transactional 메서드 내에서 세션을 여러 번 만드는 것처럼 보입니다. 세션이 생성 된 후 현재 트랜잭션에 추가 된 것을 볼 수 있습니다. 여러 세션이 트랜잭션을 구성 할 것으로 예상됩니까? 트랜잭션이 커밋되면 모든 세션에서 커밋됩니까? – tux

+0

봄과 mybatis의 구성에 따라 다릅니다. 일반적으로 트랜잭션 기간 동안 하나의 세션이 생성됩니다. 이 로직을 구현하는 중심적인 메소드는'org.mybatis.spring.SqlSessionUtils.getSqlSession'입니다. –

+0

당신의 문제는 두 개의 데이터 소스가 있다고 생각합니다. 하나는 mybatis에서 구성되고 다른 하나는 봄에 의해 관리됩니다. Spring은 mybatis 풀링 된 데이터 소스에 대해 알지 못한다. 'SqlSessionFactory'는 어떻게 구성되어 있습니까? –