如何停止超时的DB查询

[DolphinScheduler]任务实例状态异常排查与修复指南 本文详细解析了DolphinScheduler中任务实例状态异常的常见现象及原因,包括系统中断、资源竞争、网络问题等,并提供了系统化的排查步骤和手动修复方法。通过实际案例分享,帮助用户有效解决工作流实例和任务实例状态不同步的问题,提升调度系统的稳定性。 阅读详情

一.问题:有时我们执行的DB查询(例如一些查询的存储过程)会时间太长,当我们的代码逻辑上不想等待这么长时间时,怎么删除呢?

 

二.思考:首先想到使用"select connectionId()",然后通过"kill query id"语句来删除掉对应的DB进程.后来发现JdbcTemplate里面CallableStatement的cancel()可以关掉存储过程的调用.那么我们可以结合Timer来计时,当超过N分钟后,就执行cancel()即可.

 

三.代码:

1.定义一个task:(可以配合connectionId来做追踪,虽然逻辑上没有使用上)

public class CustomTimeTask extends TimerTask {
	private static final Logger logger = LoggerFactory.getLogger(CustomTimeTask.class);
	
	CallableStatement cs ;
	int id;
	
	public CustomTimeTask(CallableStatement cs, int id) {
		super();
		this.cs = cs;
		this.id = id;
	}

	@Override
	public void run() {
		try {
			logger.info("[Timeout]TimeTask try to cancel the long time procedure query. Connection ID is [{}]", id);
			cs.cancel();
		} catch (Exception e) {
			logger.error("[Timeout]TimeTask fail to cancel the long time procedure query. Please check the if the query has been stopped in database. "
					+ "The connection ID is [{}]", id);
		}
	}

}

 

2.执行:

logger.debug("-----------Start to call CSV store procedure------------");
		Connection conn = null;
		CallableStatement cs = null;
		ResultSet rs = null;
		
		Timer timer = null;
		boolean isQuery = false;
		
	......
		try{
			conn = jdbcTemplate.getDataSource().getConnection();
			cs = conn.prepareCall(foo);
			....
			
			isQuery = true;
			int queryTimeoutMins = SystemConfig.getQueryTimeout();
			if(queryTimeoutMins>0) {
				logger.debug("Execute the statemnet to call procedure  to connection ID [{}]. "
					+ "And start the timer to cancel the timeout query. Timeout setting [{} minutes]"
						,conID,queryTimeoutMins);
				CustomTimeTask customTimeTask = new CustomTimeTask(cs, conID);
				timer = new Timer();
				timer.schedule(customTimeTask, queryTimeoutMins * 60 * 1000);
			}else {
				logger.debug("Execute the statemnet to call procedure to gen CSV record to connection ID [{}]. "
						+ "But not start the timer to cancel the timeout query because timeout setting is [{} minutes]"
						,conID,queryTimeoutMins);
			}
			
			cs.execute();
			if(timer != null) {
				logger.debug("The query for connection ID [{}] is completed. "
					+ "Cancel the timer and begin to get the resultSet. ",conID);
				timer.cancel();
				timer.purge();
			}else {
				logger.debug("The query for connection ID [{}] is completed. Begin to get the resultSet.",conID);
			}
			isQuery = false;
			
			rs = cs.getResultSet();
			
			.........
			
			...........
			
			rs.close();
		}catch (DataAccessException e) {
			dbLogger.error("DB is down. Exception is [{}]", e.getMessage());
			try {
				if(isQuery && cs!=null && !cs.isClosed()) {
					logger.info("Program has begun the query. Try to cancel the procedure query for connection ID [{}]"
							, conID);
					cs.cancel();
				}
				
			} catch (MySQLStatementCancelledException e1) {
				logger.info("Successfully cancel the procedure query for connection ID [{}]"
						, conID);
				if(timer != null) {
					timer.cancel();
					timer.purge();
				}
				isQuery = false;
			} catch (Exception e1) {
				logger.error("-- Error occur when try to cancel the query for connection ID[{}]. "
						+ "Exception is [{}].",conID, e.getMessage());
			}
			throw e;
			
		} catch (MySQLStatementCancelledException e) {
			logger.info("Successfully cancel the procedure query for connection ID [{}]"
					, conID);
			if(timer != null) {
				timer.cancel();
				timer.purge();
			}
			isQuery = false;
			return null;
		}catch (Exception e) {
			logger.error("-- Error occur, exception is [{}]", e.getMessage());
			logger.error("DB: error:", e);
			try {
				if(isQuery && cs!=null && !cs.isClosed()) {
					logger.info("Program has begun the query. Try to cancel the procedure query for connection ID [{}]"
							, conID);
					cs.cancel();
				}
				
			} catch (MySQLStatementCancelledException e1) {
				logger.info("Successfully cancel the procedure query for connection ID [{}]"
						, conID);
				if(timer != null) {
					timer.cancel();
					timer.purge();
				}
				isQuery = false;
			} catch (Exception e1) {
				logger.error("-- Error occur when try to cancel the query for connection ID[{}]. "
						+ "Exception is [{}].",conID, e.getMessage());
			}
			
			return null;
		}finally {
			try {
				if (rs != null)
					rs.close();
				if (cs != null)
					cs.close();
				if (conn != null) {
					conn.close();
				}
			} catch (Exception e) {
				logger.error("Error occurs when close the connection to database. Error:", e);
				return null;
			}
			
		}
		logger.debug("-----------End to call store procedure------------");
		return resultMap;
	}

 

有几个地方值得注意,省略号的地方就正常cs执行存储过程的处理.但是对于timer要做判断:

1.如果查询结束了,那就没必要等待schedule了,要把timer取消掉

2.如果DB错误,判断是否在查询并且确定cs是否close,否则要调用cs.cancel()来结束

3.同时,注意cs.cancel()后,timer有没有结束

Apache DolphinScheduler深度解析——从源码看流程实例的优雅停止与暂停机制 本文深度解析Apache DolphinScheduler中流程实例的优雅停止与暂停机制,通过源码分析揭示其分布式调度系统的核心设计。文章详细探讨了基于Netty的RPC通信、状态机与线程协同等关键技术,对比了停止与暂停操作的不同实现路径,并提供了性能优化与实践建议,帮助开发者更好地理解和应用这一分布式调度系统。 阅读详情

相关推荐

以太网物理层协议整理(2)-万兆以太网

在万兆以太网标准化过程中,IEEE和10GEA(万兆以太网联盟)是两个最重要的组织。 万兆以太网标准和规范都比较繁多,在标准方面,首先有2002年的IEEE 802.3ae,后来也不断有新的万兆以太网规范推出,如2006年的IEEE 802.3an标准(10GBase-T)就推出了基于双绞铜线的万兆以太网规范,同样的IEEE 802.3aq标准推出了基于光纤的10GBase-LRM;2007年的

NowOrNever 3万+

DBCP 应用的总结(一)

DBCP 应用的总结 1.Jar包下载 首先,下载必须的jar包  dbcp包:http://jakarta.apache.org/commons/dbcp/  pool包:http://jakarta.apache.org/commons/pool/,  如果下载的pool包是1.2的版本,还要下载common-collections包: 2.配置参数

fover717的专栏 1万+

openEuler 快速入门

openEuler 是一个专注于企业领域的 Linux 发行版,广泛应用于服务器、云计算和边缘计算场景。最初由华为开发,现在由 Open Atom Foundation 进行开发和管理。Open Atom Foundation 是中国第一个开源软件基金会,得到了华为、阿里巴巴、腾讯、百度等知名企业的支持,并且中国信息通信部也是该基金会的一部分。可以将 openEuler 看作是 Red Hat 或 SUSE Linux 的等价物,但它与 SUSE Linux 更为相似。

HuaweiLab_Peach的博客 2054

聊聊mysql jdbc的queryTimeout及next方法

序 本文主要介绍一下mysql jdbc statement的queryTimeout及resultSet的next方法 executeQuery() mysql-connector-java-5.1.43-sources.jar!/com/mysql/jdbc/PreparedStatement.java /** * A Prepared SQL query is executed a...

weixin_34290096的博客 456

ArcGIS基础:点要素分割线要素和提取线要素的交点

第一个实验:【点要素分割线要素】看下原始数据:下图所示,2个红点和一条绿线,用2个点去分割这条线。 找到【数据管理工具】,在找到【要素】,再找到【在点处分割线】,如下图所示。 输入线、点要素,然后在【搜索半径】里输入5米,查看一下结果。 查看结果发现,线段被分割了2段,我们查看一下原因。 发现第2个点与线有一段距离,肯定是大于5米的,所以分割没有成功。可以量测一下距离,重新输入搜索半径。 我们把搜索半径改为200米,勘察结果,被点分割了3段。 接下来使用另外一个工具【在折点处分割线】,如下所示。

yuanYW7556的博客 1万+

LTSPICE仿真电路:(二十八)三极管厄利电压与输出特性曲线深度解析

本文深入解析了LTSPICE仿真电路中三极管的厄利电压与输出特性曲线,详细介绍了厄利电压的物理意义、仿真设置及实际应用。通过伏安特性曲线和厄利电压的分析,帮助读者理解三极管放大性能的关键参数,并提供了电路设计中的优化方案和故障排查技巧。

weixin_26899659的博客 149

oracle querytimeout,Oracle 11g 超时问题的处理办法

Oracle 11g 超时问题的处理办法在Oracle 11G中如果一个与Oracle的通讯,长时间空闲,Oracle会将其识为Timeout,主动Kill这个Session。如何你的应用端编写的程序不能提供自动重连的功能,这样的场景你需要做以下的配置以避免应用不可用。具体如下: 按官方文档所说,原则上INBOUND_CONNECT_TIMEOUT_listener_name应小于INBOUND_...

weixin_36080939的博客 1527

Miniforge3部署教程,完美替代Anaconda3

大背景不介绍了,哎!直接上教程!

zzy_ucas的博客 1万+

mysql中QueryTimeOut_MySQL JDBC的queryTimeout坑

遇到一个MySQL JDBC跑execute规定的方法queryTimeout坑,更恶心,无论是BUG,不能,^_^,为什么要说?请看下面的说明:现象:用同一个Connection运行大批量SQL的时候,导致了OOM现象。细节现象描写叙述:1、SQL是从某个存储设备上拿到的,不会直接占用大量的内存,每次仅仅会取最多1千条数据过去,也会判定容量不超过多少M。2、每一批SQL运行会单独创建Statem...

weixin_28677451的博客 4267

离线AI实战指南:本地部署大模型处理PDF/Word/Excel

离线AI是指在无网络、不上传数据前提下,于个人设备运行大语言模型并完成文档理解、多轮对话与代码辅助等任务的技术方案。其核心依赖本地模型推理、文档解析向量化和轻量级对话调度三大能力。随着Phi-3、Qwen2、Llama3等轻量化开源模型普及,以及Ollama、LM Studio等易用工具成熟,普通用户已可在主流笔记本上实现PDF摘要、合同比对、代码注释等真实办公场景。本文聚焦离线AI的硬件适配、模型选型、文件处理链路与知识库构建,尤其强调中文OCR支持、结构化文档提取与CPU/GPU混合推理优化,助力非开发

weixin_31968639的博客 495

Zabbix在Ubuntu 22.04上的性能优化与监控实战:从基础安装到高级配置

本文详细介绍了在Ubuntu 22.04系统上部署和优化Zabbix监控系统的完整流程,从基础安装到高级配置。内容包括MySQL数据库设置、Zabbix服务器与Web前端优化、性能调优策略以及实战监控场景应用,帮助用户构建高效的企业级监控解决方案。

sss66的博客 895

mysql 执行超时处理逻辑分析

出现mysql 异常:com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request 如何模拟? 通过cmd 窗口 mysql -uroot -p 登录mysql 查看自己事务隔离级别以及修改自动提交。 SELECT @@global.tx_isolation; select @@autocommit; set autocommit = 0; 执行命令开启事.

代码缔造者的博客 3226

基于 YOLOv26 的 PCB 板缺陷检测:工业级视觉实战

本文提出了一种基于YOLOv26的PCB板缺陷检测系统,通过深度学习技术实现对PCB板缺陷的自动化检测。系统能够识别短路、开路、焊点不良等8种常见缺陷,具有高精度、多类别分类和实时推理等优势。文章详细介绍了系统架构,包括数据采集、预处理、YOLOv26模型检测和后处理模块。在代码实现部分,给出了环境配置、数据预处理与增强的具体方法,使用Albumentations库进行图像增强处理。该系统为电子制造业提供了高效、准确的PCB质量检测解决方案,显著提升了检测效率和准确性。

一键难忘的博客 339

java mysql 查询超时_java请求action超时,怎么停止mysql继续查询数据库?

慕容森贴个Statement.cancel()的文档:/** Cancels this Statement object if both the DBMS and driver support aborting an SQL statement. This method can be used by one thread to cancel a statement that...

weixin_34443842的博客 402

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

hibernate里可以设置查询数据库,超过8s就不再执行查询了?

我现在想实现这样的功能,查询数据库时,执行时间超过8秒,就不再继续查了。跳到提示页面

songdan_79 154

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ORA-02049: 超时: 分布式事务处理等待锁诊断

正式环境有两个数据库A和B,在A库上建的dblink,业务是要将A库中的一些表,通过dblink更新到B库中去,更新的时候总是报错:ORA-02049: 超时: 分布式事务处理等待超时。     之前我写过一篇blog:ORA-02049: 超时: 分布式事务处理等待锁模拟,大致的意思是通过A更新B中的数据时,由于B库中的数据有锁,一直都不释放,导致通过A更新报错。 诊断如下: 在B库上执行

关注系统性能调优 3945

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

mysql

//登陆 mysql -uroot  mysql -uroot -p   进入mysql //导入 mysql>source /home/abc/abc.sql; //启动&停止 cd /var/lib/mysql rm -f /var/lib/mysql/mysql.sock;  //先删除再重新启动 1.启动:/etc/ini

liangmaoxuan的专栏 492

问题解决:Mysql数据库链接时报错The last packet sent successfully to the server was 0 milliseconds ago.

其中mysql_sever_name是指mysql服务在我们电脑上面的服务名,大多数为mysql,但是如果你的电脑下载的是MySQL8.0及8.0以上的版本,此时你应该是mysql服务名应该是mysql80。虽然datagrip会在我们new了一个project的时候让我们输入我们电脑中安装的mysql服务的url,端口,以及用户名和密码,并且在我们测试链接时也仅仅只是和mysql服务进行了简单的通信,而不会开启mysql服务。2.有任何问题可以在评论区留言噢,我们可以一起探讨和解决!

Vener_Xie的博客 4384

执行 DB2 reorgchk

执行 DB2 reorgchk db2 reorgchk 命令是最重要的、也是经常被忽略的 DB2 调整命令之一。 db2 reorgchk 命令被忽略是因为它不是一个一次性调整项。由于更新是在 DB2 数据库上执行的,因此关于表的统计信息将不会是最新的。db2 reorgchk 命令更新 DB2 优化器所使用的重要统计信息。建议在大约每 10,000 次更新后重复 db2 reorgchk 命...

iteye_11359的博客 272

Oracle连接数满问题解决及排查 ORA-00020:maximumnumber of processes

测试环境功能验证过程中,测试反馈页面数据加载缓慢,接口查询超时的情况。

qq_41814311的博客 3017

oracle 实例死掉,Oracle 监听莫名死掉

有一台oracle 10g的监听莫名死掉,进行查看select * from v$versionOracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64biselect status,count(*) from v$session group by status order by count(*) desc;查看链接的sessio...

weixin_34094282的博客 518

mysql超时退出_超时-如果时间太长,如何停止MySQL查询?

超时-如果时间太长,如何停止MySQL查询?在MySQL中可以使查询超时吗?也就是说,如果任何查询超过我指定的时间,它将被MySQL终止,并且将返回错误而不是等待永恒。acheruns asked 2020-07-26T21:09:21Z9个解决方案10 votesCPAN上有一个不错的Perl脚本可以做到这一点:[http://search.cpan.org/~rsoliv/mysql-geno...

weixin_36190812的博客 1380

mysql 数据库连接超时时间查询、修改

查询连接超时时间 SHOW [GLOBAL] VARIABLES LIKE '%timeout%'; 查询所有带 timeout 的变量。 带[GLOBAL] 参数时,查询全局变量,不带[GLOBAL]查询当前session的变量。 wait_timeout — 指的是mysql在关闭一个非交互的连接之前所要等待的秒数,其取值范围为1-2147483(Windows),1-3153600...

NeilsChen的博客 7112

JAVA 超时中断处理

笔者在平常的项目开发中,会遇到有些程序执行时间过长的问题(比如查询数据库的时间过长,或者调用某一接口执行的时间过长),导致程序长时间卡死,因此,需要对程序进行超时中断处理,给程序的执行时间设定一个时间范围限制,如果超过这一范围,则进行中断处理。      下面将介绍两种超时中断处理的实现方法,方法一是本人自己实现的,方法二则利用JDK自带的工具类。   1、方法一 import java.

brushli的专栏 4923

yii2 oracle the table does not exist,Yii2 oracle 11g gii relations timeout

问题I have:Windows Server 2012 R2wampserver 3.0.6 64bityii2php_oci8_12c enabled,php_pdo_oci enabled,oracle instantclient-basiclite-windows.x64-12.1.0.2.0System Path defined accordingadded mod_fcgid 2.3....

weixin_31101725的博客 241
上一篇: (转)[Spring Boot]swagger导出API文档
下一篇: [DB]如何在linux安装mysql8.0以及常用命令
jameskaron
博客等级 码龄20年 31粉丝 663原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值