码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 通过Java定时取消Greenplum的慢查询



    重点来啦,直接上干货,走起

    1. package cn.xhh.monitor.task;
    2. import java.time.LocalDate;
    3. import java.time.LocalTime;
    4. import java.util.Date;
    5. import java.util.List;
    6. import java.util.Map;
    7. import java.util.concurrent.Executors;
    8. import java.util.concurrent.ScheduledExecutorService;
    9. import java.util.concurrent.TimeUnit;
    10. import javax.annotation.PostConstruct;
    11. import javax.annotation.Resource;
    12. import com.google.common.base.Strings;
    13. import lombok.extern.slf4j.Slf4j;
    14. import org.springframework.jdbc.core.CallableStatementCallback;
    15. import org.springframework.jdbc.core.JdbcTemplate;
    16. import org.springframework.stereotype.Component;
    17. @Component
    18. @Slf4j
    19. public class AutoCancelSlowSql {
    20. @Resource
    21. private JdbcTemplate redshiftJdbcTemplate;
    22. @Resource
    23. private JdbcTemplate mysqlJdbcTemplate;
    24. @PostConstruct
    25. public void init() {
    26. execute();
    27. executeProduction();
    28. log.info("定时取消慢查询任务开始执行,周期30秒钟");
    29. }
    30. public void execute() {
    31. Runnable runnable = new Runnable() {
    32. public void run() {
    33. int hour = LocalTime.now().getHour();
    34. log.info("当前小时:{}。", hour);
    35. if (hour < 5) {
    36. return;
    37. }
    38. log.info("取消慢查询任务执行");
    39. try {
    40. // 超过3分钟的查询,取消掉
    41. String querySlowSql = "select pid, (now() - query_start) as exec, query from pg_stat_activity where pg_stat_activity.query <> ''::text AND pg_stat_activity.state <> 'idle'::text and (now() - query_start) > '00:03:00';";
    42. cancelActiveSql(querySlowSql);
    43. // 清除活跃session,超过10分钟的就kill掉
    44. String querySessionSql = "select pid, (now() - query_start) as exec, query from pg_stat_activity where usename not in ('gpadmin', 'gpmon') and (now() - query_start) > '00:05:00' order by now() - query_start desc limit 10";
    45. cancelActiveSql(querySessionSql);
    46. // 清除vacuum full 超过1小时就kill掉
    47. String queryVacuumSql = "select pid, (now() - query_start) as exec, query from pg_stat_activity where usename = 'gpadmin' and (now() - query_start) > '01:00:00' and query like 'vacuum full%';";
    48. cancelActiveSql(queryVacuumSql);
    49. } catch (Exception e) {
    50. log.error("定时取消慢查询任务出错:" + e.getMessage());
    51. }
    52. }
    53. };
    54. ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    55. // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
    56. service.scheduleAtFixedRate(runnable, 30, 30, TimeUnit.SECONDS);
    57. }
    58. private void cancelActiveSql(String querySql) {
    59. List> slowSqlList = redshiftJdbcTemplate.queryForList(querySql);
    60. if (slowSqlList.size() > 0) {
    61. slowSqlList.forEach(result -> {
    62. try {
    63. String pid = result.get("pid").toString();
    64. String query = result.get("query").toString();
    65. Object exec = result.get("exec");
    66. if (exec != null && !exec.toString().equals("")) {
    67. log.info("canal sql pid : {}, exec {}.", pid, exec);
    68. String sql = null;
    69. if (!Strings.isNullOrEmpty(query) && query.toLowerCase().trim().startsWith("select")) {
    70. sql = "select pg_cancel_backend( ? )";
    71. } else {
    72. sql = "select pg_terminate_backend( ? )";
    73. }
    74. redshiftJdbcTemplate.execute(sql, (CallableStatementCallback) cs -> {
    75. cs.setInt(1, Integer.parseInt(pid));
    76. cs.execute();
    77. return cs;
    78. });
    79. log.info("取消慢查询:" + pid + ":" + query);
    80. }
    81. } catch (Exception e) {
    82. log.error("error:{}", e);
    83. }
    84. });
    85. }
    86. }
    87. public void executeProduction() {
    88. Runnable runnable = new Runnable() {
    89. public void run() {
    90. log.info("调度productionLevel");
    91. String queryProductionLevel =
    92. "select company_id,level,source from production_level where level = 31";
    93. List> queryForList =
    94. mysqlJdbcTemplate.queryForList(queryProductionLevel);
    95. redshiftJdbcTemplate.execute("drop table if exists productionLevel");
    96. redshiftJdbcTemplate
    97. .execute("create table productionLevel(company_id int4,level text,source text)");
    98. queryForList.forEach(i -> {
    99. redshiftJdbcTemplate
    100. .update("insert into productionLevel values(?,?,?)", new Object[]{i.get("company_id"),
    101. i.get("level"), i.get("source")});
    102. });
    103. }
    104. };
    105. ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    106. // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
    107. service.scheduleAtFixedRate(runnable, 1, 60, TimeUnit.MINUTES);
    108. }
    109. }
    110. 相关阅读:
      笔记,ASCII和unicode
      Android切换主题生命周期流程与onSaveInstanceState和onRestoreInstanceState,Kotlin
      vulnhub靶场之EVILBOX: ONE
      【Java】VS Code配置java环境
      Linux文件系统——文件系统、挂载点、目录结构
      CentorOS上安装elasticsearch7.17.3,不用docker方式
      LeetCode 496. Next Greater Element I
      php jquery ajax 无法传递POST值的问题
      容器-基础
      Jenkins系列-安装maven
    111. 原文地址:https://blog.csdn.net/u010953816/article/details/126760368
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号