2011-03-03 1 views
3

장기 실행 SELECT 문을 취소하는 솔루션이 필요합니다. 스프링 3.0.2, iBatis 2.3.0 및 Oracle 10g를 사용하고 있습니다. 일반 JDBC로 작동하도록 관리했지만 고급 검색 화면을 통해 select가 동적으로 생성되었으므로 정말 iBatis를 사용해야합니다.iBatis 준비 문을 취소하는 방법은 무엇입니까?

준비된 명령문의 캐시에서 작성/검색을 담당하는 iBatis 내부 클래스는 com.ibatis.sqlmap.engine.execution.SqlExecutor입니다. queryForList() /의 queryForObject()의 모든 호출을 촉구 내부 방법은 SqlExecutor의

public void executeQuery(RequestScope request, Connection conn, String sql, Object[] parameters, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException 방법이다.

성능상의 이유로 인해 iBatis는 지정된 select 문에 하나가없는 경우에만 새로운 prepared statement를 작성합니다. 준비된 명령문은 SQL 문자열이 키이고 준비된 명령문이 값인 HashMap에 저장/캐시됩니다.

없이 성공을 다른 다른 솔루션을 시도 후, 나는 SqlExecutor.executeQuery() 메소드를 포인트 컷하려고 어떻게 든 HTTP 세션 종료 iBatis를 캐시지도에 저장하기 위해 AOP (AspectJ를)와 함께 작동 할 수있을 것 같아요 및 SQL 문자열.

사용자가 장기 실행 쿼리를 취소하려고하면 다른 스레드에서 미리 준비된 명령문이 HTTP 세션에 저장되어있는 지정된 SQL 문자열에 대한 iBatis 캐시 맵에 이미 있는지 확인합니다 AOP를 통해. 존재하는 경우 Statement.cancel() 호출이 발행됩니다. 준비된 문이 취소 될 경우 SqlException이 throw됩니다 (ORA-01013 사용자가 현재 작업 취소를 요청했습니다). Ibatis가 올바르게 처리하므로이 솔루션이 iBatis 내부 메커니즘을 방해 할 수 있습니다. 다른 생성 된 SqlException처럼.

스프링 AOP은 스프링 컨테이너가 관리하는 객체에서 선언 된 포인트 컷 메소드 만 허용하기 때문에 옵션이 아닙니다. iBatis에 의해 내부적으로 생성되고 관리되기 때문에 SqlExecutor를 Spring 빈으로 선언 할 수 없습니다.

AspectJ 프레임 워크에 익숙하지 않아서 AspectJ로 위의 솔루션을 시도한 적이 없다.

이것이 올바른 접근 방법인지 확실하지 않지만 iBatis가 작성한 준비된 명세서를 취소하는 다른 해결책을 찾지 못했습니다. iBatis는 이에 대한 지원을 제공하지 않는 것 같습니다 myBatis 확인).

+0

iBatis에 대해 전혀 알지 못하거나 올바르게 수행해야합니다. AspectJ 관점에서 볼 때 나에게 좋은 도전이 될 것이다. 따라서 Maven 빌드와 일부 메모리 내장 DB에 대한 장기 실행 문을 포함하여 GitHub에서 복제 할 수있는 약간의 [MCVE] (http://stackoverflow.com/help/mcve)를 준비해두면 내가 너를 위해 할 수있는 것을 볼거야. BTW, 나중에 생산에 사용할 aspect-enhanced iBatis 라이브러리를 생성하기 위해 컴파일 타임 짜기를 사용하는 것이 좋습니까? 아니면 LTW (로드 타임 짜기)를 선호합니까? – kriegaex

+0

@kriegaex이 질문은 7 세에 가깝습니다. OP가 누군가의 답변에 대비하여 OP를 사용하게 될지 의심 스럽습니다. 어쩌면 OP는 다른 사람을 도울 것 같지 않은 질문을 삭제해야합니다. –

+0

죄송합니다. 통지하지 않았습니다. AspectJ RSS 피드에 지금 막 나타났습니다. 어떤 이유로 든 문제가 5 시간 동안 편집 되었기 때문입니다. 아주 재미 있군, 안 그래? 힌트를 보내 주셔서 감사합니다. BTW, 그가 [MyBatis 메일 링리스트] (http://mybatis-user.963551.n3.nabble.com/Canceling-Statements-td2549512.html)에 대한 대답을 얻지 못했던 것 같습니다. – kriegaex

답변

0

문을 실행중인 연결에 대한 참조를 가져오고 연결을 무효화하려고 시도 했습니까?