关于No ManagedConnections available within configured blocking timeout异常的解决

本文分享了一次数据库连接超时问题的排查经历,详细解释了如何通过检查代码中未正确关闭的connection来解决问题,避免数据库连接资源被过度消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 最近由于系统和业务重构需要,需要把线上1亿数据迁移到新库,由于业务变更,新表老表结构有变化,没法直接用dba dump的方式,需要自己写转换程序迁移。今天在调试的时候,碰到一个蛋疼的问题,就是一开始查询数据都正常,但是查询几条后日志就会报超时错误,具体日志如下:

No ManagedConnections available within configured blocking timeout ( 5000 [ms] ); - nested throwable: (javax.resource.ResourceException: No ManagedConnections available within configured blocking timeout ( 5000 [ms] ))

  搜了下这个错误,各种说法比较多,但是感觉都没说到点上,找DBA看了下,DBA直接表示这个库连接数一直吃紧,从这个错误看也是连接超时,本来以为就这么着了,但是调试了几次都是一开始正常,后来报异常,就感觉肯定还是代码有问题导致连接数吃紧,后来仔细看了下代码,发现是connection没有关闭...应该说是没有关闭全。把PrepareStatement和ResultSet关闭了,但是没把最重要的Connection关闭掉...关闭了Connection就正常了。

  网上几个搜的结果太过于误导人,所以就记录一下,碰到这个错误,首先是确认自己代码是否有相关connection没关闭掉,基本都是没关闭connection导致的,最后再确认数据库连接数是不是真的吃紧。

  如下代码仅供参考:

复制代码
 1         try{
 2             conn = sourceDs.getConnection();
 3             ps = conn.prepareStatement(selectTcBizOrder);
 4             rs = ps.executeQuery();
 5             if(rs.next()){
 6                 result.put("auction_id", rs.getLong("auction_id"));
 7                 result.put("logistics_status", rs.getInt("logistics_status"));
 8                 result.put("attributes", rs.getString("attributes"));
 9                 return result;
10             }else{
11                 return null;
12             }
13         }catch(SQLException e){
14             LogFactory.getTaskLog().error("[select tc_biz_order SQLException], bizOrderId="+bizOrderId, e);
15             return null;
16         }catch(Exception e){
17             LogFactory.getTaskLog().error("[select tc_biz_order other Exception], bizOrderId="+bizOrderId, e);
18             return null;
19         }finally{
20             if(rs != null){
21                 try{
22                     rs.close();
23                 }catch(SQLException e){
24                     LogFactory.getTaskLog().error("[close ResultSet SQLException], bizOrderId="+bizOrderId, e);
25                 }
26             }
27             
28             if(ps != null){
29                 try {
30                     ps.close();
31                 } catch (SQLException e) {
32                     LogFactory.getTaskLog().error("[close PreparedStatement SQLException], bizOrderId="+bizOrderId, e);
33                 }
34             }
35             
36             if(conn != null){
37                 try{
38                     conn.close();
39                 }catch(SQLException e){
40                     LogFactory.getTaskLog().error("[close Connection SQLException], bizOrderId="+bizOrderId, e);
41                 }
42             }
43         }
复制代码

 

### 配置 Tomcat 实例以解决 'No Tomcat Instances Are Configured' 报错 在 VS Code 中配置 Tomcat 服务器并解决 `no tomcat instances are configured` 的报错问题,可以通过以下方式实现: #### 安装扩展 首先需要确保已安装支持 Java 和 Tomcat 调试的相关插件。推荐安装 **Java Extension Pack** 插件以及任何其他与 Web 开发相关的工具。 #### 添加 Tomcat 支持 1. 打开 VS Code 并导航到项目的根目录。 2. 创建一个新的文件夹用于存储外部库和资源(例如命名为 `lib` 或者 `servers`),并将解压后的 Tomcat 文件放入此文件夹中[^1]。 #### 修改 launch.json 配置 为了能够通过调试模式启动 Tomcat,需编辑 `.vscode/launch.json` 文件。以下是典型的配置示例: ```json { "version": "0.2.0", "configurations": [ { "type": "java", "name": "Run Tomcat Server", "request": "launch", "mainClass": "org.apache.catalina.startup.Bootstrap", "args": ["start"], "cwd": "${workspaceFolder}/servers/apache-tomcat-9.x/bin", // 替换为实际路径 "env": { "CATALINA_HOME": "${workspaceFolder}/servers/apache-tomcat-9.x" } }, { "type": "java", "name": "Stop Tomcat Server", "request": "launch", "mainClass": "org.apache.catalina.startup.Bootstrap", "args": ["stop"], "cwd": "${workspaceFolder}/servers/apache-tomcat-9.x/bin" // 替换为实际路径 } ] } ``` 上述配置定义了两个命令:一个是用来启动 Tomcat (`Run Tomcat Server`);另一个则是用来停止它(`Stop Tomcat Server`)。务必调整 `cwd` 参数指向具体的 Tomcat bin 目录位置。 #### 停止未正常关闭的 Tomcat 进程 如果之前因为意外退出而导致 Tomcat 没有完全终止,则可能引发端口占用等问题。此时可通过执行如下脚本手动结束进程: ```bash taskkill /F /IM java.exe ``` 或者利用提供的 `shutdown.bat` 来尝试优雅地关闭服务。 #### 测试连接状态 完成以上设置后,在浏览器访问 `http://localhost:8080` 地址验证是否成功部署首页。若显示默认欢迎界面则表明一切正常运作。 另外需要注意的是,当多台 Tomcat 实例共存于同一主机上时,应保证各实例间监听端口号互不冲突,通常情况下 Tomcat 自动检测可用范围内的备用端口来规避此类情况发生[^4]。 最后提醒一点,假如切换至国内镜像源如阿里云造成某些必要组件缺失从而触发错误提示,那么建议重新指定官方仓库链接或是单独获取对应 JAR 包引入工程当中处理相应依赖关系[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值