2016-08-04 3 views
0

Java 프로그램에서 저장 프로 시저를 호출하여 파일의 구문을 분석하고 테이블의 특성을로드합니다. 이것은 소프트 삭제를 할 때 특히 시간이 많이 걸리는 단계입니다 (동일한 파일의 최신 버전이 들어 왔을 때 이전 레코드를 업데이트하는 대신 old 레코드의 삭제 플래그를 설정합니다). Java 프로그램은 완료 될 때까지 기다리는 경향이 있습니다. 때로는 많은 수의 파일이 db에로드 될 때 java 프로그램이 갑자기 종료되어 코어 덤프를 생성합니다. 큰 워크 플로의 일부로이 작업을 종료해도 나머지 단계에는 영향을 미치지 않습니다. 계속 실행되면 다른 코어 덤프 및 hs_err_pid 로그 파일을 사용하여 다음 단계 (또 다른 저장 프로 시저를 호출 함)에서 다시 실패합니다. 그러나 파일을로드하는 저장 프로시 저는 몇 시간 후에 완료 될 때까지 계속됩니다. 코어 덤프의 타임 스탬프는 오라클이 소프트 삭제를 수행하는 시점과 정확히 일치 함을 나타냅니다.Java에서 Oracle 저장 프로 시저를 호출 할 때 코어 덤프를 피하는 방법

로그와 코어 덤프를 읽으면 무엇이 잘못되었는지 알려주지 않습니다. gdb를 사용하여 코어 덤프를 디버깅했으며 프로 시저 호출 중 오류가 발생했음을 보여줍니다. 내 생각 엔 오라클이 파일을로드하는 데 너무 바빴고 (소프트 삭제 중) 일부 지점에서 무책임하여 JVM이 충돌하여 코어 덤프가 발생했습니다. 비슷한 이유로이 작업 이후에도 작업은 여전히 ​​과부하 상태이므로 db와 통신하는 데 문제가 있습니다.

오라클 측에서는 SQL 예외가 발생하기 때문에 잡을 것이 없습니다. JVM이 손상되지 않도록 치명적인 오류를 피할 수있는 방법이 있습니까? 아니면 오라클을 듣기보다는 스토어드 프로 시저를 호출하고 프로 시저가 완료 될 때만 리턴하면 Java에서 db의 연결을 해제하도록 Java에 지시 할 수 있습니다.

try { 
    CallableStatement stmt = conn.prepareCall("{call FILE_PROCESS.load_file(?,?,?,?,?,?,?,?,?)}"); 
    for (int i = 1; i < 10; i ++) { 
     stmt.setString(i, arr[i - 1]); 
    } 
    stmt.registerOutParameter(7, Types.VARCHAR); 
    stmt.registerOutParameter(8, Types.VARCHAR); 
    stmt.registerOutParameter(9, Types.VARCHAR); 
    stmt.executeUpdate(); 
    stmt.close(); 
    conn.close(); 
} 
catch (SQLException e) { 
    e.printStackTrace(); 
    System.exit(1); 
} 

편집 : 같은 시간에 시스템에 의해 생성 된 또 다른 파일 'hs_err_pid26342.log'여기

내가 프로 시저를 호출하는 데 사용하는 자바 코드입니다. 나는 그것의 일부를 아래에 붙여 넣었다. 그것은 SR_Handler에 관해 뭔가를 말합니다. 이 방법은 무엇이며 어떻게 호출됩니까?

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# SIGSEGV (0xb) at pc=0x00002b95187851d3, pid=26342, tid=47919353368928 
# 
# JRE version: 7.0-b147 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0-b17 mixed mode linux-amd64 compressed oops) 
# Problematic frame: 
# V [libjvm.so+0x6f31d3] SR_handler(int, siginfo*, ucontext*)+0x43 
+2

설명이 의미가없는 것처럼 보입니다. Java 응용 프로그램은 저장 프로 시저가 반환되기까지 너무 오래 기다리기 때문에 단순히 코어 덤프를 수행하지 않습니다. 최악의 경우, 일종의 SQL 타임 아웃 예외가 발생하지만 코어 덤프는 발생하지 않습니다.저장 프로 시저를 실행하는 데이터베이스에서 작업을 제출하고, 결과를 테이블에 기록하고, 프로 시저 호출을 비동기로 만들려는 경우 응용 프로그램에서 해당 테이블을 폴링 할 수 있지만 문제에 영향을 미치지는 확실하지 않습니다. –

+0

@JustinCave 자바가 너무 오래 기다리는 지 확신 할 수 없다. 어쩌면 데이터베이스가 너무 바빠서 소프트 삭제와 같은 일을하지 않으면 Oracle과의 통신이 끊어 질 수도 있습니다. 의미가 없지만 Java에서 소프트 삭제와 코어 덤프간에 명백한 상관 관계가 있습니다. – ddd

+0

너무 오래 기다리거나 통신이 끊어져도 코어 덤프가 발생하지 않습니다. 무기한으로 대기하고 Java에서 호출하는 저장 프로 시저를 작성하면 코어 덤프가 생성되지 않습니다. JVM은 실행 중 프로 시저가 수행하는 작업에 대한 통찰력이 없으므로 프로 시저가 수행하는 특정 작업과 코어 덤프를 상관시키는 것이 적절하지 않습니다. 이것은 잘못된 상관 관계가 더 커지고 코어 덤프를 다시보고 디버깅을 지원하기 위해 응용 프로그램 서버를 지원하는 회사에 참여해야 할 필요가 있습니다. –

답변

0

저장 프로 시저를 호출하는 대신 오라클을 듣고 이며 경우에만 절차 완료 반환하면 내가 DB를 분리하기 위해 자바를 알 수있는 방법.

DBMS_SCHEDULER를 살펴보십시오.

오히려 자바보다 더

BEGIN 
    file_load_stored_proc; 
END; 

당신이 그 스케줄러 작업으로 코딩 할 것이다 실행

후 자바는 백그라운드 작업으로 해당 작업을 실행하기 위해 데이터베이스를 말할 것. 데이터베이스는 별도의 데이터베이스 세션에서 작업을 시작하고 즉시 Java 프로그램으로 제어를 전달합니다. 실패하면

BEGIN 
    DBMS_SCHEDULER.RUN_JOB('FILE_LOAD_JOB',false); 
END; 

당신은 이메일을 보내 스케줄러 작업을 구성 할 수 있습니다 (또는 당신이 그 통지를 할 경우 성공에도).

추신. 나는 데이터베이스 실행의 어딘가에서 오류가 발생하고 있으며 Java가 코어 덤프를 깨끗하게 처리하지 못하고 있다고 생각합니다. 스케줄러 작업을 통해 문제를 진단 할 수 있습니다.

관련 문제