Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CallableStatement.close()是否会导致性能问题_Java_Spring Mvc_Jdbc_Ibm Midrange - Fatal编程技术网

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

Java CallableStatement.close()是否会导致性能问题,java,spring-mvc,jdbc,ibm-midrange,Java,Spring Mvc,Jdbc,Ibm Midrange,我有一个关于性能的问题 我使用的应用程序是SpringMVC应用程序(v3.2.9)。它托管在WebSphereApplicationServer(v8.5.5)上。它连接到一个AS400 DB2系统(驱动程序是JTOpen v9.1)。我的应用程序调用IBM AS400系统上的存储过程。正在使用Spring的JdbcTemplate.execute方法调用它。代码如下: jdbcTemplate.execute(new CallableStatementCreator() {

我有一个关于性能的问题

我使用的应用程序是SpringMVC应用程序(v3.2.9)。它托管在WebSphereApplicationServer(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;
        }
    });
jdbcTemplate.execute(新的CallableStatementCreator(){
@凌驾
公共CallableStatement createCallableStatement(连接con)引发SQLException{
CallableStatement cs=con.prepareCall({CALL xxxxxx sp(?,)});
cs.固定管柱(1,xxx);
cs.固定管柱(2,xxx);
返回cs;
}
}, 
新的CallableStatementCallback(){
@凌驾
公共字符串doInCallableStatement(CallableStatement cs)抛出SQLException、DataAccessException{
cs.execute();
返回null;
}
});
我们遇到了一些问题,在打开日志记录和查看后,调用此过程偶尔会抛出错误“[SQL0501]游标C1未打开”,看起来只有当应用程序尝试重新使用CallableStatement时才会发生此错误。上次使用此CallableStatement时,相应的游标被关闭,这导致了错误(我不能100%确定此重复使用是否为预期行为)。错误每天发生20次左右,这是一个相对较低的百分比,因为此应用程序具有更高的流量


我的问题是,添加
cs.close()
cs.execute()之后的代码会导致代码性能下降吗?

通常,您应该调用close()方法来关闭语句,因为它会释放资源。这没有任何问题

但是JdbcTemplate关闭语句对于您来说,所以不需要它

以下是JdbcTemplate在执行结束时所做的
execute(CallableStatementCreator csc,CallableStatementCallback action)
方法:

JdbcUtils.closeStatement(cs);
DataSourceUtils.releaseConnection(con, getDataSource());
从CallableStatementCallbackAPI:

 doInCallableStatement(CallableStatement cs) throws SQLException ,DataAccessException
由JdbcTemplate调用。使用活动JDBC执行 可调用声明。不需要关心结束语句 或者连接,或者关于处理事务:这些都是 由Spring的JdbcTemplate处理注意:任何打开的结果集都应 在回调实现中的finally块中关闭。春天 将在回调返回后关闭语句对象,但 并不一定意味着结果集资源将 closed:连接池可能会对语句对象进行池化, 使用close调用仅将对象返回池,而不返回 物理关闭资源


似乎任何由存储过程显式打开的结果集都需要由客户端关闭。我不确定在框架中应该发生什么。如果结果集不应返回给调用方,则存储过程应已关闭结果集。此外,由于游标名称在作业中需要是唯一的,因此存储过程应该使用比C1更具体的名称作为游标名称。问题在于您在AS400上调用的程序。你必须把它安装在AS400上。我在野外看到这些with close语句在没有找到记录时不执行,也没有提交控制的初始提交。我还看到在野外没有检查打开是否成功,因此获取失败。添加代码以检查open语句。如果打开失败,请发出关闭声明,然后再发出另一个打开声明。@danny117谢谢您的建议,只想澄清一下。。。您所指的open语句和close语句将出现在AS400上的程序中,而不是Java代码中,对吗?是的,它看起来像是AS400编码问题。我假设close是用于close游标的。