我的网络应用程序中有一个有点复杂的对象,它需要一些时间才能使其所有属性都可序列化,所以我可以将它粘贴在memcache中。
在我的网络应用程序中将它保存为静态变量是否有任何意义?我不确定静态变量在app引擎中是如何工作的。我在考虑这样的事情:
public class MyServlet {
private static SpaceShuttle mShuttle;
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException
{
// If the static instance isn't already around in this
// application instance, build it.
if (mShuttle == null) {
// Create it once.
mShuttle = complexProcessOfCreatingASpaceShuttle();
}
// Use it.
mShuttle.liftOff();
...
}
}
我认为memcache在这里会有所帮助,因为不同的应用程序实例可以共享同一个对象(我认为?),但作为临时修复,至少app实例可以在生命周期内共享静态实例。
SpaceShuttle是不可变的/只读的,所以没有同步危险(我想?)。
这里有很多未知数,不确定app引擎内部如何工作。我应该尝试将整个SpaceShuttle序列化吗?
由于
答案 0 :(得分:3)
这取决于SpaceShuttle对象是否需要在实例之间共享状态。在app引擎上运行时,您的应用可以在任何给定时间运行0到多个实例。每个实例看起来都像它自己的JVM。 (每个实例/ JVM也可能在其中运行多个线程。)因此,只要您的对象不需要与其他实例共享状态,您应该没问题,并且通过保留它您将保存您的应用程序为每个请求初始化它。
如果您的航天飞机对象都需要彼此同步(因为它们代表某种全局应用程序状态),那么您将需要一些机制来使它们保持同步,这可能与尝试将它们放入memcache一样烦人开头。
话虽这么说,也许你可以将一些航天飞机放入memcache。也许你可以memcache它的一部分,然后在进行实例特定的初始化时抓住它们?
答案 1 :(得分:-1)
没有。这是我经常看到的一个问题,特别是在Java Web应用程序上 - 使用持久性静态变量是不可能扩展的。如果很难序列化整个SpaceShuttle对象,也许你可以解决问题并序列化它的一部分?