云数据库 RDS-使用rds_pg_sql_ccl插件:绑定变量的SQL限流

时间:2024-09-19 16:44:41

绑定变量的SQL限流

JDBC等驱动支持prepare statement,对参数化SQL进行预编译,在输入参数后实际执行SQL。在pg_stat_statements视图中会以绑定变量的方式呈现。对于参数是绑定变量的SQL,内核计算的query id值与参数为实际值的SQL不一致,因此无法直接通过添加SQL语句方式进行限流。

对于这类SQL而言,只能通过实际执行后手动添加的方式进行限流。

  1. 首先实际执行一次带绑定变量的SQL,这样内核会计算其query id。基于JDBC的prepare statement程序示例如下:
    String sql = "select pg_sleep(?);";
    PreparedStatement preparedStatement = conn.prepareStatement(sql);
    preparedStatement.setInt(1, 500);
    ResultSet resultSet = preparedStatement.executeQuery();
  2. 而后在pg_stat_statements视图可以查询到该SQL的query id。
    select queryid from pg_stat_statements where query like '%select pg_sleep%';
  3. 通过查询到的query id添加限流规则。
    select rds_pg_sql_ccl.add_ccl_rule_by_queryid($queryid);
  4. 通过上一条SQL的返回值(rule_id)使该规则生效。
    select rds_pg_sql_ccl.enable_ccl_rule($rule_id);
  5. 从插件提供的get_all_enabled_rule视图可以获取到当前所有生效的限流规则。
    select * from rds_pg_sql_ccl.get_all_enabled_rule;
support.huaweicloud.com/usermanual-rds/rds_09_0073.html