gpt4 book ai didi

java - 使用 Oracle 的 Spring Boot 应用程序 - ORA-01000 : maximum open cursors exceeded - error happening during load testing

转载 作者:行者123 更新时间:2023-12-01 17:34:10 29 4
gpt4 key购买 nike

正在开发 spring-boot 应用程序。在执行负载测试时,我们收到错误

“ORA-01000:超出最大打开游标数”

我们在 pom.xml 文件中有以下 Spring Boot 和 jdbc 条目

<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>

为了解决这个问题,我尝试将“ojdbc”从 6 更改为 8。

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

但我仍然遇到同样的问题。

我们所有的后端调用都使用“jdbcTemplate”或“namedParameterJdbcTemplate”。

该错误是在负载测试期间发生的。我们的 Oracle DB 游标限制是 1000。负载测试运行游戏 1 小时 55 分钟后出现错误,我们的服务故障率为 0.5%用户/线程数设置为 25。

寻找一些建议来解决此问题。

最佳答案

我的第一个建议是将更新的 Spring 库(包括 Spring JDBC 和 JPA 版本)升级到最新版本。早期的 spring JPA 版本无法正确关闭游标。

此问题通常是由于未清理结果集、语句或连接而发生的。您创建的每个结果集都在后端使用游标。如果您从不关闭 ResultSet、创建它的语句或用于该语句的连接,则这些游标永远不会关闭。当您使用连接池时,连接永远不会物理关闭,因此游标也永远不会关闭。

解决 JDBC java 中的 ora-01000 max open Cursors Outstanding java.sql.SQLException 问题的原因是什么-

  1. 不关闭 JDBC Statement 对象可能会导致最大打开游标超出了 java.sql.SQLException,
  2. 不关闭 JDBC PreparedStatement 对象可能会导致最大打开游标超出 java.sql.SQLException,
  3. 不关闭 JDBC CallableStatement 对象可能会导致最大打开游标超出 java.sql.SQLException,
  4. 不关闭 JDBC ResultSet 对象并且不关闭 JDBC连接对象可能导致超出最大打开游标数java.sql.SQLException

Spring JdbcTemplate 是否关闭连接? ...并非总是如此。

优秀的开发人员通常知道他们必须尝试/捕获/最终以确保清理连接、文件句柄或任何数量的东西。但是,对于 Java,您会听到“只需使用 JdbcTemplate!”它会为您完成所有这些样板!”。在很长一段时间里,我一直认为 JdbcTemplate 除了结果集之外还会清理连接。事实上,您会在网上经常看到这种情况。不过要小心!情况似乎并非如此,或者如果是的话,它至少依赖于数据源……如果您考虑它们的目的,这实际上是有意义的。

当您没有 Spring 托管事务时,JdbcTemplate 将会调用 Connection 上的 close() 方法。但是,如果由于 Springs 事务管理关闭连接而已经存在可用的连接,则关闭连接将由 Springs 事务支持处理,反过来也会在连接上调用close()

编辑:

解决方法:

通过在数据库上执行以下 SQL 命令来增加数据库中的最大打开游标:

ALTER SYSTEM SET open_cursors = 1000 SCOPE=BOTH;

此示例将最大打开游标数设置为 1000。根据需要更改此值。

分辨率:

将 Oracle JDBC 驱动程序更新到最新版本 (12.2.0.1)

有一个新版本的 Oracle JDBC 驱动程序修复了游标泄漏问题。

关于java - 使用 Oracle 的 Spring Boot 应用程序 - ORA-01000 : maximum open cursors exceeded - error happening during load testing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61071201/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com