1

サーブレットを作成するときのAppEngineサービスの適切なスコープは何ですか:静的、インスタンス、またはローカルですか?そして、それぞれの意味は何ですか?再作成(または再取得)のオーバーヘッドを回避するために、可能な限り広い範囲でそれらを使用する必要があるようですが、これがデータの不適切な再利用を引き起こすかどうか、特に<threadsafe>true</threadsafe>


各スコープの例を以下に示します。 MemcacheService以下の例で使用されますが、私の質問はすべてのサービスに当てはまります(ただし、使用されているサービスによって答えが異なるかどうかはわかりません)。私はよく、、、、、、を使用MemcacheServiceします。DatastoreServicePersistenceManagerChannelServiceUserService

静的スコープ:

public class MyServlet extends HttpServlet {
    private static MemcacheService memcacheService = MemcacheServiceFactory.getMemcacheService();

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        memcacheService.get("x");
    }
}

インスタンスメンバー:

public class MyServlet extends HttpServlet {
    private MemcacheService memcacheService = MemcacheServiceFactory.getMemcacheService();

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        memcacheService.get("x");
    }
}

ローカルスコープ:

public class MyServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        MemcacheService memcacheService = MemcacheServiceFactory.getMemcacheService();
        memcacheService.get("x");
    }
}
4

1 に答える 1

3

GAE は、すべてのサービスが別々のサーバーで実行される分散システムです。したがって、サービスを呼び出すと、リクエストを内部的にシリアル化し(プロトコルバッファを使用して)、サービスを実行しているサーバーに送信し、結果を取得して逆シリアル化します。

したがって、すべての*Serviceクラスは基本的に、シリアライゼーション/デシリアライゼーション コードのかなり薄いラッパーです。たとえば、 MemcacheService のソースを参照してください。

スコープについて:*Serviceクラスは非常に薄いラッパーであり、サービス全体のラウンドトリップと比較して作成にかかる時間はごくわずかであるため、クラスを最適化する必要はありません。

于 2012-09-02T18:23:04.503 に答える