2017-12-08 12 views
0

私はSpring、Java、Ibatis、Oracleを使用しています。 多くのデータを処理するためにマルチスレッドを使用するジョブが1つあります。マルチスレッド:重複したデータを書き込むときの最良の方法

すべてのスレッドでは、データベース内の同じテーブルにデータを書き込むことになるが、いくつかの時間は、スレッドのデータがそのように、contraintによって同じです。

CONSTRAINT n_uc1 UNIQUE (name, title, language, ...) 

。そのようなサンプルコード:このコードで

public Long write(Input input) { 
     Long key = read(input); 
     if (key != null) 
     { 
      return key; 
     } 

     try 
     { 
      key = write(input); 
     } 
     catch (org.springframework.dao.DuplicateKeyException ex) 
     { 
      // if exception happend, it means already wrote data, read it again 
      key = read(input); 
     } 
     return key; 
    } 

は、私が期待され得ることができますが、いくつかの時間は、私は、例外が発生しました、そしてそれは、性能がダウンします。

ルールは以下のとおりです。

  • 私は、スキーマ
  • を更新することはできません、それはパフォーマンスが

を下に行かせるので、私は、同期を使用したくないあなたはいずれかを持っていますかこれのための他のソリューションですか? パフォーマンスは非常に重要なポイントです。

+0

を与えるために、その簡単にはこれを見てます。https://dba.stackexchange.com/questions/72501/duplicate-key-violates-unique-constraint-when -using-multi-threading –

+0

ありがとう@AmolRaje、しかし、スキーマを更新できません。つまり、ストアドプロシージャを作成できません。他のアイデア? – BIZ

+1

* "パフォーマンスは非常に重要です" *しかし、データベースのパフォーマンスを管理する最も重要な要素を変更することはできません。悲しい。 – APC

答えて

1

説明は非常に曖昧ですが、依然として回答を試みています。

制約を同期または削除することができない場合、どのようにデータをスレッドに供給するかを検討することができます。

私が理解した説明から、1つ以上のスレッドが同じデータを処理することが時々あります。

この場合、スレッドが入力データをランダムに取得するのではなく、入力データをスレッド間で分散するロジックを考え出すことができます。

あなたが入力されたデータについての情報を与えることができれば、解決策に

関連する問題