Chúng tôi đang sử dụng Spring SimpleJdbcCall để gọi các thủ tục lưu sẵn trong Oracle trả lại con trỏ. Có vẻ như SimpleJdbcCall không đóng con trỏ và sau một thời gian, con trỏ mở tối đa bị vượt quá.ORA-01000: con trỏ mở tối đa vượt quá khi sử dụng Spring SimpleJDBCCall
ORA-01000: maximum open cursors exceeded ; nested exception is java.sql.SQLException: ORA-01000: maximum open cursors exceeded spring
Có một vài người khác trên diễn đàn đã trải nghiệm điều này nhưng dường như không có câu trả lời. Có vẻ như tôi là một lỗi trong hỗ trợ mùa xuân/oracle.
Lỗi này rất quan trọng và có thể ảnh hưởng đến việc sử dụng Spring JDBC trong tương lai của chúng tôi.
Có ai gặp sự cố - hoặc theo dõi vấn đề với mã Spring hoặc tìm giải pháp tránh được sự cố không?
Chúng tôi đang sử dụng Spring 2.5.6.
Dưới đây là phiên bản mới của mã sử dụng SimpleJdbcCall mà dường như không được đóng cửa một cách chính xác kết quả thiết rằng lợi nhuận proc qua một con trỏ:
...
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")
Các phiên bản cũ hơn của mã mà không sử dụng Spring JDBC không có vấn đề này:
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 = (ResultSet)callable.getObject(2);
... do stuff with the result set
if (rset != null) rset.close(); // Explicitly close the resultset
if (callable != null) callable.close(); //Close the callable
if (oracleConnection != null) oracleConnection.close(); //Close the connection
Dường như Spring JDBC KHÔNG gọi rset.close(). Nếu tôi nhận xét ra rằng dòng trong mã cũ sau đó sau khi thử nghiệm tải chúng tôi nhận được cùng một ngoại lệ cơ sở dữ liệu.
Vui lòng đăng một số mã cho biết cách bạn đang sử dụng SimpleJdbcCall. Thật không may rằng đây là một lỗi trong Spring, và nhiều khả năng là cách bạn đang sử dụng nó, đặc biệt là xem xét cách không chuẩn mà Oracle xử lý các resultset. – skaffman
+1 với skaffman. Nếu bạn không thể tìm ra vấn đề, hãy thử xây dựng một trường hợp thử nghiệm đá rắn trước để báo cáo lỗi tại http://jira.springframework.org/ –