2009-10-02 1 views
1

우리는 Jetty에서 JRuby on Rails 응용 프로그램을 실행 중이며 실행 전에 준비 서버에 도달하면 갑자기 JDBC 연결이 중단되어 문제가 발생했습니다. 여기에 설명 할 멋진 스택 추적이 있습니다 :Jetty의 JRuby on Rails 응용 프로그램에서 MySQL 연결 시간 초과/버려졌습니다.

서버로 보낸 마지막 패킷은 12 밀리 초 전이었습니다.

스택 트레이스 :

com.mysql.jdbc.CommunicationsException : 통신 링크 실패로 인해 기본 예외 :

**

java.io.EOFException ** 상자의 예외를 BEGIN

스택 :

java.io.EOFException at com.mysql.jdbc.MysqlIO.readFully (MysqlIO 된 .java : 1913 내 이해의 주위에 읽는에서 com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:2803)

에서 com.mysql.jdbc.MysqlIO.reuseAndReadPacket (MysqlIO.java:2304에서) ) MySQL은 활동이 없기 때문에 일정 기간 동안 연결 풀을 죽이는 것입니다 (이는 준비 작업이 현재 매우 가벼운 상황에서 당연한 것입니다). 그것은 다음과 같은 보석과 JRuby를 1.3.1에서 실행중인 :

액티브 - JDBC 어댑터 (0.9.1) 액티브 - jdbcmysql 어댑터 (0.9.1) jdbcmysql (5.0.4)

연결을 제대로 유지하거나 제대로 재활용 할 수 있도록 JDBC 설정을 어떻게해야할지 생각하고 있습니다. 그러나 어디에서 볼지를 찾는 데 도움이 필요합니다. 누구든지 내게 세부 사항을 제공 할 수 있습니까?

감사합니다, 스티브

답변

1

이 때문에 wait_timeout 설정에 아마 입니다. 매우 큰 항목으로 늘려 볼 수도 있지만 데이터베이스 서버에 대한 관리 액세스 권한이 있다고 가정합니다.

JRuby 나 Rails를 사용한 적이 없습니다. 그러나 "일반적인"Java에서이 문제를 해결하는 방법은 유휴 연결을 자동으로 재활용하는 연결 풀을 사용하는 것입니다. 예를 들어, c3p0에는 maxIdleTime 설정이 있습니다.

EDIT : 재미있게하기 위해 "activerecord idle connection"에 대한 Google 검색을 수행했으며 몇 가지 검색 결과가 있습니다. 여기에 하나 : http://groups.google.com/group/sinatrarb/browse_thread/thread/54138bfedac59849

분명히 사용할 수있는 방법은 ActiveRecord::Base.verify_active_connections!입니다. 나는이 솔루션에 대해 어떠한 보증도하지 않습니다 :-). IANARP (저는 Ruby 프로그래머가 아닙니다).

1

레일즈 또는 ActiveRecord-JDBC 코드는 정기적 인 연결 핑 또는 유휴 시간 teardown을 제공해야합니다. 연결 풀링 구현이 처리 할 수 ​​있어야하는 표준 경우는 서버에서 선택하는 연결입니다.

kenai.com에서 ActiveRecord-JDBC 버그를 신고 하겠지만, 다른 사람들이이를 위해 확실한 해결책을 찾은 경우 JRuby ML에 먼저 물어보십시오.