2013-11-14 51 views
1

我一直假設靜態初始化(例如我的持久庫)將持續在給定實例的請求之間?突然間我發現,也許我錯了 - 也許我的應用程序的初始化對每個請求重做,即使在一個溫暖的實例。是否對每個請求重複靜態初始化?

這也是爲什麼我要問:

我有一個請求處理程序(它正好是谷歌的終點,但我不認爲這是相關的)接收實體的名單,拯救他們。

實體可以是20種不同類型的任何一種,所以我的靜態初始化「註冊」了所有20種不同的實體類型。我碰巧使用客觀化,所以它看起來是這樣的:

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

如果做這一切爲每個請求「登記」,那麼我最好還是將其更改爲僅註冊請求所需的實體。

(在另一方面,如果我是對的,創造一個新的實例時,我的靜態初始化只做到,那麼我應該把儘可能多的初始化,我可以進入靜態初始化。)

+1

請不要做任何事情會給我點 - 只是意識到我在3333! – Tom

+0

您最好避免在靜態初始化塊中初始化對象化 - 您需要在類之前添加翻譯器,並且在註冊時,對象化不會將任何線程安全性應用於工廠。另外,這種方式會使本地調試/熱載入變得很痛苦。 – Nick

回答

4

靜態初始化塊在加載類時運行一次。

+0

是的,但後來我的問題變成了類加載。所以我認爲你確認我的應用程序的類(和它們的靜態init)的加載僅在每個實例中發生一次,並在請求之間持續存在。 – Tom

+1

@Tom「實例」不太可能,但是可能的是,「實例」會卸載所有的類並在實例的生命週期的某個地方重新加載它們。但是,這不應該導致任何問題;到您的應用程序,就像實例被重新加載一樣。 – ZhongYu

+0

@ zhong.j.yu好的,那麼我不會擔心會做大量的靜態init(當然,在理由之內)。謝謝。 – Tom

1

是的,靜態初始化塊只在加載類時運行。這意味着每個GAE實例只會發生一次。

值得考慮的其他值得注意的事情是:最好通過你自己的Objectify服務類向Ofy註冊這些類,然後用它來訪問Objectify功能。請參閱https://code.google.com/p/objectify-appengine/wiki/BestPractices ...確保在任何數據存儲訪問發生之前運行這些塊。

+0

是的,我一直在想我應該改用你的建議,也是爲了避免在每個應用程序的入口點重複相同的初始化代碼(寄存器列表)。 – Tom