【问题标题】:Is static init repeated for each request?是否为每个请求重复静态初始化?
【发布时间】:2013-11-14 22:14:56
【问题描述】:

我一直假设静态初始化(例如,对于我的持久性库)将在给定实例的请求之间持续存在?我突然想到,也许我错了——也许我的应用程序的初始化会针对每个请求重做,即使在暖实例上也是如此。

这就是我问的原因:

我有一个接收实体列表并保存它们的请求处理程序(它恰好是一个 Google 端点,但我认为这无关紧要)。

实体可以是 20 种不同类型中的任何一种,因此我的静态初始化“注册”了所有 20 种不同的实体类型。我碰巧在使用objectify,所以它看起来像这样:

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

如果它为每个请求进行所有这些“注册”,那么我最好将其更改为仅注册请求所需的实体。

(另一方面,如果我是对的,并且我的静态初始化仅在创建新实例时完成,那么我应该将尽可能多的初始化放入静态初始化中。)

【问题讨论】:

  • 请不要做任何能给我加分的事情——刚刚意识到我在 3333!
  • 你最好避免在静态初始化块中初始化objectify——你需要在类之前添加翻译器,并且objectify在注册时不会对工厂应用任何线程安全。此外,这种方式会使本地调试/热加载很痛苦。

标签: java google-app-engine objectify


【解决方案1】:

静态初始化块在加载类时运行一次。

【讨论】:

  • 是的,但是我的问题是关于类加载。因此,我认为您正在确认我的应用程序类(及其静态初始化)的加载每个实例仅发生一次,并且在请求之间持续存在。
  • @Tom 在实例生命周期的某个地方,“实例”不太可能但可能会卸载所有类并重新加载它们。但是,这不应该引起任何问题;到您的应用程序,就像重新加载实例一样。
  • @zhong.j.yu 好的,这样我就不用担心做很多静态初始化了(当然,在合理范围内)。谢谢。
【解决方案2】:

是的,静态初始化块仅在加载类时运行。这意味着每个 GAE 实例只发生一次。

其他值得考虑的事情:通常最好通过您自己的 Objectify 服务类向 Ofy 注册这些类,然后使用它来访问 Objectify 功能。请参阅 https://code.google.com/p/objectify-appengine/wiki/BestPractices ... 这可确保在发生任何数据存储访问之前运行块。

【讨论】:

  • 是的,我一直在想我应该切换到您建议的方式,同时避免在每个应用程序的入口点重复相同的初始化代码(寄存器列表)。
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多