java – 使用jdbc澄清oracle中的游标
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用jdbc澄清oracle中的游标,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2561字,纯文字阅读大概需要4分钟。
内容图文
我遇到的情况是我使用的第三方开源产品在Oracle中没有游标并且收到错误:java.sql.SQLException:ORA-01000:超出最大打开游标数
我的最大游标设置为1000,我试图弄清楚达到此限制的代码是否正在执行错误操作,或者我是否只需要增加限制.
经过一些调查后,我在代码中找到了一个创建ResultSet的点,从而使我的打开游标数增加1.但是,该ResultSet在使用后很快就会关闭….但是光标数仍保持原样.我能够在第三方开源项目之外的简单JDBC应用程序中重现逻辑.
package gov.nyc.doitt.cursor;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class CursorTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@myhost:1537:mydb", "username", "password");
// as expected: there are 0 cursors associated with my session at this point
ps = conn.prepareStatement("select my_column from my_table where my_id = ?");
ps.setInt(1, 86);
// as expected: there are 0 cursors associated with my session at this point
rs = ps.executeQuery(); // opens 1 cursor
// as expected: there is 1 open cursor associated with my session at this point
} catch (Throwable t) {
t.printStackTrace();
} finally {
// as expected: there is 1 open cursor associated with my session at this point
try {
rs.close();
} catch (SQLException e) {
System.err.println("Unable to close rs");
}
// not expected: there is still 1 open cursor associated with my session at this point
try {
ps.close();
} catch (SQLException e) {
System.err.println("Unable to close simplePs");
}
// not expected: there is still 1 open cursor associated with my session at this point
try {
conn.close();
} catch (SQLException e) {
System.err.println("Unable to close conn");
}
// as expected: at this point my session is dead and so are all the associated cursors
}
}
}
我发现一些Oracle文档让我觉得如果你关闭了我们的ResultSet和PreparedStatements就会关闭所有打开的游标,但是我的开放游标似乎在闲逛.请参阅此常见问题解答(http://download.oracle.com/docs/cd/B10501_01/java.920/a96654/basic.htm#1006509),其中说明“关闭结果集或语句会在数据库中释放相应的游标”.只是基于我的测试似乎没有发生,所以我必须缺乏一些基本的理解.
任何人都可以解释Oracle如何处理游标或指向一些可以启发我的文档吗?
谢谢!
解决方法:
很久以前我遇到过类似的问题.据我记忆,问题在于延迟垃圾收集.在垃圾收集器找到并释放适当的对象之前,数据库游标不会关闭.如果经常创建语句,则可能会遇到此问题.尝试不时手动调用垃圾收集器:
Runtime r = Runtime.getRuntime();
r.gc();
只是为了检查这个假设.
内容总结
以上是互联网集市为您收集整理的java – 使用jdbc澄清oracle中的游标全部内容,希望文章能够帮你解决java – 使用jdbc澄清oracle中的游标所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。