【发布时间】:2018-09-12 08:01:19
【问题描述】:
我正在使用 Matlab 2018a 通过 JDBC 连接到 Oracle 数据库。 oracle 版本是 11.2。
我的程序是一个“引擎”,可以激活一系列用户编写的函数。
如果函数的数量很大,我可能会收到“ORA-01000 maximum open cursors exceeded”错误。
目前我通过关闭和打开数据库连接来处理这个问题,但这对性能来说是一个很大的挫折。
我想做的是在函数之前和之后获取光标表,然后关闭我运行的函数打开的游标。
所以我提取了 V$SESSION 和 V$OPEN_CURSORS 表,惊讶地发现我的会话中有一堆打开的光标。
我没有显式打开游标,而且我运行的函数也没有显式打开游标,但我们正在使用执行 SQL 查询的函数。
所以:
- 如何知道我运行的函数打开了哪些游标?游标是否具有我应该用来区分它们的唯一 ID?
- 我应该只查看打开的游标还是应该担心关闭的游标?会不会突然变成开放游标?
谢谢!
【问题讨论】:
-
解决这个问题的正确方法是正确关闭代码中的所有
Statement和ResultSet实例。通常使用“尝试资源”块,或至少使用finally块。 -
请发布minimal reproducible example 包括函数如何连接到数据库和运行查询的示例....尝试询问 Oracle 的内部表并找出您从中打开了哪些游标然后关闭它们是错误的做法。相反,您应该确保您的函数正在读取和关闭游标,如果您使用的是共享连接池,则将连接返回到池中。
标签: oracle matlab jdbc cursors