java.sql.SQLException: Connection has already been closed

背景:

通過一個接口觸發后臺數據庫的批量更新操作,原本只是一個觸發動作,不需要返回值,因此沒有關心出現的http超時問題。后面發現批量更新任務中斷了,查日志發現了Connection has already been closed報錯。

具體的報錯信息如下:

首先有一個警告:

24-Aug-2023 11:15:58.527 警告 [Tomcat JDBC Pool Cleaner[571592672:1692844532994]] org.apache.tomcat.jdbc.pool.ConnectionPool.abandon Connection has been abandoned PooledConnection[com.mysql.jdbc.JDBC4Connection@4a3901b4]:java.lang.Exceptionat org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1102)at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:807)at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:651)at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:198)at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:132)at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:82)at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:68)at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:336)at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:84)at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)at sun.reflect.GeneratedMethodAccessor256.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)at ...at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)at sun.reflect.GeneratedMethodAccessor261.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)at com.sun.proxy.$Proxy362.selectList(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)at com.sun.proxy.$Proxy463.page(Unknown Source)at ...

然后就是導致更新操作中斷的一個報錯:

2023-08-24 11:15:58.797 |[FA18413C-D23E-F8A6-2550-9384CE3F308B]| WARN | Error while extracting database name - falling back to empty error codes | org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes | SQLErrorCodesFactory.java:218 
org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is java.sql.SQLException: Connection has already been closed.

分析:

根據報錯的信息,可以看出是因為執行SQL時獲取不到Connection連接,然后去看一下數據庫配置中,有三個配置可以關注一下:

配置 默認值 說明
removeAbandoned false 是否強制關閉連接時長大于removeAbandonedTimeoutMillis的連接
removeAbandonedTimeoutMillis 300 * 1000 一個連接從被連接到被關閉之間的最大生命周期
logAbandoned false 強制關閉連接時是否記錄日志

看了下我們項目的配置:

1.removeAbandoned是true,代表的意思是,關閉連接時長大于一定時長的連接

2.removeAbandonedTimeout是180,代表從被連接到被關閉之間的最大生命周期是3分鐘

3.logAbandoned是true,代表強制關閉連接時記錄日志

問題的原因可能就是出現在這里了,這里會循環遍歷連接池中的連接,如果存活,就判斷是否超過了配置的removeAbandonedTimeout,如果超過了時間,這個連接就要被干掉。因為spring中配置事務時配置的service開啟一個事務,在service中拿到連接開啟一個事務,而遍歷中一直使用注入的dao去調用方法,其本質就是一直使用一個連接,不會遍歷一次執行完重新獲取連接,導致該連接超時被tomcat關閉回收。

可以嘗試的解決方案:

1.適當增大 removeAbandonedTimeout時間,讓單次獲取的連接能夠執行時間更長一點,讓其支持更長一點的事務。

2.將所有dao層方法抽出來另放一個業務service層,注入dao層,方法里使用dao的調用方法。在原來的service層中注入業務service,原有dao調用的方法,全部替換成業務service調用的方法。這樣每次業務service調用到(update、insert、delete)方法,就開啟一個事務,執行完就回收。再執行就有獲取一個連接,執行到事務方法后,又會主動關閉,就不會因連接超時被tomcat強行回收了!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162910.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162910.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162910.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【網絡奇緣】- 計算機網絡|性能指標|體系結構

🌈個人主頁: Aileen_0v0🔥系列專欄: 一見傾心,再見傾城 --- 計算機網絡~💫個人格言:"沒有羅馬,那就自己創造羅馬~" 目錄 溫故而知新 計算機網絡性能指標 時延 時延帶寬積 往返時延RTT 訪問百度?編輯 訪問b站 訪問谷歌 …

使用 .toISOString() 方法生成當前時間的ISO格式字符串,解決UTC時區差問題

方法分析: 日常開發中,有時我們需要向后端傳遞的時間值可能并非一個時間對象,而是字符串格式。 例 1:[2023-08-16T08:07:25.577Z] 但是我們通過 new Date() 之后直接使用 .toString() 方法得到的卻并非這種格式。 例 2&#xff1…

MAX/MSP SDK學習08:設置入口的冷熱標簽

1. 默認所有的入口會顯示為熱標簽(紅色); 2. 若想讓所有非最左入口都顯示為冷標簽,則需在ext_main函數中添加內置函數stdinletinfo: class_addmethod(c, (method)stdinletinfo, "inletinfo", A_CANT, 0); 3…

【從零開始學習Linux】一文帶你了解Shell外殼及用戶權限(一)

🚩紙上得來終覺淺, 絕知此事要躬行。 🌟主頁:June-Frost 🚀專欄:Linux入門 🔭【從零開始學習Linux】系列均屬于Linux入門,主要包含Linux操作系統下的指令、操作、權限以及開發工具&a…

@DS動態切換數據源

1.DS概述 DS是自定義注解,可以作用于方法或類上,用于切換數據源。當注解添加到類上時,意味著此類里的方法都使用此數據源;當注解添加到方法上時,意味著此方法上使用的數據源優先級高于其他一切配置。 2.DS使用 2.1 導…

基于.net framework4.0框架下winform項目實現寄宿式web api

首先Nuget中下載包:Microsoft.AspNet.WebApi.SelfHost,如下: 注意版本哦,最高版本只能4.0.30506能用。 1.配置路由 public static class WebApiConfig{public static void Register(this HttpSelfHostConfiguration config){// …

Axure插件瀏覽器一鍵安裝:輕松享受高效工作!

Axure插件對原型設計師很熟悉,但由于Axure插件是在國外開發的,所以在安裝Axure插件時不僅需要下載中文包,激活步驟也比較繁瑣,有時Axure插件與計算機系統不匹配,Axure插件格式不兼容。本文將詳細介紹如何安裝Axure插件…

uniapp開發小程序-pc端小程序下載文件

fileName包含文件名后綴名,比如test.png這種格式 api.DownloadTmtFile后端接口返回的是文件的二進制流 值得注意的是,微信開發者工具中是測試不了wx.saveFileToDisk的,需要真機或者體驗版測試 handleDownload(fileName) {if (!fileName) retu…

CCFCSP試題編號:201912-2試題名稱:回收站選址

這題只要比較坐標的四周&#xff0c;然后計數就可以了。 #include <iostream> using namespace std;int main() {int n;cin >> n;int arr[1005][2] { 0 };int res[5] { 0 };int up 0;int down 0;int left 0;int right 0;int score 0;for (int i 0; i <…

QT 在Windows下實現ping功能(ICMP)

前言 很多時候&#xff0c;我們可能會圖省事直接調用系統中的ping命令&#xff0c;但這是很不科學的~ 廢話不多說&#xff0c;直接上代碼.. .pro文件 在.pro文件末尾添加一行&#xff1a; LIBS -liphlpapi -lws2_32 .h文件 在.h文件中加入&#xff1a; #include <Q…

23款奔馳GLC260L升級原廠360全景影像 高清環繞

本次星駿匯小許介紹的是23款奔馳GLC260L升級原廠360全景影像&#xff0c;上帝視角看清車輛周圍環境&#xff0c;更輕松駕駛 升級360全景影像系統共有前后左右4個攝像頭&#xff0c;分別在車頭&#xff0c;車尾&#xff0c;以及兩邊反光鏡下各一個&#xff0c;分別用來采集車頭&…

C# 宏--釋義及實例

1.宏-釋義 在C#中&#xff0c;宏&#xff08;Macro&#xff09;通常指的是預處理指令&#xff08;Preprocessor Directive&#xff09;&#xff0c;用于在編譯時對源代碼進行一些宏替換或條件編譯的操作。C#中的宏使用預處理器指令#define和#undef來定義和取消定義宏&#xff…

C++string_view簡介

1. 簡介 C17之后才有string_view&#xff0c;主要為了解決C語言常量字符串在std::string中的拷貝問題。 即readonly的string。 2. 引入 2.1 隱式拷貝問題 將C常量字符串拷貝了一次 #include <iostream> #include <string>int main() {std::string s{ "He…

Modbus RTU、Modbus 庫函數

Modbus RTU 與 Modbus TCP 的區別 一般在工業場景中&#xff0c;使用 Modbus RTU 的場景更多一些&#xff0c;Modbus RTU 基于串行協議進行收發數據&#xff0c;包括 RS232/485 等工業總線協議。采用主從問答式&#xff08;master / slave&#xff09;通信。 與 Modbus TCP 不…

基于springboot實現實習管理系統的設計與實現項目【項目源碼+論文說明】計算機畢業設計

基于sprinmgboot實現實習管理系統的設計與實現演示 摘要 隨著信息化時代的到來&#xff0c;管理系統都趨向于智能化、系統化&#xff0c;實習管理也不例外&#xff0c;但目前國內仍都使用人工管理&#xff0c;市場規模越來越大&#xff0c;同時信息量也越來越龐大&#xff0c;…

普通平衡樹

題意&#xff1a;略&#xff0c;題中較清晰。 用二叉查找樹來存儲數據&#xff0c;為了增加效率&#xff0c;盡量使左子樹和右子樹的深度差不超過一&#xff0c;這樣可以時間控制在logn&#xff0c;效率比較高。 右旋和左旋&#xff0c;目的是為了維護二叉樹的操作&#xff0…

Dubbo引入Zookeeper等注冊中心簡介以及DubboAdmin簡要介紹,為后續詳解Dubbo各種注冊中心做鋪墊!

文章目錄 一&#xff1a;Dubbo注冊中心引言 1&#xff1a;什么是Dubbo的注冊中心&#xff1f; 2&#xff1a;注冊中心關系圖解 3&#xff1a;引入注冊中心服務執行流程 4&#xff1a;Dubbo注冊中心好處 5&#xff1a;注冊中心核心作用 二&#xff1a;注冊中心實現方案 …

Springboot+vue的新冠病毒密接者跟蹤系統(有報告)。Javaee項目,springboot vue前后端分離項目

演示視頻&#xff1a; Springbootvue的新冠病毒密接者跟蹤系統(有報告)。Javaee項目&#xff0c;springboot vue前后端分離項目 項目介紹&#xff1a; 本文設計了一個基于Springbootvue的新冠病毒密接者跟蹤系統&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;v…

HttpClient實現 get、post、put、delete請求【轉】

來自&#xff1a;HttpClient實現 get、post、put、delete請求_httpclient put請求-CSDN博客 目錄 HttpClient HttpClient的主要功能 httpclient使用示例主要步驟 Spring Boot 工程結構 HttpClient實現主要代碼&#xff1a; GET POST PUT Delete HttpClient HttpCli…

信息系統項目管理師-干系人管理論文提綱

快速導航 1.信息系統項目管理師-項目整合管理 2.信息系統項目管理師-項目范圍管理 3.信息系統項目管理師-項目進度管理 4.信息系統項目管理師-項目成本管理 5.信息系統項目管理師-項目質量管理 6.信息系統項目管理師-項目資源管理 7.信息系統項目管理師-項目溝通管理 8.信息系…