1. 程式人生 > >SQLTransientConnectionException: Connection is not available, request timed out after 60001ms.

SQLTransientConnectionException: Connection is not available, request timed out after 60001ms.

資料來源使用的是 Hikari ,

但是 在執行一段時間後爆:

SQLTransientConnectionException:  Connection is not available, request timed out after 60001ms.

配置超時確實是 配置了 60s 超時。

百度一般都說是什麼配置問題,會不會是配置問題?

 dataSource.setReadOnly(false); //預設false
        dataSource.setIdleTimeout(50000L);
        dataSource.setValidationTimeout(3000L);
        dataSource.setMaxLifetime(50000L);

加上對應配置。

本地跑起來 沒有出現  這個異常了。

但是在 測試環境,發現 過了一段時間還是出現了這個  連線超時異常。

在本地環境運行了 一天 或者更久一點,確實 也出現了這個問題。

看配置最大 連線 數量是 50 。  執行了 50次連線資料查詢之後, 再次 執行的連線查詢,也是 出現連線超時。

一些網友說是 ,  連線沒有關閉, 導致 連線數耗盡了,所以再次獲取連線的時候獲取不到,一直到資料來源獲取連線超時了。

如果是這樣似乎是 合理了。

 

檢視程式碼

Connection connection=null;
        try {
           connection = dataSource.getConnection();
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();

            while (resultSet.next()) {
                Map<String, Object> resultMap = new HashMap<>();
                ResultSetMetaData setMetaData = resultSet.getMetaData();

                for (int i = 1; i <= setMetaData.getColumnCount(); i++) {
                    String columnName = setMetaData.getColumnLabel(i);
                    Object value = resultSet.getObject(columnName);
                    resultMap.put(columnName, value);
                }
                resultMapList.add(resultMap);
            }



        } catch (SQLException e) {
            log.error("執行統計SQL出錯:{}", sql, e);
        }

確實沒有關閉連線。

如果是整合spring的話,那麼 會 自動幫我們關閉連線的。

所以這樣子方式的話,必須手動關閉連線。

加個 finally   連線 close()  ,問題果然解決了。

參考 https://blog.csdn.net/zhangjunli/article/details/88885776

參考 https://blog.csdn.net/san_yun/article/details/84920175

參考 https://www.iteye.com/blog/qdpurple-1723141

參考 https://www.oschina.net/question/946001_153961