注意:我们重复使用单个连接。
************************************************
public Connection connection() {
try {
if ((connection == null) || (connection.isClosed()))
{
if (connection!=null)
log.severe("Connection was closed !");
connection = DriverManager.getConnection(jdbcURL, username, password);
}
} catch (SQLException e) {
log.severe("can't connect: " + e.getMessage());
}
return connection;
}
**************************************************
public IngisObject[] select(String query, String idColumnName, String[] columns) {
Connection con = connection();
Vector<IngisObject> objects = new Vector<IngisObject>();
try {
Statement stmt = con.createStatement();
String sql = query;
ResultSet rs =stmt.executeQuery(sql);//oracle increases cursors count here
while(rs.next()) {
IngisObject o = new IngisObject("New Result");
o.setIdColumnName(idColumnName);
o.setDatabase(this);
for(String column: columns)
o.attrs().put(column, rs.getObject(column));
objects.add(o);
}
rs.close();// oracle don't decrease cursor count here, while it's expected
stmt.close();
}
catch (SQLException ex) {
System.out.println(query);
ex.printStackTrace();
}
init.ora参数open_cursors
定义会话一次可以拥有的打开的游标的最大值。它的默认值为50。如果应用程序超出此数目,则会引发错误“
ORA-01000:最大打开游标超过”。
因此,当不再需要JDBC资源(尤其是java.sql.ResultSet和java.sql.Statement)时,必须关闭它们。如果未关闭它们,则应用程序会发生资源泄漏。
在重用Connection对象的情况下,您必须意识到以下事实:打开的oracle游标会保持打开状态并在使用中,只要连接存在 且
事务尚未结束。应用程序提交时,将释放打开的游标。
因此,作为应用程序设计师,您需要了解最复杂html" target="_blank">事务所需的打开游标的粗略估计。
困难在于oracle的内部参数视图(v $ open_cursor,v $
sesstat等)无法显示已打开的游标(可重复使用)和已打开的游标(仍被阻止(不可重用!))之间的差异。未封闭的ResulSet或Statement。如果您关闭了finally块中的所有Statement和ResultSet对象,则您的应用程序将非常好。
调整init.ora参数的工作原理如下(我们的应用程序最多需要800个游标)
ALTER SYSTEM SET open_cursors = 800 SCOPE=BOTH;
我试图为通过html形式的文本框检索的查询编写一个JUnit测试。文本检索已经过测试并有效,但我的单元测试失败了。我使用了两个相关的类:QueryController和QueryControlllerTest。我一直在玩弄我在这两个类中关闭的时间和内容,并不断得到错误:结果集关闭后不允许操作。 QueryController测试。Java语言 QueryController。Java语言
单击按钮时,此代码显示此错误消息: 结果集关闭后不允许操作 代码:
下面是相关的代码部分:Server. Proxy.update_allLogOut:(第65行是时括号) 服务器服务器: 主要: 我必须指出,它99%的运行时间都没有例外。。但有几次我遇到了这个例外,我不明白为什么会发生这种情况。有什么想法吗?很明显,有些地方做错了,但这里所有类似的主题都没有给出这个问题的答案。。。
我有一个spring应用程序,它的主页发出多个ajax调用,这些调用反过来从DB中提取数据并返回。DB已配置连接池,minPoolSize为50,maxPoolSize为100。 现在,当我打开主页时,大约有7个连接与DB建立,这是因为大约有7个ajax调用被调用,我假设所有调用都创建了自己的连接。现在,当我刷新页面时,我看到又建立了7个新连接(我看到db2监控中总共有14个物理连接),这似乎出乎
有人能帮我吗?
我是java和SQL新手,我在重复一个我不知道如何避免的问题: 假设我想创建两个执行查询,一个在getRequest estsFromDB方法中的另一个内部,我创建第一个执行查询,在第二个方法中,我创建第二个执行查询: 第二个功能: 在第二个循环中,我得到了一个SQLException:“ResultSet关闭后不允许操作”,我尝试了:最后用result关闭结果。close()但我也得到异常nul