1

次のようなシングルトンサーブレットを宣言すると

public static class SomeServlet extendsHttpServlet{....。

ここでは、修飾子staticがNetBeansで許可されていないことを示すエラーが発生します。

一度に1つのクライアントしか実行できないシングルトンサーブレットを作成する方法を教えてください。

よろしくお願いします、Mahes

4

5 に答える 5

6
  • staticは、任意の時点で1つのスレッドのみによって実行されることとは関係ありません。
  • 内部クラスとして静的クラスを持つことができますが、これは最初のポイントのために問題を解決しません
  • 正しく思い出せば、インスタンス化されたサーブレットは1つだけなので、シングルトンを作成する必要はありません。更新: DefLogが指摘したように私は正しく覚えていませんでした
  • そのため、メソッド(doGet、doPost、service、または実装メソッド)の更新で同期します。トリックは実行されません。

問題についてのあなたの実証された理解に基づいて(しゃれは意図されていません)、これがあなたが選択すべき解決策であるとは思えません。むしろ、質問を言い換えて、質問の最初の改訂で述べた解決策で解決しようとしている問題を述べるようにします。

更新:同期に陥りたくない理由については、この回答へのコメントを参照してください。たとえば、複数のサーブレットが一度に1つずつ同じ機能にアクセスできるようにしたい場合があります。さらに、サーブレットレベルで同期すると、深刻なスケーリングの問題が発生します。並行性の問題を解決するには、間違いなく間違った場所です。

于 2009-02-22T11:58:59.280 に答える
3

一度に 1 つのリクエストしか処理できないサーブレットを作成するという考えには、私は強く反対します。おそらく別の (適切に同期されたクラス) を作成し、サーブレットにリクエストを何らかの実行キューに入れる必要があります。

于 2009-02-22T12:11:27.490 に答える
1

を実装しSingleThreadModelます。ただし、注意してください。これは非推奨であり、何も実行しない/意味がない可能性があります。これは(シングルトンのように)やっかいなことです。

于 2009-02-22T12:11:17.987 に答える
0

トップレベルの宣言は決してstatic. static要素がクラス レベルで宣言されていることを意味するため、それを囲むクラス宣言が必要です。

サーブレットでは、通常、リクエストを同時に処理するサーブレットのインスタンスが 1 つですが、場合によってはそれ以上になります。したがって、このレベルで同時実行数を減らしたくない場合や、同時セッション数を制限できるサーブレット フィルターまたは Spring Security のようなフレームワークを使用する場合があります。

于 2009-02-22T12:37:11.453 に答える
-3

私は、Singleton が過剰に使用されていると考える傾向があり、多くの場合、ソリューションの基本的なアーキテクチャに欠陥があることを示しています。シングルトンが必要であることを証明するのに十分な分析を行ったと仮定すると、静的初期化に依存しない古いシングルトン パターンを使用できます。次に例を示します。

public SomeServlet extends HttpServlet {

    private instance = null;

    private SomeServlet() {
        // Construction code here
    }

    public synchronized SomeServlet getInstance() {
        if(instance == null) {
            instance = SomeServlet();
        }
        return instance;
    }

    // Servlet methods here

}

ただし、潜在的な問題が 2 つあります。

まず、ラッパー サーブレットが必要です (または、サーブレット コンテナーはプライベート コンストラクターがない場合の対処方法がわからないため、別のサーブレットからチェーンするだけかもしれません)。

第 2 に、サーブレット内のエグゼキュータ スレッドが一度に 1 つだけであることを保証できないため、サーブレット メソッドを同期する必要があります。

于 2009-02-22T12:38:19.810 に答える