CallableStatement.close()会导致性能问题

时间:2017-07-06 16:18:20

标签: java spring-mvc jdbc ibm-midrange

我对性能有疑问。

我工作的应用程序是一个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();吗?

1 个答案:

答案 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调用只将对象返回池而不是   实际关闭资源。