Я получаю ошибку (появление ORA-01000 больше по сравнению с другими) -
- ORA-01000: превышено максимальное количество открытых курсоров
- ORA-00604: Ошибка на уровне рекурсивного SQL 1
- [ne.jdbc.spi.SqlExceptionHelper] - Нет данных для чтения из сокета
Я попытаюсь объяснить сценарий кода, который я запускаю.
Сервисный вызов на уровне DAO для удаления записей, где я передаю основной
ключи для поиска и удаления из таблицы.
@Transactional(value = "txManagerResult")
public void deleteCalculatedLkmsEntities(final List<Long> chkdLkmsIds) {
this.daoResult. deleteCalculatedLkmsEntitiesEnhanced(chkdLkmsIds);
}
Метод 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 миллионов записей.
Пожалуйста, помогите.