2016-08-16 1 views
6

JPA 2.1、Oracle DBを使用していて、削除対象のエンティティ(約430000 ids)のIDリストを持っています。最初は、idリストを1000個の小さなIDごとに分割し、それらをJPQLのパラメータとして渡して実行するように実装されました。JPA CriteriaDeleteと大きなパラメータ

delete from SOPFilter f where f.id in (?1)

その後、私はJPA CriteriaDeleteを使用するように変更したいです。

CriteriaDelete<SOPFilter> criteriaDelete = cb.createCriteriaDelete(SOPFilter.class); 
Root<SOPFilter> from = criteriaDelete.from(SOPFilter.class); 
criteriaDelete.where(from.get(SOPFilter_.id).in(sopFilterIds)); 

それが第九万1に到達し、それが

org.hibernate.SessionExceptionここで停止させ、実行時例外があるまで、それは正常に動作:セッションが

を閉じているとしますが、エンティティマネージャファクトリを閉じます。

INFO:bernate.impl.StmpContainerEntityManagerFactoryBean:この例外

のjava.langと私の最初のポストで誤解された

誰のための永続ユニット 'IMOFFERINGMANAGEMENT' のJPAのEntityManagerFactoryを閉じます。 IllegalStateException:EntityManagerFactoryが閉じられている

catch clそれを投げる前にレコードをデータベースに追加することによって実行時例外を処理することができます。また、イベントレコードを追加するために、工場から別のエンティティマネージャを作成しようとしますが、これは現在閉じられています。

public static void logEvent(EntityManager em) { 
    EntityManager em2 = null; 
    EntityManagerFactory emFactory = em.getEntityManagerFactory(); 
    em2 = emFactory.createEntityManager(); 
    // ... 
} 

誰もがそれを軽視できますか?

+1

query.setHint("javax.persistence.query.timeout", 8000); 

もあるかもしれませんタイムアウトあなたはJPA CriteriaDeleteを使用しているか、いくつかの詳細を与える - あなたはヒントを設定することができます。また、あなたの質問によると、あなたは約43000のIDを持っており、コントロールが90000行に達すると例外がスローされましたか?それは9000番目の行ですか? –

+0

EMFはどのように閉じられますか? finallyブロックの一部といくつかの例外がスローされましたか?推測は、人々がその情報でここで行うことができるすべてです –

+0

私はドナルドトランプの声でタイトルを読んで変ですか? – shmosel

答えて

0

あなたのコードでは明確ではありませんが、トランザクションのタイムアウトが発生する可能性があります。データベース側

+0

ロギングを追加した後、EMFを閉じる原因となる実際の例外が発生します。 org.hibernate.SessionException:セッションがクローズされています。それはあなたが言及したようにタイムアウトに関連するかもしれないと思うので、長い実行操作です。 – pirent

+0

例外は何ですか? – farrellmr

+0

ええ、タイムアウトのように聞こえる – farrellmr

関連する問題