使用Oracle的Spring Boot应用程序-ORA-01000:超过最大打开游标-负载测试期间发生错误

我正在处理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。

正在寻找一些解决此问题的建议。

hyjdbsc 回答:使用Oracle的Spring Boot应用程序-ORA-01000:超过最大打开游标-负载测试期间发生错误

我的第一个建议是将包括Spring JDBC和JPA版本在内的更新Spring Library升级到最新版本。春天的JPA早期版本无法正确关闭游标。

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

是什么导致JDBC Java解决ora-01000 maximum open cursors exceeded 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事务支持来处理,该事务也将在Connection上调用close()

编辑:

解决方法:

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

ALTER SYSTEM SET open_cursors = 1000 SCOPE=BOTH;

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

分辨率:

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

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

,

好的,我终于得到了答案。我的项目与您的项目完全相同(Spring boot 2.1.6.RELEASE和ojdbc8 12.2.0.1),(另外还有Spring data jpa)和升级到2.2.5.RELEASE对我不起作用。

当我每次使用一定数量的数据(或以上)调用相同的函数时,都会遇到相同的异常-我试图通过将ojdbc版本升级到19.6.0.0,并添加spring config spring.jdbc来摆脱此错误。 .getParameterType.ignore,依此类推。他们都不适合我。

最后,我发现是jpa信息库方法的返回类型。最初,我的方法是这样的:

Stream<MyEntity> findByMyColumn(MyColumnType myColumnValue);

请注意,此存储库方法的返回类型为java.util.Stream。之所以将这种返回类型作为流获取,是因为仅在需要流传输时才使用此方法。 而且每次执行相同的过程时,堆栈跟踪都包含此方法,我感到很奇怪。 所以我将类型更改为List,错误是GONE !!!

List<MyEntity> findByMyColumn(MyColumnType myColumnValue);

我认为即使流结束,流仍在保留游标。显然,这是Spring引导或oj​​dbc上的错误,但是它们似乎都没有意识到或不愿意解决此问题。

希望对您的情况也有所帮助。

,

好的,这花了我很长时间才回来发布。 因此,对我来说,只需在pom.xml中输入以下内容即可解决此问题

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

有一段时间,当它无法正常工作时,我们意识到有另一个ojdbc7被环境拾取,并且由于其他一些依赖关系而被引入。因此,一旦我们抑制了ojdbc8的拾取,我们的问题就解决了。

,

升级到最新的oracle jdbc驱动程序可以解决此问题。我们已升级到:版本(12.2.0.1)

本文链接:https://www.f2er.com/2497402.html

大家都在问