2016-09-14 2 views
0

私はOrientDB(コミュニティ版2.2.9)を複数のノードを持つ分散モードで実行しています。OrientDBはロックレコードを無期限に保持します

数分後、私は私のクエリに次のエラーを取得を開始:

com.orientechnologies.orient.server.distributed.task.ODistributedRecordLockedException: Timeout (1500ms) on acquiring lock on record #1010:2651. It is locked by request 3.1000 DB name="MyDatabase" 

このインスタンス内のクエリは次のようになります。

UPDATE #1010:2651 SET name='foo'; 

レコードがロックされたままで、私ができますデータベースを再起動するまでクエリを実行しないでください。

分散モードでサーバーを実行していない場合は、このエラーが発生しないため分散モードで実行する必要があります。 "を除去することにより

.... 
    <handler class="com.orientechnologies.orient.server.hazelcast.OHazelcastPlugin"> 
     <parameters> 
      .... 
      <parameter value="com.orientechnologies.orient.server.distributed.conflict.ODefaultReplicationConflictResolver" name="conflict.resolver.impl"/> 
      .... 
     </parameters> 
    </handler> 
    ... 

:ここ

は私のデフォルトの配布-DB-config.jsonは、私は私のorientdbサーバ-config.xmlに以下の設定を使用していた

{ 
    "autoDeploy": true, 
    "readQuorum": 1, 
    "writeQuorum": 1, 
    "executionMode": "asynchronous", 
    "readYourWrites": true, 
    "servers": { 
    "*": "master" 
    }, 
    "clusters": { 
    "internal": { 
    }, 
    "*": { 
    "servers": ["<NEW_NODE>"] 
    } 
    } 
} 

ですODefaultReplicationConflictResolver "構成からのパラメタ、ロックの問題はあまり頻繁に発生しません。

なぜレコードがロックされているのですか?これを避けるにはどうすればよいですか?

答えて

2

asynchronousを使用すると、この問題が発生することがあります。参照:Asynchronous replication mode

実行モードを変更するか、クエリに再試行を追加できます。 Javaの使用:非同期レプリケーション中にコマンドのイベントをキャッチすることが可能であるOCommandSQLの以下の方法のおかげで:

  • onAsyncReplicationOk()、非同期レプリケーションは
  • onAsyncReplicationError()を成功したときにときにイベントをキャッチするために、イベントをキャッチします

    g.command(new OCommandSQL("create edge Own from (select from User) to (select from Post)") 
    .onAsyncReplicationError(new OAsyncReplicationError() { 
        @Override 
        public ACTION onAsyncReplicationError(Throwable iException, int iRetry) { 
        System.err.println("Error, retrying..."); 
        return iException instanceof ONeedRetryException && iRetry<=3 ? ACTION.RETRY : ACTION.IGNORE; 
        } 
    }) 
    .onAsyncReplicationOk(new OAsyncReplicationOk() { 
        System.out.println("OK"); 
    } 
    ).execute(); 
    
    :非同期レプリケーションは、エッジの作成上の同時変更例外の場合の3倍にエラー

例の再試行アップを返します

それともSQL Batchに再試行追加:

begin 
let upd = UPDATE #1010:2651 SET name='foo' 
commit retry 100 
return $upd 

はそれがお役に立てば幸いです。

+0

実行モードを「同期」に設定すると、状況がさらに悪化します。私の頂点は常に古く、更新される状態にはなりません。 私はメッセージングサービスとしてrabbitMQでPyorientを使用しています。だから、rabbitMQは成功するまでレコードを書き続けるつもりです。問題は、レコードが決して解放されないということです。ロックを解除する唯一の方法は、OrientDBを再起動することです。 – anber

+0

問題はpyorientまたはrabbitmqにある可能性があります。 –

+1

私のサーバー上で混乱を招いていたものの組み合わせのようです。私はpyorientでメモリリークを取得し、それはほとんど応答の点まで私のドッキングマンを遅くしていた。これにより、接続フォームが正しく閉じられなくなる可能性があります。私はそれが理由だったのかどうかはわかりませんが、実行モードを「同期」として設定すると突然動作しました。ありがとう:) – anber

関連する問題