質問

免責事項:どのくらいかかるのかそれが問題 この質問, なの 展開に必要です。私 その答えた3upvotes場 編集中の問題の展開の要求に答えし となり関係ありません。その理由を私 resubmittingたいと考えて の質問'答え',も がんにおいても有意義なupvoted 答えになります。オープンしま uservoice 提出 この問題です。こういう掲はStackOverflowの元々の質問に答えよう示されないの未解決の問題'タブがあります。

る分散型ロックサービスをお使いになりますか?

の要件は次の通りである。

  1. 相互排除ロックから見た異なるプロセス/機械
  2. ロック---リリース味
  3. 自動ロックをリリースした後、特定のタイムアウトの場合、ロックをホルダーダイス、自動的に解放された後のX秒
  4. Java実施
  5. 簡単に展開 -必ず必要としない複雑な展開を超えては業などを含め、MySqlはGigaSpaces.必要なくなってしまったことは、我々も製品(特にGigaSpaces-この英語表記に切り替えたのを支配しています。
  6. 索:.純実装
  7. の場合は無料:行き詰まり検出/低減

僕は興味ないで回答ようにすることができれぞれのデータベース"、"できる以上のJavaSpaces"-分かっています。関連する答えだけが含まれ、out-of-the-box実績のある実装されます。

役に立ちましたか?

解決

ここでは正確にあなたが、私はネットからGigaSpacesと連携3.基準に何を意味するのか、ないのJavaに応じて、あなたの基準を満たしているGigaSpaces基づいて回答の概要です

ロックとデータメンバーブールプロパティのロックが解除されているものをSpaceID + SpaceRoutingプロパティIDingでロッククラスを作成します。

sealed public class IdLockTrans
{
    [SpaceID]
    [SpaceRouting]
    public string ID
    {
        get;
        set;
    }

    [DataMember]
    public bool Unlocked
    {
        get;
        set;
    }

    public IdLockTrans(Id id)
    {
        ID = id.ID;
    }

    public IdLockTrans()
    {
    }
}

あなたは、特定の後にロック解除用GigaSpaces'リース時間を使用します。 タイムアウト。これはGigaSpacesはIdLockTransオブジェクトを削除します 宇宙から自動的に彼らは、タイムアウトのためにアイドルになった後、 期間。 ID用IdLockTransの欠如は、IDのロックが解除されていることを意味する。

あなたのロッカーのクラスを定義し、これらのクラスのメンバを初期化します。

    private readonly ISpaceProxy _proxy;
    private readonly long _leaseTime;

    public override bool Lock(Id id, long timeout)
    {
        bool locked;
        IdLockTrans lockTransTemplate = new IdLockTrans(id);
        // Assume that this is a new id.
        try
        {
            _proxy.Write(lockTransTemplate, null, _leaseTime, 0, UpdateModifiers.WriteOnly);
            locked = true;
        }
        catch (EntryAlreadyInSpaceException)
        {
            using (ITransaction tx = _proxy.CreateLocalTransaction())
            {
                try
                {
                    lockTransTemplate.Unlocked = true;
                    IdLockTrans lockTrans = _proxy.Take(lockTransTemplate, tx, timeout);
                    locked = (lockTrans != null);
                    if (lockTrans != null)
                    {
                        lockTrans.Unlocked = false;
                        _proxy.Write(lockTrans, tx, _leaseTime, 0, UpdateModifiers.WriteOnly);
                    }
                    tx.Commit();
                }
                catch
                {
                    tx.Abort();
                    throw;
                }
            }
        }
        return locked;
    }

    public override void Unlock(Id lockedId)
    {
        IdLockTrans lockTrans = new IdLockTrans(lockedId);
        lockTrans.Unlocked = true;
        try
        {
            _proxy.Update(lockTrans, null, _leaseTime, 0, UpdateModifiers.UpdateOnly);
        }
        catch (EntryNotInSpaceException)
        {
            throw new Exception("IdLockTrans for " + lockTrans.ID
                + " not found on Unlock. Lock time exceeded lease time.");
        }
    }

他のヒント

あなたの.NET実装では、Java APIを提供ボックスのロックのうち、既存の/アンロックAPIは非常に近いです。見る: http://www.gigaspaces.com/docs/JavaDoc8 .0 / ORG / openspaces /コア/ DefaultGigaMap.html

あなたは製品に付属gs-openspaces-src.zipファイルの一部として、このJavaクラスのソースコードを発見したことがあります。 Gigaspacesの.NET APIと同じを持つことはstraightfwdする必要があります。

あなたはまだ探している場合は、 Apacheの飼育係のを見てみます:

  

のZooKeeperは、命名分散同期を提供し、グループのサービスを提供し、設定情報を維持するための集中型サービスです。サービスのこれらの種類のすべては、分散アプリケーションによって何らかの形で使用されます。

飼育係のドキュメントには、ロックサービスを構築する方法をの例を提供します飼育係の一番上にを。

ユニークキーは非常に簡単ですロックするMySQLを使用します。

仮定1:

あなたはトランザクションを使用して、分離レベルは、コミット読み込まれます。

仮定2: あなたは一意のキーでスレッドを処理ロック、およびトランザクションがコミットしたときにそれを解放します。

そして、あなたが配布するロックとしてこのSQLを使用することができます:

distributed_lockに挿入します(キー)         キーDUPLICATE KEY UPDATEキー= ON値(#{キー});

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top