Memcache或每个应用程序实例只是一个静态实例?

时间:2011-01-18 03:41:27

标签: google-app-engine

我的网络应用程序中有一个有点复杂的对象,它需要一些时间才能使其所有属性都可序列化,所以我可以将它粘贴在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序列化吗?

由于

2 个答案:

答案 0 :(得分:3)

这取决于SpaceShuttle对象是否需要在实例之间共享状态。在app引擎上运行时,您的应用可以在任何给定时间运行0到多个实例。每个实例看起来都像它自己的JVM。 (每个实例/ JVM也可能在其中运行多个线程。)因此,只要您的对象不需要与其他实例共享状态,您应该没问题,并且通过保留它您将保存您的应用程序为每个请求初始化它。

如果您的航天飞机对象都需要彼此同步(因为它们代表某种全局应用程序状态),那么您将需要一些机制来使它们保持同步,这可能与尝试将它们放入memcache一样烦人开头。

话虽这么说,也许你可以将一些航天飞机放入memcache。也许你可以memcache它的一部分,然后在进行实例特定的初始化时抓住它们?

答案 1 :(得分:-1)

没有。这是我经常看到的一个问题,特别是在Java Web应用程序上 - 使用持久性静态变量是不可能扩展的。如果很难序列化整个SpaceShuttle对象,也许你可以解决问题并序列化它的一部分?