Приложение Spring Boot, использующее Oracle - ORA-01000: превышено максимальное количество открытых курсоров - ошибка при нагрузочном тестировании - PullRequest
0 голосов
/ 07 апреля 2020

Работаю над приложением весенней загрузки. При выполнении нагрузочного тестирования мы получаем ошибку

«ORA-01000: превышено максимальное количество открытых курсоров»

У нас есть следующие записи для весенней загрузки и jdb c в pom. xml file

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
</parent>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.3</version>
</dependency>

Чтобы устранить проблему, я попытался изменить «ojdb c» с 6 на 8.

<dependency>
    <groupId>com.oracle.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>12.2.0.1</version>
</dependency>

, но у меня все еще возникла та же проблема.

Все наши внутренние вызовы с использованием «jdbcTemplate» или «namedParameterJdbcTemplate».

Ошибка происходит во время нагрузочного тестирования. Наш Oracle предел курсора БД равен 1000. Загрузите тестовый запуск игры, ошибка через 1 час 55 минут и частота отказов нашего нашего сервиса составляла 0,5%, число пользователей / потоков установлено на 25.

Нужны некоторые предложения для исправить эту проблему.

1 Ответ

0 голосов
/ 07 апреля 2020

Моим первым предложением было бы обновить версию Spring Library, включая Spring JDB C и версию JPA, до последней версии. Более ранняя весенняя версия JPA не закрывала курсоры должным образом.

Эта проблема обычно возникает из-за отсутствия очистки resultsets, операторов или соединений. Каждый созданный вами ResultSet использует курсор на серверной части. Если вы никогда не закроете ResultSet, оператор, который его создал, или соединение, которое использовалось для оператора, эти курсоры никогда не закроются. Поскольку вы используете пул соединений, соединения никогда не закрываются физически, поэтому курсоры также никогда не закрываются.

Что вызывает проблему Solve ora-01000 maximum open cursors exceeded java.sql.SQLException в JDB C java -

  1. Не закрытие объекта JDB C Statement может привести к превышению максимального числа открытых курсоров java. sql .SQLException,
  2. Не закрытие объекта JDB C PreparedStatement может превышение максимального числа открытых курсоров java. sql .SQLException,
  3. Не закрытие объекта JDB C CallableStatement может привести к превышению максимального числа открытых курсоров java. sql .SQLException,
  4. Не закрытие объекта 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 драйвер, который исправляет утечку курсора.

...