2010-02-10 7 views
0

몇 번씩 나는 개발 서버에서 내 응용 프로그램을 실행하여 교착 상태 인 것으로 보입니다. 프로덕션 서버에서도 교착 상태가 있는지 확실하지 않습니다. 스레드를 일시 중지하고 그 중 하나가 synchronized 블록의 시작 인 Permissions.implies : 162에 멈추는 지 확인합니다.Google App Engine - Deadlocking?

내 코드는 홈 페이지에서 service 메서드 synchronized이있는 내 InitServlet 서블릿에 동시에 5 개의 jquery 요청을 보냅니다. 서비스 메서드를 통해 매번 다른 구성 요소가 초기화되고 각 구성 요소는 초기화하는 데 약 2 초가 걸립니다. 스레드가 서비스 메소드에 도달하는 순서는 중요하지 않으며 서버 시작 시간 동안 5 번만 발생하므로 서비스 메소드를 동기화하는 것이 좋을 것이라고 생각합니다.

이 교착 상태를 해결하는 방법에 대한 제안 사항이 있습니까? 아니면 개발 서버의 버그 일뿐입니다.

편집 : 교착 상태가 발생하는 곳을 알아 냈지만 여전히 이유는 알 수 없습니다. Permissions.implies에 대한 잠금 내부에서 한 스레드는 Class.getDeclaredConstructors0을 호출하고 결코 반환하지 않습니다. 다른 스레드가 Permissions.implies에서 잠금을 획득하려고 대기 중입니다. getDeclaredConstructors0에있는 첫 번째 스레드는 GAE 예제 문서에서 가져온 표준 PersistenceManagerFactory 클래스에 대한 클래스 초기화를 수행하고 있습니다.

답변

1

App Engine 앱의 인스턴스는 언제든지 시작 또는 종료 할 수 있으며 App Engine은 언제든지 여러 개의 동시 인스턴스를 생성하여 모든 요청을 처리 할 수 ​​있습니다. 그래서 다른 VM은 '초기화'호출의 다른 하위 집합을 가져올 수 있습니다.

+0

그 종류의 해킹은 내 앱 엔진 콜드 스타트 ​​시간을 10 초가 아닌 3 초로 줄이기 위해 수행했습니다. JDO는 getPersistenceManagerFactory에 대해 ~ 2 초, 그리고 모델 클래스 또는 일부 메타 데이터에 대한 메타 데이터를 작성하기 때문에 첫 번째 쿼리에서 ~ 3 초 정도의 초기화 시간이 필요합니다. 게다가 중요한 시작 시간을 가진 openid4java를 사용하고 있습니다. 그래서 내가 할 수있는 경우 초기화가 완료 될 때까지 memcache에서 바로 페이지를 제공합니다. – Kyle

+0

App Engine에서만이 기능 요청을 지원하는 경우 -http : //code.google.com/p/googleappengine/issues/detail? id = 2690 그런 다음 콜드 스타트 ​​시간에 대해 걱정할 필요가 없으며 콜드 스타트 ​​시간을 최적화하는 데 많은 시간을 소비하지 않아도됩니다. 이제는 트래픽이 양호하더라도 일부 사용자 (예 : 두 번째 또는 세 번째 JVM 인스턴스가 시작될 때)에 대한로드 요청이 항상있을 것입니다. – Kyle