2013-11-14 2 views
1

정적 인 초기화 (예 : 지속성 라이브러리)가 주어진 인스턴스에 대한 요청간에 지속된다고 가정했습니다. 갑자기 나에게 어쩌면 틀렸을 수도 있습니다. 어쩌면 따뜻한 인스턴스에서도 각 요청에 대해 내 앱의 init이 다시 실행될 수 있습니다. 내가 부탁 해요 이유는 다음과 같습니다정적 초기화가 각 요청마다 반복됩니까?

는 다음과 같습니다

내가 개체의 목록을 수신하고이를 저장하는 요청 처리기를 (구글 엔드 포인트로 발생하지만 그 관련되어 있다고 생각하지 않습니다)이있다.

엔티티는 20 가지 유형 중 하나 일 수 있으므로 정적 초기화는 20 가지 엔티티 유형을 모두 '등록'합니다. 내가 객관화 사용하는 일이, 그래서 다음과 같습니다

@Api(name = "myendpoint") 
public class MyEndpoint { 
    static { 
    ObjectifyService.register(EntityOne.class); 
    ObjectifyService.register(EntityTwo.class); 
    ... x20 
    } 

수행중인 경우 모든 요청에 ​​대해 '등록하기'나는 더 나은했다만을 요청에 필요한 기관 등록으로 변경.

(I 옳다 새로운 인스턴스를 생성 할 때 내 정적 초기화 만 수행하면 다른 한편으로는, 나는 정적 초기화에 많은 초기화를 내가 할 수있는대로 놓아야합니다.)

+1

나에게 점수를 줄 수있는 것은하지 말아주세요 - 단지 제가 3333에 있다는 것을 깨달았습니다! – Tom

+0

정적 초기화 블록 내에서 객체화 초기화를 피하는 것이 좋습니다. 클래스 앞에 번역기를 추가하고 객체화할 때 등록 할 때 스레드 안전성을 공장에 적용하지 않아야합니다. 또한이 방법은 로컬에서 디버그/핫로드하는 것을 어렵게 만들 수 있습니다. – Nick

답변

4

정적 초기화 블록 클래스가로드 될 때 한 번 실행됩니다.

+0

네,하지만 제 질문은 클래스 로딩에 관한 것입니다. 그래서 당신은 내 애플 리케이션의 클래스 (및 그들의 정적 init)로드가 인스턴스 당 한 번만 발생하고 요청 사이에 지속되는지 확인하고 있다고 생각합니다. – Tom

+1

@Tom "인스턴스"가 모든 클래스를 언로드하고 인스턴스 수명주기의 어딘가에 다시로드 할 가능성은 거의 없지만 가능합니다. 그러나 그것은 어떤 문제도 일으키지 않아야합니다. 응용 프로그램에 인스턴스가 다시로드되는 것과 같습니다. – ZhongYu

+0

@ zhong.j.yu 좋아요, 그렇다면 당연히 많은 정적 정적 초기화에 대해 걱정할 필요가 없습니다. 고마워. – Tom

1

예, 정적 초기화 블록은 클래스가로드 될 때만 실행됩니다. 이는 GAE 인스턴스 당 한 번만 발생한다는 것을 의미합니다.

뭔가 다른 가치가 있습니다. 자신의 Objectify 서비스 클래스를 통해 이러한 클래스를 Ofy에 등록한 다음이를 사용하여 Objectify 기능에 액세스하는 것이 더 좋습니다. https://code.google.com/p/objectify-appengine/wiki/BestPractices을 참조하십시오. 그러면 데이터 스토어 액세스가 발생하기 전에 블록이 실행됩니다.

+0

그래, 나는 당신이 제안하는 방식으로 전환해야한다고 생각했다. 또한 각 앱의 진입 점에서 동일한 초기화 코드 (레지스터 목록)를 반복하지 않도록해야한다. – Tom

관련 문제