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 세션이 항상 같은 이유는 무엇입니까?
감사합니다.
안녕하세요, 귀하의 의견에 감사드립니다. Transaction과 비슷한 일을 시도했는데 트랜잭션이 시작될 때 올바른 세션 변수가 설정되고 트랜잭션이 끝나면 제거되었습니다. 그러나 디버그를 기반으로 MyBatis 호출이 @Transactional 메서드 내에서 세션을 여러 번 만드는 것처럼 보입니다. 세션이 생성 된 후 현재 트랜잭션에 추가 된 것을 볼 수 있습니다. 여러 세션이 트랜잭션을 구성 할 것으로 예상됩니까? 트랜잭션이 커밋되면 모든 세션에서 커밋됩니까? – tux
봄과 mybatis의 구성에 따라 다릅니다. 일반적으로 트랜잭션 기간 동안 하나의 세션이 생성됩니다. 이 로직을 구현하는 중심적인 메소드는'org.mybatis.spring.SqlSessionUtils.getSqlSession'입니다. –
당신의 문제는 두 개의 데이터 소스가 있다고 생각합니다. 하나는 mybatis에서 구성되고 다른 하나는 봄에 의해 관리됩니다. Spring은 mybatis 풀링 된 데이터 소스에 대해 알지 못한다. 'SqlSessionFactory'는 어떻게 구성되어 있습니까? –