JPA (EclipseLink)를 통해 Postgres 데이터베이스에 액세스하는 Java 프로그램이 있습니다.
먼저 JPA에서 데이터베이스를 만들도록했습니다.
그런 다음 생성 된 데이터베이스를 조작하는 pgsql 스크립트 인 java.sql.Connection (엔티티 관리자에서 unwrap()을 통해 얻음)을 실행합니다.
엔티티 관리자가 연결 풀 (c3p0)과 함께 작동하도록 구성되었습니다.
스크립트의 일부가 테이블 목록의 제약 조건을 삭제합니다.
어떤 이유로 테이블 수가 떨어지면 막히게됩니다.
다른 활성 트랜잭션 (pg_stat_activity)이없고 부여되지 않은 잠금 (pg_locks)이 없습니다.
drop 제약 조건 문 앞뒤에 디버그 인쇄를 추가했습니다. 둘 다 인쇄되므로 루프 중간에 멈추는 것 같습니다. pg_stat_activity에서 선택하는 경우 다음과 같은 결과는 관련 거래에 반환됩니다postgres plsql 스크립트 루프가 멈춤
Waiting: false
State: Active
Query: Empty
CPU 사용량 및 체크 아웃에서 포스트 그레스 프로세스가 유휴 상태 인 것 같다. pgAdmin에서 스크립트를 실행할 때 Java 프로그램에서 실행될 때만 멈추지 않습니다. 일반적으로 루프 반복 횟수가 200 회를 초과하면 멈추지 만 다른 루프에도 걸렸습니다. 코드를 리베이스 한 후 문제가 두 번 사라졌습니다 (실제 Vodou).
그런 시나리오에 대한 Postgres 분석 도구에 더 관심이 있습니다. 이 교착 상태를 해결할 수있는 아이디어 나 기술을 제공해 주시면 감사하겠습니다.
- 문제를 해결 해결 방법은 새 JDBC 연결을 열고 거기에서 그것을 실행했다,하지만 난 여전히 문제는 그에게 미래를 int로 해결하는 방법을 이해하기 관심이 있어요.
Linux를 사용하고 있다면 걸린 프로세스의'strace -p'을 실행 해 보셨습니까? 'pg_stat_activity'를 질의하여 pid를 볼 수 있습니다. 또한,''pg_stat_activity'에서 쿼리의 "state"컬럼의 값은 무엇입니까? –
bma
누락 된 정보를 질문에 추가했습니다. 감사. @bma –
실제로 잠금 쿼리가없고 db에서 아무 것도 일어나지 않는 경우 프로세스를 strace합니다. 다음은 유용한 자습서입니다. http://www.hokstad.com/5-simple-ways-to-troubleshoot-using-strace – bma