我们使用Spring SimpleJdbcCall来调用返回游标的Oracle中的存储过程.看起来SimpleJdbcCall没有关闭游标,一段时间后超出了最大打开游标.
ORA-01000: maximum open cursors exceeded ; nested exception is java.sql.SQLException: ORA-01000: maximum open cursors exceeded spring
Run Code Online (Sandbox Code Playgroud)
在论坛上有一些其他人经历过这个,但似乎没有答案.它看起来像我在spring/oracle支持中的bug.
这个bug很关键,可能影响我们将来使用Spring JDBC.
有没有人遇到过修复 - 要么将问题跟踪到Spring代码,要么找到避免问题的解决方法?
我们使用的是Spring 2.5.6.
这是使用SimpleJdbcCall的代码的新版本,它似乎无法正确关闭proc通过游标返回的结果集:
...
SimpleJdbcCall call = new SimpleJdbcCall(dataSource);
Map params = new HashMap();
params.put("remote_user", session.getAttribute("cas_username") );
Map result = call
.withSchemaName("urs")
.withCatalogName("ursWeb")
.withProcedureName("get_roles")
.returningResultSet("rolesCur", new au.edu.une.common.util.ParameterizedMapRowMapper() )
.execute(params);
List roles = (List)result.get("rolesCur")
Run Code Online (Sandbox Code Playgroud)
不使用Spring JDBC的旧版本代码没有此问题:
oracleConnection = dataSource.getConnection();
callable = oracleConnection.prepareCall(
"{ call urs.ursweb.get_roles(?, ?) }" );
callable.setString(1, (String)session.getAttribute("cas_username"));
callable.registerOutParameter (2, oracle.jdbc.OracleTypes.CURSOR);
callable.execute();
ResultSet rset = …Run Code Online (Sandbox Code Playgroud)