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

 

callStmt 和conn 我都有关闭 但是数据库查询游标 发现一直再涨,并没有关闭,我也没有循环,请问到底哪里没关啊

       Connection _conn = PMServerConnectManager.getDBConn();

        CallableStatement callStmt = null;

        try {

            String strSql =
                "begin ? := xxxxxx(?,?,?,?,?,?);end;";

            callStmt = _conn.prepareCall(strSql);

            callStmt.registerOutParameter(1, OracleTypes.INTEGER);

            callStmt.registerOutParameter(2, OracleTypes.CURSOR);

               ------

    finally {
            try{
                if(callStmt!=null)
                    callStmt.close();
                   
                  if(_conn!=null)
                      _conn.close();
                 ---

 

Java代码在执行conn.createStatement()和conn.prepareStatement()时,相当于在数据库中打开了一个cursor。尤其是,如果你的createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。

一般来说,Java中createStatement和prepareStatement都应该要放在循环外面,而且使用了这些Statment后,及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statment关闭。

或者你可以修改oracle系统参数:将OPEN_CURSORS 的值设置得足够大,以避免应用程序用尽所有打开的游标。

就你的这段代码看,应该是关闭了的,或者你把代码发全一点看看。