我有一个关于性能的问题。CallableStatement.close()会导致性能问题
我工作的应用程序是一个Spring MVC应用程序(v3.2.9)。它托管在WebSphere Application Server(v8.5.5)上。它连接到AS400 DB2系统(驱动程序是JTOpen v9.1)。我的应用程序在IBM AS400系统上调用存储过程。它被称为使用Spring的JdbcTemplate.execute方法。下面的代码:
jdbcTemplate.execute(new CallableStatementCreator() {
@Override
public CallableStatement createCallableStatement(Connection con) throws SQLException {
CallableStatement cs = con.prepareCall("{CALL XXXXXXSP (?, ?)}");
cs.setString(1, xxx);
cs.setString(2, xxx);
return cs;
}
},
new CallableStatementCallback<String>() {
@Override
public String doInCallableStatement(CallableStatement cs)throws SQLException, DataAccessException {
cs.execute();
return null;
}
});
我们遇到了一些问题,其中该过程的调用偶尔会引发错误“[SQL0501]光标C1不开”调高记录和审查后,它看起来像这样的错误只有在应用程序尝试重新使用CallableStatement时才会发生。相应的游标在上次使用此CallableStatement时被关闭,导致错误(我不是100%确定是否这种重用是预期的行为)。错误发生在每天20次左右,这是一个相对较低的百分比,因为这个应用程序有更高的流量。
我的问题是,将cs.execute();
之后的代码加入cs.close();
会导致代码性能下降吗?
问题出在您要在AS400上调用的程序中。你将不得不在AS400上修复它。我在野外看到这些信息时,如果没有找到记录,就不会执行close语句,也不会执行承诺控制的初始提交。我也在野外看到没有检查打开是否成功,因此抓取失败。添加代码以检查打开的语句。如果公开失败,则发布另一个公开声明。 – danny117
@ danny117感谢您的建议,只是想澄清...您所指的开放语句和关闭语句将在AS400上的程序中,而不是在Java代码中,是正确的吗? –
是的,它看起来像as400编码问题。我假设close是关闭游标。 – danny117