7

たとえば、DBManager.javaシングルトンクラスがあり、クラスター環境にデプロイする必要があります。これはWebベースのアプリケーションであり、次の展開戦略を備えています

Apache Load Balancer-> Tomcat 6(クラスター内の3台のサーバー)。

3つのTomcatインスタンスに対してDBManagerの単一インスタンスを維持する必要があります。

私のコードは

package com.db.util;
public class DBManager {
    private static DBManager singleInstance;
    private DBManager () {}
    public static DBManager getSingleInstance() {
        if (singleInstance == null) {
            synchronized (DBManager.class) {
                if (singleInstance == null) {
                    singleInstance = new DBManager ();
                }
            }
        }
        return singleInstance;
    }
}

私はこの問題の解決策を探していて、JGroupsAPIのようなものを見つけました。これは、JGroupsを使用して実現できますか?任意のアイデア、それを実装する方法は?

4

2 に答える 2

6

Javaは各インスタンスでシングルトンを提供します。インスタンス間の何らかの調整が必要なため、いつでもインスタンスの1つがアクティブになりますが、アクティブなインスタンスが停止すると、別のインスタンスがアクティブになります。

一部のアプリサーバーには、このような調整されたワーカーインスタンスを制御する機能が組み込まれていますが、Tomcatにこのような機能があるかどうかはわかりません。

このような機能を自分で構築することは驚くほど困難です。この質問を参照してください。この質問は、便利なライブラリへのリンクを提供します。これは、使用するのが非常に複雑に見えます。

しかし、あなたの場合、あなたはデータベースを持っています、そしてそれはあなたに調整のポイントを与えます。これについては詳しく設計していませんが、制御テーブルの専用行を使用して予約スキームを作成することは可能だと思います。これを効率的に行うのは少し難しいでしょう。インスタンスの死の検出速度と、どのインスタンスがアクティブであるかを確認するためのデータベースのポーリングのオーバーヘッドとのバランスを取りますが、実行可能のようです。

レコードには「reservedUntil」タイムスタンプと「processId」が含まれているという考え方です。各プロセスはレコードを読み取ります。レコードに独自のIDが含まれていて、タイムスタンプの有効期限がまだ切れていない場合は、レコードが機能することがわかります。時間がほぼ満了すると、アクティブなプロセスは、競合状態を管理するために、楽観的ロックスタイル「Updatewheretimestamp==oldtimestamp」を使用してタイムスタンプを更新します。非アクティブな各プロセスは、最後に読み取ったタイムスタンプの期限が切れるまで待機してから、レコードを更新することによって制御を取得しようとします。ここでも、楽観的ロックのUpdatewhereを使用します。通常、その制御の試みは失敗しますが、成功すると、新しいアクティブインスタンスが作成され、楽観的ロックにより、アクティブインスタンスを1つしか取得できなくなります。

于 2012-08-20T06:44:31.073 に答える
0

シングルトンは、特定のJVM内のクラスのインスタンスを1つだけ保証します。

あなたの場合、JVMごとに1つずつ、複数のDBManagerの問題は何ですか?

于 2012-08-20T06:12:42.660 に答える