簡體   English   中英

Spring JdbcTemplate可以等待oracle存儲過程完成多長時間

[英]how long can Spring JdbcTemplate wait for an oracle stored procedure to finish

我的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)

可能是由於等待時間長所致。 我發現它在日志中打印了“ 開始 ”,大約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

只要需要它就應該等待。 忘記各種嘗試根據超時延遲“檢測”死鎖的黑客。

  • 您還應該找到一些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聯系,然后要求合作。 他們應該比Internet論壇上的匿名人員更好地幫助您。

也許是因為長時間的等待

不,不是因為那引起的

正如Java Doc所說的關於DataAccessResourceFailureException

資源完全失敗時引發的數據訪問異常:例如,如果我們無法使用JDBC連接到數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM