相关疑难解决方法(0)

ORA-01000:使用Spring SimpleJDBCCall时超出最大打开游标数

我们使用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)

java oracle spring jdbc

8
推荐指数
1
解决办法
2万
查看次数

标签 统计

java ×1

jdbc ×1

oracle ×1

spring ×1