Spring JdbcTemplate等待oracle存储过程完成多长时间

时间:2015-03-12 12:02:07

标签: java spring oracle jdbctemplate sqlexception

我的java代码就像:

logger.info("start");
getJdbcTemplate().execute("call " + procedureName + "()");  

我得到了例外:

org.springframework.dao.DataAccessResourceFailureException: StatementCallback; SQL [call PRMI_UPDATE_USER_LOGIN_INFO()]; Io ERROR: Connection reset; nested exception is java.sql.SQLException: Io ERROR: Connection reset
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:257)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:407)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:428)

可能是因为长时间等待造成的。我发现它打印了#34; 开始"在日志中,大约5分钟后,我得到了例外。

更新于2013-03-13:

我不仅在调用oracle存储过程时遇到了异常,而且在德鲁伊' JdbcUtil.close(...)':

com.alibaba.druid.util.JdbcUtils.close:81 - close connection error
java.sql.SQLRecoverableException: Io Error: Connection reset
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:101)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:521)
    at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:500)
    at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:3509)
    at com.alibaba.druid.filter.FilterChainImpl.connection_close(FilterChainImpl.java:167)
    at com.alibaba.druid.filter.stat.StatFilter.connection_close(StatFilter.java:254)
    at com.alibaba.druid.filter.FilterChainImpl.connection_close(FilterChainImpl.java:163)
    at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.close(ConnectionProxyImpl.java:115)
    at com.alibaba.druid.util.JdbcUtils.close(JdbcUtils.java:79)
    at com.alibaba.druid.pool.DruidDataSource.shrink(DruidDataSource.java:1876)
    at com.alibaba.druid.pool.DruidDataSource$DestroyConnectionThread.run(DruidDataSource.java:1694)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:96)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
    at oracle.net.ns.DataPacket.send(DataPacket.java:150)
    at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:180)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:169)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:117)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:92)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:77)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1034)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1010)
    at oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:97)
    at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:487)

德鲁伊的JdbcUtil.close方法非常简单:

 public static void close(Connection x) {
    if (x == null) {
        return;
    }
    try {
        x.close();
    } catch (Exception e) {
        LOG.debug("close connection error", e);
    }
}

源代码是: https://github.com/alibaba/druid/blob/master/src/main/java/com/alibaba/druid/util/JdbcUtils.java

2 个答案:

答案 0 :(得分:2)

只要需要它就应该等待。忘记试图"检测"的各种黑客基于超时延迟的死锁。

  • 您还应该找到一些ORA-XXXX错误。 Io ERROR: Connection reset看起来不像Oracle错误消息,应该附加一些错误编号
  • 超时5分钟是非常奇怪的值。从理论上讲,这也可以在数据库方面进行设置。作为个人资料参数CPU_PER_CALL,但在这种情况下,您应该收到错误:ORA-02393: exceeded call limit on CPU usage。并且你的联系不应该丢失
  • 理论上你也可能遇到连接检测失败的问题,但5分钟的超时时间太短
  • 另一个可能的来源可能是ORA-600错误。 Oracle内部错误,可能是您的会话进程崩溃,因此TCP连接丢失
  • 您应该联系当地的DBA,然后请求合作。他们应该比互联网论坛上的匿名人士更好地帮助你。

答案 1 :(得分:0)

  

可能是因为长时间等待而造成的

不,不是由于

引起的

正如Java Doc所说的那样DataAccessResourceFailureException

  

资源完全失败时抛出的数据访问异常:for   例如,如果我们无法使用JDBC连接到数据库。