2011-01-08 13 views
4

私はHibernateを使うことを学んでいます。私はどのように冬眠中の同時挿入を適切に行うのだろうかと思っています。 > URL -Hibernate + concurrent inserts(MySQL INSERT IGNORE)

CREATE TABLE `urls` (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    md5 CHAR(32) UNIQUE, 
    url TEXT 
); 

テーブルの目的は、マッピングID <を維持することです:

は私がURLテーブルのように定義されています。 md5フィールドはurlからのmd5の合計です。通常、urlは1024バイトよりも長くなる可能性があります。これはmysqlのUNIQUE制約の制限です。

私の質問は、url - > id関数の同時処理を扱うクエリです。 JDBCの実装では、次の手順を実行します。

  1. SELECT id WHERE md5 = md5(url);
  2. 存在する場合は、返されたID、そうでない場合は:
  3. (URL、
  4. リトライ要求されたURLは、ステップ2と私は休止状態でこれを行うにはどうすればよい3の間に挿入された場合でも、それは素敵な作品1

ステップ?

答えて

2

注釈で遊ぶことができます@SQLInsert。挿入時に使用するSQL文を指定することができます。問題は:Hibernateはデータベースからのデータの挿入/更新/選択だけではありません。つまり、@SQLInsertを使用するだけで最初はうまくいくかもしれませんが、記述したシナリオにヒットしたときにHibernateがどのように動作するかはわかりません(ステップ2と3の同時挿入)。ステップ4を実行しません。代わりに、JDBCの "getGeneratedKeys"を呼び出して生成されたIDを取得します(挿入が無視された場合はnullと思われます)。

つまり、私が見る唯一の解決策は@SQLInsertを使用することですが、同時に実行して、同時挿入が発生したときにHibernateが正しく動作することを確認してください。