0

カフカキューからカサンドラDBにデータを書き込むためのストームトポロジがあります。プログラムはマルチスレッドのものです。カサンドラのデシベルの挿入を容易にするために、私は私のDBUtilsとしてこれを持っている:ストームトポロジの全スレッドで変数を同期させよう

public DBUtils() { 
    if(session == null) { 
     session = CassandraUtil.getInstance().getSession(); 
     LOG.info("Started a new session for dbUtils-Monitoring....."); 
    } 
    synchronized(session) { 
     testMapper = new MappingManager(session).mapper(TestVO.class); 
    } 
} 

はので、私はすべての実行中のスレッド全体で単一dbUtilsインスタンスを作成するために、同期に使用しています。しかし、ログを確認すると、セッションが複数回初期化されているように見えます。ストームトポロジのdbUtilsは準備メソッドでのみ初期化され、準備/実行/クリーンアップメソッド全体で使用されています。したがって、すべてのスレッドで使用したい変数が複数の場所で使用されている場合は、synchronizedブロックを使用する方法がわかりません。 私の質問は、セッション/ dbUtils変数の初期化を全スレッドを通して一度だけ行う方法です。

+0

実際には、スレッドセーフ[Singleton](http://stackoverflow.com/documentation/java/130/singletons#t=201608121142368276512)が必要ですか? – Fildor

+0

はい!私は今まで2つのソリューションを使用しました.1つはjava.util.concurrentで、もう1つは同期です。彼らはどちらも平易なJavaコードで正常に動作しましたが、Stormの場合は動作しません。 Stormはいくつかの異なるマルチスレッドメカニズムに従っていますか? –

+1

実際、私は嵐を知らない。だから私は本当にこれについて何も言えません。しかしあなたのスニペットは**スレッドセーフなシングルトンではありません**。だから、たとえ嵐が同期について「派手」なものではないとしても、あなたのコードは、同時のコンテキストで使用されるときに問題を引き起こすでしょう。 – Fildor

答えて

0

ストームはシステムで配布されているため、並列実行中のすべてのボルトに1つの共有変数を設定することはできません。 1つのワーカーJVM内でエグゼキュータ上で変数を共有することしかできませんでした。

これを行うには、static変数を作成し、共有/静的オブジェクトインスタンスを使用してその初期化を同期させる必要があります。

関連する問題