关于数据库的SQL超时实现策略

简介: 在执行SQL的时候,有可能需要限制SQL的最长执行时间。这个限制在JDBC和.NET Data Provider中分别通过下面两个方法设置。 其他数据库驱动可能也有类似的参数。 Statement.setQueryTimeout() DbCommand.CommandTimeout() 这个功能是很简单的,但是如何实现这个超时呢?不同的数据库驱动,可能会采取不同的方法。
在执行SQL的时候,有可能需要限制SQL的最长执行时间。这个限制在JDBC和.NET Data Provider中分别通过下面两个方法设置。
其他数据库驱动可能也有类似的参数。
  • Statement.setQueryTimeout()
  • DbCommand.CommandTimeout()
这个功能是很简单的,但是如何实现这个超时呢?不同的数据库驱动,可能会采取不同的方法。我接触过几个驱动,大致有下面几种方法。

1)在客户端进行超时控制
客户端驱动通过设置Socket数据接受超时或者在另一个线程里开一个定时器进行超时判断。当检出SQL超时时取消正在执行的SQL。
使用这种方法的前提是服务端支持SQL取消功能。取消SQL的请求是不能直接用原来的连接往服务端发的,因为这个连接已经被这个正在执行的SQL占据了,所以驱动内部必须新开一个Socket。取消SQL有一种极端的情况,由于发出取消请求的时刻和取消请求真正被执行的时刻之间有个时间差。在这个时间差里,有可能你想取消的SQL已经执行完毕,并且对应的物理连接回池,然后有新的连接拿到这个物理连接之后开始执行新的SQL。于是诡异的事情发生了,一个正常的SQL被莫名其妙的取消了。我们就曾遇到过这么变态的bug。
PostgreSQL的JDBC驱动pgjdbc就是这么干的。印象中Oracle和MySQL好像也是这么干的。

2)在服务端进行超时控制
驱动把超时参数发给服务端,由服务端处理超时,并把超时错误反馈给客户端。

这种方法通常工作得很好,但无法应付服务端或者网络故障。当发生故障时,客户端可能会在那儿一直傻等。
印象中SQL Server好像是这么干的。

3)客户端和服务端同时进行超时控制
除此1和2外,还有一种组合的方案,这就是PostgreSQL的.NET驱动Npgsql的实现。这也是本人见到过的最好的方案。
Npgsql通过向服务端发送statement_timeout参数让服务端进行超时控制,同时为了防止出现故障又在驱动里设置了一个计时器。但这个计时器的超时时间比用户设置的多5秒,所以驱动中的计时器可以在服务端超时机制失效的5秒之后挺身而出。


相关文章
|
14天前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
157 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
13天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
13天前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
29天前
|
SQL 关系型数据库 MySQL
MySQL数据库连接过多(Too many connections)错误处理策略
综上所述,“Too many connections”错误处理策略涉及从具体参数配置到代码层面再到系统与架构设计全方位考量与改进。每项措施都需根据具体环境进行定制化调整,并且在执行任何变更前建议先行测试评估可能带来影响。
423 11
|
1月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
98 8
|
2月前
|
SQL 人工智能 Java
用 LangChain4j+Ollama 打造 Text-to-SQL AI Agent,数据库想问就问
本文介绍了如何利用AI技术简化SQL查询操作,让不懂技术的用户也能轻松从数据库中获取信息。通过本地部署PostgreSQL数据库和Ollama模型,结合Java代码,实现将自然语言问题自动转换为SQL查询,并将结果以易懂的方式呈现。整个流程简单直观,适合初学者动手实践,同时也展示了AI在数据查询中的潜力与局限。
204 8
|
18天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
4月前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
292 62
|
2月前
|
缓存 关系型数据库 MySQL
MySQL数据库性能调优:实用技术与策略
通过秉持以上的策略实施具体的优化措施,可以确保MySQL数据库的高效稳定运行。务必结合具体情况,动态调整优化策略,才能充分发挥数据库的性能潜力。
118 0

热门文章

最新文章