2011-02-03 2 views
2

이 상황을 상상해보십시오. pl/sql 모듈을 변경하고 다시 컴파일하면 모든 것이 잘됩니다. 오류 없음. 그런 다음 Tomcat에서 실행되는 응용 프로그램의 GUI 화면에 액세스하려고합니다. 화면은 Oracle 데이터베이스에서 pl/sql 모듈을 호출합니다. 내가 데이터를 처리하기위한 PL/SQL 모듈 것을라고해야 양식을 제출하면Tomcat은 캐시 된 버전의 pl/sql 모듈을 사용합니까?

, 난 내가 $ USER_OBJECTS의 모든 패키지를 확인

ORA-20001: ORA-06508: PL/SQL: could not find program unit being called 

이 오류가 아무것도 INVALID의 상태가 없다 .

Tomcat을 다시 시작한 다음 작업을 시작합니다. 이것은 처음에 패키지를 다시 컴파일했을 때 Tomcat이 사용하고있는 패키지에 대한 캐시 된 참조를 효과적으로 제거했다는 것을 의미합니까?

데이터베이스 연결은 JDBC 및 DBCP 연결 풀을 통해 이루어집니다. 다시 컴파일하면 연결이 무효화 될 수 있습니까?

답변

3

이 문제는 JDBC 연결 풀에서 발생하며 Tomcat뿐만 아니라 JDBC 연결 풀을 사용하는 모든 응용 프로그램 서버에서 발생하는 문제입니다. 연결 풀은 다음 요청을 위해 풀에 열려있는 여러 연결을 유지합니다. 연결에서 PL/SQL 패키지를 참조하고 다시 컴파일하면 해당 패키지에 대한 다음 호출에서 ORA-06508 오류가 발생합니다. 이것은 직접 호출 한 패키지뿐만 아니라 호출 스택의 모든 위치에 영향을 미칩니다.

웹 로그와 같은 일부 앱 서버를 해결하기 위해 주기적으로 호출되는 테스트 메소드가 있습니다. 테스트가 실패하면 연결이 풀에서 제거되거나 어떤 식 으로든 새로 고쳐집니다. Tomcat이 어떤 메커니즘을 가지고 있는지 잘 모르겠습니다.

또 다른 방법은 JDBC 호출에서 dbms_session.reset_package를 첫 번째 메소드 호출로 호출하는 것입니다. 이렇게하면 세션 상태에서 패키지 상태가 지워집니다. 이 방법은 성능 오버 헤드와 패키지 범위 변수가 재설정되어 패키지 초기화 블록을 다시 호출해야하므로 성능이 저하되므로 권장되지 않습니다.

문제가 있고 잘못된 연결을 삭제할 방법이없는 경우 풀의 모든 연결이 동일한 예외로 인해 어려움을 겪을 수 있으므로 전체 연결 풀을 재설정해야합니다.

+0

방금 ​​확인했습니다. Tomcat 연결 풀은 테스트 쿼리를 사용하여 연결의 유효성을 테스트 할 수 있습니다. 감사 – ziggy

2

화면은 오라클 데이터베이스에서 pl/sql 모듈을 호출합니다.

아니요. Tomcat에서 서블릿 기반 웹 응용 프로그램을 실행한다고 가정하면 브라우저는 관련 서블릿을 호출하는 Tomcat에 요청을 보내고 웹 응용 프로그램의 일부 Java 클래스는 pl/sql 프로그램을 CallableStatement으로 실행합니다.

Java 클래스가 CallableStatement을 실행하는 방법과이 클래스에 대한 참조를 유지하는지 또는 실행될 때마다이를 준비하는지가 핵심입니다. 이것에 대해 어떤 생각을 밝힐 수 있습니까?

편집 :
오라클 JDBC 드라이버가 문 캐싱을 수행 할 수 있다고 생각합니다. 이로 인해 문제가 발생할 수 있습니다. 더 자세한 정보를 얻으려면 드라이버 문서를 읽으십시오.

+0

각 요청마다 CallableStatement가 준비되어 있습니다. 요청이 끝나면 닫힙니다. Connection 객체는 풀로 반환 될 때 닫히지 않습니다. – ziggy

+0

오라클 JDBC 드라이버가 캐시하고있는 것 같습니다. – Qwerky

+0

정확하게 캐시합니까? 그것은 pl/sql 모듈을 호출하는 명령문을 캐시합니까? 여기에 참조가 포함되어 있습니까? 그것은 단지 문장 일 경우 재 컴파일이 어떻게이 문장을 무효화합니까? – ziggy

0

당신이 일반적으로 점점 오류 중 하나를 저장 프로 시저/패키지를 나타냅니다

1) 이름으로 존재하지 않는 당신이

2) 자바 클래스에서 (로 전화를하려고)가 실행하려고하는 사용자 (JDBC 연결에 의해 정의 됨)에 대한 권한 EXECUTE 권한이 누락되었습니다.

3) 동의어가 누락 된 경우 (즉, 스키마가 앞에 붙지 않은 경우)

4) 올바른 숫자와 유형의 매개 변수없이 호출 됨

관련 문제