第一次调用后 SimpleJdbcCall 存储过程调用失败
SimpleJdbcCall stored procedure call fails after first call
我正在使用 JdbcTemplate 调用 as400 中的存储过程。我知道模式和程序存在并且我使用了正确的拼写等
应用程序第一次启动调用时按预期工作并且没有给出错误。后续调用失败并出现此错误:
org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call PGM999.STOREDPROCNAME(?, ?, ?, ?, ?, ?, ?)}]; nested exception is com.ibm.as400.access.AS400JDBCSQLSyntaxErrorException: [SQL0204] NEWSP in RGRPGM type *N not found.
这是 @Service
class 中的一些相关代码片段:
private ConcurrentMap<String, SimpleJdbcCall> storedProcedureCallsMap = new ConcurrentHashMap<String, SimpleJdbcCall>();
public Map<String, Object> executeStoredProcedure(String procedureName, MapSqlParameterSource paramSource, String libraryName) {
return executeStoredProcedureCall(procedureName, paramSource, createCallForStoredProcedure(procedureName, libraryName));
}
private CallCreator createCallForStoredProcedure(String procedureName, String libraryName) {
return new CallCreator() {
@Override
public SimpleJdbcCall createCall() {
return new SimpleJdbcCall(as400JdbcTemplate).withSchemaName(libraryName).withProcedureName(procedureName);
}
};
}
//
SimpleJdbcCall call = storedProcedureCallsMap.get(procedureName);
call = callCreator.createCall();
call.compile();
Map<String, Object> returnMap = call.execute(paramsSource);
奇怪的是,当我调用以下之一时:Connection.commit()
或 Connection.endRequest()
或 Connection.setAutoCommit(true)
它每次都有效,但是,在所有这些中它都会锁定连接线程池,甚至调用 Connection.close()
也不会关闭它们,它们会保持活动状态,直到没有可用的空闲连接并锁定整个连接。
所以我要么需要解决第一个问题,让它每次都工作而不告诉它提交等,或者第二个问题,我确实调用了其中一个,但成功地强制它释放了连接。
事实证明,有问题的存储过程正在调用另一个尚未复制到主过程正在使用的模式的存储过程。我仍然不知道为什么它第一次会起作用,或者当我告诉它提交时它每次都会起作用。无论哪种方式,将丢失的过程复制到相同的模式似乎都可以解决问题。
我正在使用 JdbcTemplate 调用 as400 中的存储过程。我知道模式和程序存在并且我使用了正确的拼写等
应用程序第一次启动调用时按预期工作并且没有给出错误。后续调用失败并出现此错误:
org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call PGM999.STOREDPROCNAME(?, ?, ?, ?, ?, ?, ?)}]; nested exception is com.ibm.as400.access.AS400JDBCSQLSyntaxErrorException: [SQL0204] NEWSP in RGRPGM type *N not found.
这是 @Service
class 中的一些相关代码片段:
private ConcurrentMap<String, SimpleJdbcCall> storedProcedureCallsMap = new ConcurrentHashMap<String, SimpleJdbcCall>();
public Map<String, Object> executeStoredProcedure(String procedureName, MapSqlParameterSource paramSource, String libraryName) {
return executeStoredProcedureCall(procedureName, paramSource, createCallForStoredProcedure(procedureName, libraryName));
}
private CallCreator createCallForStoredProcedure(String procedureName, String libraryName) {
return new CallCreator() {
@Override
public SimpleJdbcCall createCall() {
return new SimpleJdbcCall(as400JdbcTemplate).withSchemaName(libraryName).withProcedureName(procedureName);
}
};
}
//
SimpleJdbcCall call = storedProcedureCallsMap.get(procedureName);
call = callCreator.createCall();
call.compile();
Map<String, Object> returnMap = call.execute(paramsSource);
奇怪的是,当我调用以下之一时:Connection.commit()
或 Connection.endRequest()
或 Connection.setAutoCommit(true)
它每次都有效,但是,在所有这些中它都会锁定连接线程池,甚至调用 Connection.close()
也不会关闭它们,它们会保持活动状态,直到没有可用的空闲连接并锁定整个连接。
所以我要么需要解决第一个问题,让它每次都工作而不告诉它提交等,或者第二个问题,我确实调用了其中一个,但成功地强制它释放了连接。
事实证明,有问题的存储过程正在调用另一个尚未复制到主过程正在使用的模式的存储过程。我仍然不知道为什么它第一次会起作用,或者当我告诉它提交时它每次都会起作用。无论哪种方式,将丢失的过程复制到相同的模式似乎都可以解决问题。