问题标签 [ora-01000]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
689 浏览

oracle - Tridion CMS & Oracle: ORA-01000: 超过最大打开游标

希望有人可以在这里帮助我。

我们使用 Tridon CMS 来管理托管在 jBoss 和 Apache 上的网站。

我们已经使用 SDL Tridion 5.3 5 年了,突然我们遇到了它背后的 Oracle 数据库的错误。我们的大部分内容作为来自文件系统的普通 jsp 页面提供,但我们有一些组件通过调用 Tridion 的 Java API 提供服务,该 API 从 Oracle 数据库返回一个 html 片段。
最近我们注意到其中一些 html 片段没有被提供,并且在检查服务器日志文件时我们发现 Oracle 错误ORA-01000: maximum open cursors exceeded正在生成。
我们的最大光标设置为 300,因此我们将其增加到 350 以查看是否有帮助,但没有。
监视活动的 Oracle 会话,我们可以看到许多会话已达到最大游标,因此我们重新启动了应用服务器。这似乎有所帮助,但只是暂时的。达到最大游标阈值的会话数再次逐渐增加。昨天下午重启后不久,大约有 30 个最大游标的会话,今天早上是 150 个。

显然,最近发生了一些变化,导致了这种情况,但我们不确定是什么。Oracle 数据库不是我们通常可以访问的东西,当然也不是我们直接更改的东西——所有日常数据库操作都是通过 Tridion API 发生的。就 Tridion 开发和发布而言,我们没有做任何不寻常的事情,因此与我们过去几年在那里所做的没有什么不同。我们网站的流量目前相对较低(过去明显更高),所以我们很确定那里没有问题。

我刚刚被告知可能会或可能不会连接的一件事 - 在问题出现之前不久,我们的一个内部防火墙发生故障,但我们想不出一种方法可能会导致我们看到的问题。除了防火墙故障转移,我们找不到应用服务器和数据库之间连接的任何其他更改。

有人对我们可以在哪里寻找解决方案有任何建议吗?我们刚刚向 SDL 开了一张支持票,但目前他们和我们一样困惑。

谢谢。

0 投票
1 回答
3840 浏览

java - ORA-01000: 超出批量更新 PreparedStatement 的最大打开游标

我在数百万条记录上使用批量更新准备语句,但在执行 >400k 记录后最终在运行时遇到以下错误。

java.sql.SQLException: ORA-01000: 超出最大打开游标

不知道是不是下面代码造成的

从而在提交连接后关闭 PreparedStatement 并用新的 PreparedStatement 替换。我不确定是否重复提交同一连接可能会导致此问题。

任何人都可以提出问题的解决方案或建议更好的架构来处理准备好的语句的批量更新。

P/S:错误行其实是指向delete语句执行的,但我不认为这是根本原因,因为之前批量更新准备语句代码添加之前不存在这个问题。

感谢您的任何建议

0 投票
3 回答
43260 浏览

java - ORA-01000: 超出最大打开游标 - java 代码失败

我在我的 java 代码中使用循环将行插入到我的数据库中。然后,我得到了错误 -

我搜索了一下,发现在添加每一行后关闭我准备好的语句或语句有助于消除错误。

但是,我需要明白——

  1. 什么是游标?
  2. 我可以更改游标的数量吗?如果是,这是一件好事吗?
0 投票
1 回答
2590 浏览

java - 无法解决错误 - java.sql.SQLException: ORA-01000: 超出最大打开游标

我做了一个java方法来向数据库添加一行。出于测试目的,我调用此方法大约 1000 多次。我在准备好的语句上调用了 close() 方法,但每当调用此方法插入行时,我仍然会收到 oracle 错误。

错误

源代码

0 投票
0 回答
434 浏览

node.js - 节点 oracledb [错误:ORA-01000:超出最大打开游标]

我在循环中执行选择查询时遇到错误。我收到了这个错误:

这是执行的查询:

如何在 nodejs 中关闭游标结果?

0 投票
1 回答
73 浏览

javascript - 连接池和 ORA-01000

我创建了一个异步 ExecuteQuery 函数,该函数能够异步执行查询,因此如果在循环中调用它,下一个查询会等待前一个查询完成后再执行。doCreatePool 函数在程序初始化时被调用一次。它创建一个连接池并将其保存在全局变量 config.Oracle_POOL 中,以便连接池保持活动状态,即使在 doCreatePool 返回之后也是如此。

Socket.io 事件调用 ExecuteQuery来执行查询(循环中的一个或多个)。

一切正常,但在执行一定数量的查询后,我收到 ORA-1000 错误:“错误:ORA-01000:超出最大打开游标”,无论是选择、更新和插入查询。

通常 Connexion 池应该避免这个问题?

我的代码有什么问题?

0 投票
0 回答
939 浏览

odp.net - ODP.net 12c 第 2 版中未关闭隐式引用游标

我正在将 .net 应用程序从 SqlServer 移植到 Oracle 12c。我正在使用非托管 64 位 ODAC 12c Release 2 (12.1.0.1.2) 客户端访问数据库。

Oracle 12c 引入了 DBMS_SQL.RETURN_RESULT(cur) 函数,它允许我按原样重用 .net 代码,而无需向 ado.net 命令添加特定的输出参数。这是我的代码的一个片段:

uspGetAllNumericUnits 存储过程就像:

我相信我正确地处理了 dbReader 和 dbCommand,并且连接也被 connectionScope 关闭和处理了。但是,如果我检查服务器上的 v$open_cursor 视图,我会看到“SELECT * FROM NumericUnit;”的光标 保持打开状态。我使用连接池,如果我禁用它(我不想这样做),光标会在 connectionScope 被释放时正确关闭。

我的问题是我有很多像这样的 ado.net 调用,我很快就达到了每个会话允许的最大游标限制,并引发了 ORA-01000 错误。

如果我使用旧的 Oracle 11g 方法,将结果集游标作为输出参数返回,并且不使用 DBMS_SQL.RETURN_RESULT(cv_1) 函数,则无论连接池与否,都会在释放 connectionScope 时正确关闭游标。

我需要一些额外的对象来处理隐式引用游标的关闭吗?这是一个已知的 ODAC 12cR2 错误吗?DBMS_SQL.RETURN_RESULT(cv_1) 的引入使得从 SqlServer 到 Oracle 的移植比几乎在任何地方都必须添加输出参数更容易,但我不想摆脱连接池。

0 投票
0 回答
544 浏览

node.js - Node.js 中超过了最大打开游标

我正在编写一些代码来处理 Node.js 中的 csv 并将其存储在 Oracle 数据库中。到目前为止,一切进展顺利,但由于 csv 中有大量行,我得到“ORA-01000:超出最大打开游标”。我在脚本开始时连接到 Oracle 一次。对于 csv 中的每条记录,我正在执行多个SELECTs、INSERTs 和DELETEs,然后转到下一个条目以使用相同的连接处理所有记录。最后,我关闭了连接。一个想法是我每次都从池中获得一个新连接,但我读到其他帖子说我应该使用一个连接。也许我需要设置一个特殊设置来处理一个连接上的所有这些查询?

脚本有点长,所以我会发布重要部分......如果需要我可以发布更多。使用Q,csvtojsonoracledb.

0 投票
1 回答
399 浏览

oracle - 调试 ORA-01000

我正在更改旧的 Spring 应用程序以使用动态配置的连接池。整个系统中的所有查询都使用 JdbcTemplate,或者通过 Jms 连接到 Oracle AQ——我已经检查过,每次获得 ResultSet 时,它都会在 finally{} 块内的框架代码中关闭。在我转向动态配置的连接池之前,该应用程序从未遇到任何问题。我目前使用 C3P0 作为我的连接池,但是使用 DBCP2 和 Atomikos 池也会出现同样的问题。这是问题:

在处理任意时间后(它似乎因应用程序正在执行的操作而有所不同,但最终总是会发生)我用完了连接。出于绝望,我已将连接数提高到 10k,但这只会延长不可避免的时间。我运行这个查询:

果然,

好的,我已经知道我的游标用完了。我知道我在网上看到的下一条建议是运行以下查询:

我一共得到了九排……这些家伙超过了三排。如果我删除“have”子句并将所有游标计数加起来,则大约有 120 个游标。不是10k!

这是应用程序从 JdbcTemplate 正确(也隐式地)关闭的插入语句中隐式获取新序列值。即便如此,41和10k不在一个范围内!

我知道 v$open_cursor 表仅代表“缓存”游标,并且“当前打开的游标”统计中计数的一些游标可能已经标记为“可关闭”。有没有办法弄清楚这些打开的游标中涉及的确切进程或sql?

我尝试了几种方法来试图弄清楚应用程序发生了什么。我创建了一个特殊的数据源包装器,它将包装所有连接、语句、准备好的语句、可调用语句及其所有生成的结果集,将它们保存在内存中的特殊集合中,并在关闭时将它们删除。我以为我可以通过这种方式捕捉到它——相反,通过这个池打开的每一个资源都被关闭了。每最后一个。我什至在连接池和弹簧引擎的内部进行了调试,以观察 Oracle 瘦 ForwardOnlyResultSet 被标记为已关闭。

我几乎可以怀疑问题出在与 AQ 的交互上,只是这种机制在旧版本的应用程序中运行良好。

我什至尝试通过显式捕获 ORA-01000 错误并将其用作硬重置连接池的触发器来解决该问题。只要它在处理简单的任务,它就可以工作,但是对于某些进行数千次数据库操作的大型进程,我在进程完成之前就失去了连接;硬重置连接池会使事务无效,整个事情进入无限循环。情况不好,四面八方。

我完全不知所措......从应用程序方面来看,它看起来完全无懈可击,而从数据库方面来看,通过查看 v$open_cursor,它看起来不像我有很多打开的游标,只是在统计。不幸的是,统计数据似乎很重要。

帮助?

0 投票
2 回答
2059 浏览

java - Spring 5.0.1 namedJdbcTemplate batchUpdate ORA-01000:超过最大打开游标

我最近将我的项目从 Spring Framework 4.3.10 升级到了 5.0.1。升级后,namedParameterJdbcTemplate.batchUpdate 开始失败并出现此错误

ORA-01000: 超出最大打开游标。

批处理一次更新 250 条记录,该时间没有改变,并且在 Spring 4.3.x 中运行良好。

有没有人遇到过 Spring 5.0.1 的类似问题?

我没有看到 Spring 文档中与使用 batchUpdate 相关的任何更改。

任何线索,或者它是 jire 问题的候选者。

我已将 spring-jdbc 单独回滚到版本 4.3.10,从而解决了该问题。我还提出了 Jira 回归缺陷https://jira.spring.io/browse/SPR-16139