一、数据库级别限制sql的执行时间
1.参数:statement_timeout
2.介绍:statement_timeout是pgsql的一个参数,用于设置单个SQL语句的执行超时时间。当一个查询执行的时间超过了设定的超时时间,PostgreSQL将终止该查询并返回错误: 由于语句执行超时,正在取消查询命令。
3.做法:
(一)、临时生效
命令:SET statement_timeout = ‘1000’(这种写法是毫秒级,此处是1秒)
或者 SET statement_timeout = ‘1min’(分钟写法)
或者 alter system set statement_timeout = 1000;
给某个角色分配 ALTER ROLE rolename SET statement_timeout = ‘240000’;
注意此参数只在当前会话生效,如果使用navicat不同的查询窗口是不一样的。
(二)、永久生效
如果要永久生效,必须在文件中配置
在postgresql.conf文件,修改statement_timeout参数,然后将其设置为所需的值(以毫秒为单位)。
示例:
statement_timeout = 1000
4.作用
(一)、防止长时间执行,导致数据库性能受到影响
(二)、防止长时间的sql占用大量的资源,可能被用于攻击,导致数据库系统出现卡死崩溃的现象。
5.在分模块中如果要设置不同的statement_timeout ,可在每个模块启动时执行sql,这样就可以给长时间的模块分配更多的查询时间
6.vertx中的做法
定义queryTimeout,设置定时器,当超过所设的时间,就断开连接,此做法,每个sql都可以拥有自己的超时时间。此处只贴核心部分
long timerId = vertx.setTimer(queryTimeout, id -> pgConnection.cancelRequest(ar -> {
if (ar.succeeded()) { 。。。。}
else{
。。。。。
}
}));