JDBC链接回收资源失败导致程序阻塞,使得前端页面一直在加载、前端页面空白、前端http接口请求后status为pending


记录JDBC链接回收资源失败导致程序阻塞,使得前端页面一直在加载(转圈)、前端页面空白(只能展示静态HTML内容,没有对页面进行渲染)、前端http接口请求后status为pending的排查过程及解决方案

本文提到的问题并不一定是JDBC链接阻塞导致,也有可能是Jedis链接阻塞或其他有阻塞情况发生的代码导致


一、场景

1、前端页面一直在加载(转圈)

2、前端页面空白(只能展示静态HTML内容,没有对页面进行渲染)

3、前端http接口请求后status为pending

4、打开前端页面后,应发起的http请求没有发起 (这个情况比较奇特,具体原因未查明,但也是后端程序阻塞引起)

注:以上情况是在程序运行一段时间后才会出现,一旦重启程序则恢复正常,过一段时间后又会再次出现


二、排查

场景1、场景2、场景3都是有发起http请求,通过Debug对接口进行调试

1、通过Debug发现程序在获取JDBC链接时程序阻塞

1.1、JDBC链接队列

//JDBC链接队列
ArrayBlockingQueue<JDBCConnection> m_QueuePool;

1.2、执行以下代码时程序阻塞

//获取JDBC链接
JDBCConnection cnn = m_QueuePool.take();

2、程序已在finally代码块对JDBC资源进行回收,不应该存在链接数不足的情况

if(xxx){
	try {
		xxx;
   	} finally{
		//回收JDBC链接
		m_QueuePool.put(JDBC链接对象);
	}
}

3、释放资源的代码编写有问题,finally写在if中,如果if条件不成立,则资源不会释放。在JDBC链接队列还存有链接数时,程序可以正常运行,在链接数不足时,程序阻塞


三、原因

1、回收JDBC链接的代码写在finally代码块中

2、finally代码块被写在if代码块中

3、由于if条件不成立,导致finally代码块中回收JDBC链接对象的代码没有执行

4、当JDBC链接对象被全部取出后,程序再次获取JDBC链接对象,导致程序阻塞


四、解决

1、使回收JDBC链接对象的代码不受if条件限制

2、使回收JDBC链接对象的代码一定会执行:finally代码块

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可能有多种原因导致前端页面在 network 中一直处于 pending 状态并最终显示接口超时。以下是一些可能的原因: 1. 服务器响应慢:服务器处理请求的时间超过了前端的等待时间,导致前端页面持续处于 pending 状态。这可能是由于服务器负过高、数据库查询缓慢或者其他耗时操作引起的。 2. 网络连问题:前端与后端之间的网络连存在问题,导致请求无法成功完成。这可能是由于网络延迟、网络故障、网络拥堵等原因引起的。 3. CORS(跨域资源共享)问题:如果前端页面和后端接口不在同一个域下,可能会出现跨域请求问题。在某些情况下,浏览器会发送一个预检请求(OPTIONS 请求),如果预检请求失败或超时,前端页面可能无法获取到服务器的响应。 4. 代理设置问题:如果前端通过代理访问后端接口,可能会出现代理设置不正确或代理服务器出现故障的情况。 为了确定具体原因,你可以采取以下步骤来进行排查: 1. 检查服务器日志:查看服务器日志,确认是否有任何错误或异常信息。 2. 检查网络连:使用网络工具(如 ping、traceroute)测试前端与后端之间的网络连,确认是否存在延迟或故障。 3. 检查跨域设置:确认后端是否正确配置了跨域资源共享(CORS),并确保前端请求符合跨域规则。 4. 测试代理设置:尝试直访问后端接口,绕过代理,看是否能够获取到正确的响应。 根据具体情况,你可以进一步深入排查问题并采取相应的解决措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值