2011-10-26 3 views
11

많은 시간 동안 실행되며 JDBC를 통해 Postgresql과 통신하는 여러 스레드를 사용하는 매우 데이터베이스 집약적 인 응용 프로그램이 있습니다. 내가 보는 현상은 가끔씩 (모든 "실행"에서 1 ~ 3 번) 데이터베이스에서 응답을 기다리고있는 것처럼 보이지만 영원히 기다리는 것처럼 보이는 하나 이상의 고정 된 JDBC 연결로 끝나는 경우입니다.Postgresql 8.4 때때로 JDBC 액세스가 가능합니다.

"Thread-4367355" daemon prio=6 tid=0x04920c00 nid=0x1e88 runnable [0x04bef000] 
    java.lang.Thread.State: RUNNABLE 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:129) 
    at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:135) 
    at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:104) 
    at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:73) 
    at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:255) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1165) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:191) 
    - locked <0x2c023e10> (a org.postgresql.core.v3.QueryExecutorImpl) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:337) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:329) 

내가 하나의 스레드 만이 붙어 있습니다 많은 시간을 제외하고 문제를 잠금 어떤 종류의 생각했을 다음과 같이 스레드 덤프입니다. 이 상태에서 본 쿼리 중 적어도 하나는 REINDEX이므로 쿼리에 상당한 시간이 걸릴 가능성이 있습니다. 해결책을 찾기 위해 JDBC 드라이버를 8.4에서 9.1로 업그레이드했지만 여전히 문제가 발생합니다. Postgresql 로그에는 특별한 것이 없습니다. 추가 진단을위한 아이디어 (pg_locks 사용 제외)?

+0

문제를 해결할 수 있었습니까? 9.1에서도 똑같은 '멈춤'을 당하고 있습니다. –

+0

PostgreSQL 8.4, JDBC 드라이버 9.1 같은 문제가 발생합니다. 쿼리는 복잡한 삭제입니다. 서버의 프로세스는 CPU의 100 % 사용을 시작한 다음 갑자기 0 %로 떨어지고 영원히 0 %를 유지합니다. 위와 같이 클라이언트 스레드가 멈 춥니 다. – BrunoJCM

+0

NB가 멈추고 "오브젝트 XXX를 기다리는 중 BLOCKED"라고 표시되면 포스트 그레스 연결이 다중 스레드에서 사용하려고한다는 것을 의미 할 수 있습니다. [물론이 경우의 경우가 아니라] [ – rogerdpack

답변

1

PostgreSQL 자체를 버전 9.1로 업데이트 할 수 있습니다.
long running statements도 모두 기록 할 수 있습니다. 단서를 줄 수도 있습니다.

Set log_min_duration_statement = 2000 

또는 귀하에게 적합한 모든 문항.
나는 스레드 덤프를 해석하는 방법을 모르겠지만,이 라인은 독특한 같습니다

  • 이 잠겨 < 0x2c023e10> (A org.postgresql.core.v3.QueryExecutorImpl)

잠긴 것은 무엇입니까? 그리고 여러분은 그것이 "org.postgresql.cor ..."에서 어떻게 오자인지 알 수 있습니다. 그게 복사 - 붙여 넣기 유물인가 원래 메시지인가? 그렇다면 원점 찾기에 도움이 될 수 있습니다.

+1

] <0x2c023e10>은 메소드를 의미합니다. org.postgresql.core.v3.QueryExecutorImpl 객체 인 잠금을 획득했습니다. 16 진수는 자물쇠의 주소입니까? – crybird

관련 문제