2016-08-23 3 views
1

私はハードコアのHibernate Programmerではありません。 Hibernate:プロセス間でMYSQLの永続データを表示できません

は、ネイティブクエリの戻りバルクデータに万のレコードの作成:

return super.em.createNativeQuery(query).getResultList(); 

フェッチデータを1万人が解決していループでDAOを使用して永続化されるオブジェクトを構築します。

persist(object) 

同時に私はテーブルに選択クエリを実行すると0の結果が表示されます。

Select count(*) from Audit_Log; 

すべてのレコードが正常に挿入された後、MySQLは結果を表示します。

以前私はDAOから値をフェッチするための名前が付けられており、うまくいきました。今度はネイティブクエリを選択し、この動作を得ました。私が変える必要があるものはありますか?

コード:

public abstract class GenericDaoImpl<T, PK> implements GenericDao<T, PK>  { 
    @Override 
public T create(final T t) { 
    this.em.persist(t); 
    return t; 
} 

@Override 
public void flush() { 
    org.hibernate.Session session = (org.hibernate.Session)em.getDelegate(); 
    session.flush(); 

} 

はDAO:

@Override 
    public Person create(Person person) { 
    return (Person) create((MainRecord) person); 
    } 
+0

あなたが持続する場合、それは、clear.IMPではなく、全体のコードとデータの流れを示し、JDBCのバッチ処理に使用して私たちに近づくと類似していたましたたぶんあなたはフラッシュするのを忘れてしまったでしょう。 –

+0

@DemonColdmist:コードを追加しました。私たちはDAOメソッドを呼び出しています。 – fatherazrael

答えて

1

あなたは、単一のトランザクションで10L(別称、1M)レコードを持続していますか?このように見えます。 TXはかなり長い時間開いているので、データがまだDBにコミットされていないので、TOAD(または他のSQLクライアント)でクエリを実行しても返されません。

間にデータをフラッシュしてみてください。

また、私はあなたが休止状態とドライバレベルでバッチ処理を使用していることを望みます。バッチ処理なしで1Mレコードを保持する方法はありません。

+0

ちょうど今私は単一のレコードを挿入し、間に例外がスローされた場合、それが持続しなかったことがわかりました。残酷さのために。エンティティのエラーがDetatched – fatherazrael

+0

ここに複数の問題があるように見えます。明らかに、間に何らかのエラーがあってもセッションが閉じられ、オブジェクトがぶら下がっているので、「切り離された」状態になると、それは持続しません。 1mに移動する前に少なくとも1つのオブジェクトを永続化できるはずです。 –

+0

あなたの提案に従って - >私は今これを使用しています----> @Transactional(分離= Isolation.READ_UNCOMMITTED) public人createWithReadUncommitedIsolation(per person){ this.em.persist(per); this.em.flush(); return per; } <---と実行しようとしました – fatherazrael

1

まず、メソッドを使用して、をフラッシュするか、永続化が完了している間にセッションの指示を閉じます。

し、説明はここにあった:

は(存続)一時的なインスタンスを永続的になります。ただし、識別子値が永続インスタンスにただちに割り当てられることを保証するものではなく、割り当てがフラッシュ時に行われる可能性があります。 persist()は、トランザクション境界外で呼び出された場合にINSERT文を実行しないことを保証します。これは、拡張セッション/永続コンテキストで長時間実行される会話に役立ちます。

+0

ありがとうございます。 問題が発生しませんか?クローズ/クローズクローズ。ループのように、私はこれを何度もやりません。ループ内で更新中の複数のテーブルが画像内にあります。 – fatherazrael

+0

なぜこれを行う*閉じる/開く閉じるもう一度閉じる*?さて、あなたはそれを好きでも、ループからセッションを洗い流すことができます。 –

+0

実際には1人の人のためのループです。私たちはその親戚のような複数のものをループ内に追加しています。人が追加された場合、アカウント情報をフラッシュして追加します。その後、もう一度他の人が追加され、他の情報がフラッシュされます – fatherazrael

1

このコードスニペットを試してみて、...

   public Long save(HttpServletRequest request) { 

//Further business logic here.... 
for (int i=0; i<count; i++) { 
        getEntityManager().persist((ABC) model); 

      if (i > 0 && i % 2500== 0) { 
           getEntityManager().flush(); 
           getEntityManager().clear(); 
          } 
        } 
        tx.commit(); 
        ((EntityManager) session).close(); 
    } 
関連する問題