次のようなシングルトンサーブレットを宣言すると
public static class SomeServlet extendsHttpServlet{....。
ここでは、修飾子staticがNetBeansで許可されていないことを示すエラーが発生します。
一度に1つのクライアントしか実行できないシングルトンサーブレットを作成する方法を教えてください。
よろしくお願いします、Mahes
問題についてのあなたの実証された理解に基づいて(しゃれは意図されていません)、これがあなたが選択すべき解決策であるとは思えません。むしろ、質問を言い換えて、質問の最初の改訂で述べた解決策で解決しようとしている問題を述べるようにします。
更新:同期に陥りたくない理由については、この回答へのコメントを参照してください。たとえば、複数のサーブレットが一度に1つずつ同じ機能にアクセスできるようにしたい場合があります。さらに、サーブレットレベルで同期すると、深刻なスケーリングの問題が発生します。並行性の問題を解決するには、間違いなく間違った場所です。
一度に 1 つのリクエストしか処理できないサーブレットを作成するという考えには、私は強く反対します。おそらく別の (適切に同期されたクラス) を作成し、サーブレットにリクエストを何らかの実行キューに入れる必要があります。
を実装しSingleThreadModel
ます。ただし、注意してください。これは非推奨であり、何も実行しない/意味がない可能性があります。これは(シングルトンのように)やっかいなことです。
トップレベルの宣言は決してstatic
. static
要素がクラス レベルで宣言されていることを意味するため、それを囲むクラス宣言が必要です。
サーブレットでは、通常、リクエストを同時に処理するサーブレットのインスタンスが 1 つですが、場合によってはそれ以上になります。したがって、このレベルで同時実行数を減らしたくない場合や、同時セッション数を制限できるサーブレット フィルターまたは Spring Security のようなフレームワークを使用する場合があります。
私は、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 つだけであることを保証できないため、サーブレット メソッドを同期する必要があります。