gpt4 book ai didi

java - 最大打开游标超出 java 代码中的异常

转载 作者:行者123 更新时间:2023-11-30 07:59:04 24 4
gpt4 key购买 nike

这是我执行更新查询的代码

public  boolean executeQuery(Connection con,String query) throws SQLException
{
boolean flag=false;
try
{
Statement st = con.createStatement();
flag=st.execute(query);
st.close();
st=null;
flag=true;


}
catch (Exception e)
{
flag=false;
e.printStackTrace();
throw new SQLException(" UNABLE TO FETCH INSERT");
}
return flag;
}

最大打开游标设置为 4000代码正在执行 更新 tableA set colA ='x',lst_upd_date = trunc(sysdate) where trunc(date) = to_date('"+date+"','dd-mm-yyyy')更新查询约 8000 次

但在大约 2000 天后,它抛出了“超出最大打开游标数”的异常

请为此建议代码更改。@TimBiegeleisen 这是获取连接的代码

public  Connection getConnection(String sessId)
{

Connection connection=null;

setLastAccessed(System.currentTimeMillis());

connection=(Connection)sessionCon.get(sessId);

try
{
if(connection==null || connection.isClosed() )
{

if ( ds == null )
{
InitialContext ic = new InitialContext();
ds = (DataSource) ic.lookup("java:comp/env/iislDB");
}

connection=ds.getConnection();

sessionCon.put(sessId, connection);

}
}
catch (SQLException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}


return connection;
}

`

错误堆栈如下

java.sql.SQLException: ORA-01000: maximum open cursors exceeded

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:180)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208)
at oracle.jdbc.ttc7.Oopen.receive(Oopen.java:118)
at oracle.jdbc.ttc7.TTC7Protocol.open(TTC7Protocol.java:472)
at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:499)
at oracle.jdbc.driver.OracleConnection.privateCreateStatement(OracleConnection.java:683)
at oracle.jdbc.driver.OracleConnection.createStatement(OracleConnection.java:560)
at org.apache.tomcat.dbcp.dbcp.DelegatingConnection.createStatement(DelegatingConnection.java:257)
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.createStatement(PoolingDataSource.java:216)
at com.iisl.business.adminbo.computeindex.MoviIndexComputeBO.calculateMoviValue(MoviIndexComputeBO.java:230)

最佳答案

您的代码存在游标泄漏。这就是导致错误的原因。在遇到错误之前,您的代码似乎不太可能真正运行 2000 天(大约 5.5 年)。如果真是这样,我敢打赌您会非常乐意每十年重新启动服务器两次。

在您的 try block 中,您创建了一个 Statement。如果在创建语句和调用 st.close() 之间抛出异常,您的代码将使语句保持打开状态,并且您将泄漏游标。一旦 session 泄漏了 4000 个游标,您就会收到错误消息。增加 max_open_cursors 只会在错误发生时延迟,不会解决根本问题。

根本的问题是你的 try/catch block 需要一个 finally 来关闭 Statement 如果 >尝试。为此,您需要在 try

之外声明 st
finally {
if (st != null) {
st.close();
}
}

关于java - 最大打开游标超出 java 代码中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39716391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com