Моим первым предложением было бы обновить версию Spring Library, включая Spring JDB C и версию JPA, до последней версии. Более ранняя весенняя версия JPA не закрывала курсоры должным образом.
Эта проблема обычно возникает из-за отсутствия очистки resultsets
, операторов или соединений. Каждый созданный вами ResultSet использует курсор на серверной части. Если вы никогда не закроете ResultSet, оператор, который его создал, или соединение, которое использовалось для оператора, эти курсоры никогда не закроются. Поскольку вы используете пул соединений, соединения никогда не закрываются физически, поэтому курсоры также никогда не закрываются.
Что вызывает проблему Solve ora-01000 maximum open cursors exceeded java.sql.SQLException
в JDB C java -
- Не закрытие объекта JDB C
Statement
может привести к превышению максимального числа открытых курсоров java. sql .SQLException, - Не закрытие объекта JDB C
PreparedStatement
может превышение максимального числа открытых курсоров java. sql .SQLException, - Не закрытие объекта JDB C
CallableStatement
может привести к превышению максимального числа открытых курсоров java. sql .SQLException, - Не закрытие объекта JDB C
ResultSet
и Не закрытие объекта JDBC Connections может привести к превышению максимального числа открытых курсоров java. sql .SQLException
Есть ли Spring JdbcTemplate Close Соединения? … Не всегда.
Достойные разработчики обычно знают, что им нужно попытаться / перехватить / наконец, чтобы убедиться, что они очищают соединения, файловые дескрипторы или любое другое количество вещей. Но затем, для Java, вы слышите «просто используйте JdbcTemplate
! он делает все это за вас! ». Я долгое время предполагал, что JdbcTemplate
будет очищать соединения в дополнение к наборам результатов. На самом деле, вы увидите это много онлайн. Но будь осторожен! Похоже, что это не так, или, если это так, это, по крайней мере, зависит от источника данных ... и это действительно имеет смысл, если вы думаете об их назначении.
Когда у вас нет управляемой транзакции Spring тогда да JdbcTemplate
вызовет метод close()
для соединения. Однако, если соединение уже было доступно из-за закрытия управления транзакциями Springs, соединение будет обрабатываться поддержкой транзакций Springs, которая, в свою очередь, также вызовет close()
для соединения.
EDIT:
Обходной путь:
Увеличьте максимальный открытый курсор в базе данных, выполнив следующую команду SQL в базе данных:
ALTER SYSTEM SET open_cursors = 1000 SCOPE=BOTH;
В этом примере для максимальных открытых курсоров установлено значение 1000. Измените это значение по мере необходимости.
Разрешение:
Обновите драйвер Oracle JDB C до последней версии (12.2.0.1)
Существует новая версия Oracle JDB C драйвер, который исправляет утечку курсора.