Максимальное количество открытых курсоров превысило исключение в JPA (использование createNativeQuery для удаления записей) - PullRequest
0 голосов
/ 27 июня 2018

Я получаю ошибку (появление ORA-01000 больше по сравнению с другими) -

  1. ORA-01000: превышено максимальное количество открытых курсоров
  2. ORA-00604: Ошибка на уровне рекурсивного SQL 1
  3. [ne.jdbc.spi.SqlExceptionHelper] - Нет данных для чтения из сокета

Я попытаюсь объяснить сценарий кода, который я запускаю.

  1. Сервисный вызов на уровне DAO для удаления записей, где я передаю основной ключи для поиска и удаления из таблицы.

    @Transactional(value = "txManagerResult")
    public void deleteCalculatedLkmsEntities(final List<Long> chkdLkmsIds) {
        this.daoResult. deleteCalculatedLkmsEntitiesEnhanced(chkdLkmsIds);
    }
    
  2. Метод DAO для удаления записей из 4 таблиц (с родителями и детьми) связь с данными, но эта связь не поддерживается в таблицах (т.е. нет связи с внешним ключом).

    private void deleteCalculatedLkmsEntitiesEnhanced(final List<Long> chkdLkmsIds) {
    
         // Order of the delete is must be maintained as below 
    
         // this will delete  around 100000 rows for 1000 primary key of parent table
         this.deleteEntitiesByPrimaryKeyList("delete from Child_Table_4 where CHKD_PRODUCT_OFFERING_ID in ( "
                       + " select ID from Child_Table_2 where CHKD_LKMS_ID in ( "
                       + "select ID from Parent_Table_1 where id in (:pid) "
                       + ") )"
                       , "pid",
                       chkdLkmsIds);
    
    // this will delete  around 100000 rows for 1000 primary key of parent table
         this.deleteEntitiesByPrimaryKeyList("delete from Child_Table_3 where CHKD_PRODUCT_OFFERING_ID in ( "
                       + " select ID from Child_Table_2 where CHKD_LKMS_ID in ( "
                       + "select ID from Parent_Table_1 where id in (:pid) "
                       + ") )"
                       , "pid",
                       chkdLkmsIds);
    
    // this will delete  around 300000 rows for 1000 primary key of parent table
         this.deleteEntitiesByPrimaryKeyList("delete from Child_Table_2 where CHKD_LKMS_ID in ( "
                       + "select ID from Parent_Table_1 where id in (:pid) )"
                       , "pid",
                       chkdLkmsIds);
    
         // this will delete around 1000 rows
         this.deleteEntitiesByPrimaryKeyList("delete from Parent_Table_1 where ID in (:pid)"
                       , "pid",
                       chkdLkmsIds);
    
    } 
    private void deleteEntitiesByPrimaryKeyListFromDB(final String query, final String parameter,
                final List<Long> idsToDelete) {
         this.entityManager.createNativeQuery(query)
         .setParameter(parameter, idsToDelete).executeUpdate();
       }
    

Сервисный метод вызывается 4 параллельными потоками, которые управляются ForkJoinPool.

Ошибка не появляется сразу после запуска приложения, но начинает появляться после 10+ часов выполнения кода. Вышеуказанные методы продолжают работать (удаляя записи) потоками циклическим образом. Этот процесс выполняется для выполнения 9 миллионов записей.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 27 июня 2018

Глядя на все комментарии .. это может произойти из-за большого количества параллельных вызовов. Предполагая, что em.createNativeQuery () правильно обрабатывает жизненный цикл ресурса БД. Если вы используете oracle DB, существует ограничение на максимальные открытые курсоры. Вы можете увеличить максимальное количество открытых курсоров на уровне базы данных, чтобы решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...