

複数件の依頼に対して、JPAのStoredProcedureQuryを利用して、件数分プロシージャコールを行い登録する処理を実装しています。  
全て成功した場合のみ反映させたいので、処理の先頭でbegin、完了したらcommitという作りにしています。  
データベースはOracleです。

問題は、StoredProcedureQueryのexecuteメソッドを繰り返しコールすると、その都度カーソルがオープンされてしまい、300に到達した時点でora-01000(最大オープン・カーソル数を超えました。)でエラーになってしまっています。  
ちなみに、プロシージャ内の処理を空にしても同様のエラーとなったため、おそらくプロシージャコール自体でカーソルを作成しているものと思われます。

解決方法がございましたら、ご教示ください。Javaコードは以下の通りです。

// Javaコード

[code]

    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();
    }
    
[/code]


CC BY-SA 3.0
2018-03-22T11:45:30.163
42577
2023-01-01T08:03:20.417
2018-03-23T02:58:56.400
3060
27846
question
java jpa
JPAからのStoredProcedureコール


`EntityManager`の`close()`処理の実装漏れとかではないですかね？例えば、以下のような実装で`em.close();`が`finally`で呼ばれていないとか。

[code]

    try {
        StoredProcedureQuery storedProcedureQuery
                = em.createStoredProcedureQuery("XXXX", Test.class);
        storedProcedureQuery.execute();
        return storedProcedureQuery.getResultList();
    } catch (Exception e) {
        e.printStacktrace();
    } finally {
        em.close();
    }
    
[/code]


CC BY-SA 3.0
2018-03-22T14:02:58.033
42586
2018-03-22T14:02:58.033
21092
42577
answer