我对性能有疑问。
我工作的应用程序是一个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;
}
});
我们遇到了一些问题,其中调用此过程偶尔会抛出错误&#34; [SQL0501]光标C1未打开&#34;在打开日志记录和查看之后,看起来只有当应用程序尝试重用CallableStatement时才会出现此错误。最后一次使用此CallableStatement时,相应的游标被关闭,这导致错误(如果重复使用是否是预期的行为,我不能100%确定)。错误每天发生20次左右,这个百分比相对较低,因为此应用程序的流量要高得多。
我的问题是,在cs.close();
导致代码性能下降后,会在代码中添加cs.execute();
吗?
答案 0 :(得分:2)
通常,应该调用close()方法来关闭语句,因为它释放资源。这没有任何问题。
但JdbcTemplate为你关闭声明,所以不需要它。
这是JdbcTemplate在执行execute(CallableStatementCreator csc, CallableStatementCallback<T> action)
方法结束时所做的事情:
JdbcUtils.closeStatement(cs);
DataSourceUtils.releaseConnection(con, getDataSource());
来自CallableStatementCallback api:
doInCallableStatement(CallableStatement cs) throws SQLException ,DataAccessException
使用活动JDBC通过JdbcTemplate.execute调用 CallableStatement中。不需要关心关闭Statement 或连接,或关于处理交易:这将是全部 由Spring的JdbcTemplate处理。 注意:任何打开的ResultSet都应该 在回调实现中的finally块中关闭。弹簧 将在返回回调后关闭Statement对象,但这样做 并不一定意味着ResultSet资源将是 closed:Statement对象可能被连接池合并, 使用close调用只将对象返回池而不是 实际关闭资源。