JPAからのStoredProcedureコール
複数件の依頼に対して、JPAのStoredProcedureQuryを利用して、件数分プロシージャコールを行い登録する処理を実装しています。
全て成功した場合のみ反映させたいので、処理の先頭でbegin、完了したらcommitという作りにしています。
データベースはOracleです。
問題は、StoredProcedureQueryのexecuteメソッドを繰り返しコールすると、その都度カーソルがオープンされてしまい、300に到達した時点でora-01000(最大オープン・カーソル数を超えました。)でエラーになってしまっています。
ちなみに、プロシージャ内の処理を空にしても同様のエラーとなったため、おそらくプロシージャコール自体でカーソルを作成しているものと思われます。
解決方法がございましたら、ご教示ください。Javaコードは以下の通りです。
// Javaコード
try{
fac = Persistence.createEntityManagerFactory("xxx");
em = fac.createEntityManager();
tx = em.getTransaction();
StoredProcedureQuery spq;
spq = em.createStoredProcedureQuery("yyyy");
spq.registerStoredProcedureParameter(1, Object.class, ParameterMode.IN);
spq.registerStoredProcedureParameter(2, Object.class, ParameterMode.IN);
spq.registerStoredProcedureParameter(3, Short.class, ParameterMode.OUT);
spq.registerStoredProcedureParameter(4, Short.class, ParameterMode.OUT);
tx.begin();
for (List<String> rec : csv) {
String aa = rec.get(0);
String bb= rec.get(1);
spq.setParameter(1, aa);
spq.setParameter(2, bb);
// 実行
spq.execute();
// エラーチェック
if(...){
tx.rollback();
return;
}
}
tx.commit();
}catch(Exception e){
throw e;
}finally{
if(em != null)em.close();
if(fac != null)fac.close();
}