SQL拦截:想要限制每次查询的结果集不能超过10000行,该如何实现?

这篇具有很好参考价值的文章主要介绍了SQL拦截:想要限制每次查询的结果集不能超过10000行,该如何实现?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实践出真知,欢迎关注我的公众号:Hoeller

对于一些Saas化软件,当某个租户在执行查询SQL时,如果查询条件出现了BUG,导致去查了所有租户的数据,这种情况是非常严重的,此时就需要在架构层面做限制,禁止一些特殊SQL的执行,另外,为了保护数据库,也可能会限制某些查询语句不要查询太多的数据,那么怎样在平台架构层面对业务层的SQL做拦截和校验呢?本文分享一下我司的做法。

我们集团里有的项目用的Mybatis,有的项目用的Spring Data JPA,共同点在于都用的Druid连接池,所以可以在Druid层面做SQL的拦截和校验。

Druid提供了FilterEventAdapter机制,可以用来拦截数据库连接的创建、Statement或PreparedStatement的创建、SQL语句的执行等等,我们可以自定义一个FilterEventAdapter:
sql 限制条数,java,架构,sql

其中statementExecuteQueryBefore()方法表示在执行某个查询语句前的拦截点,preparedStatement_executeQuery()方法表示执行查询语句的地方,比如正常情况下preparedStatement_executeQuery()方法顺利执行的话就会得到ResultSetProxy,可以理解为就是ResultSet,也就代表查询结果集。

所以如果我们想做查询语句的拦截,这两个方法都可以做到,回到文章题目:想要限制每次查询的结果集不能超过10000行,该如何实现?我这里给两种不同的实现方式。

对于某一个查询SQL,我们首先得知道这个SQL将会查出多少条数据,那就得把该查询SQL,比如select a,b,c from t where a=1,改造成为select count(1) from t where a=1,执行改造后的count语句就能知道原始SQL会查出多少条记录了。

我这里提供一个方法,能够把简单的select语句改造为count语句(原谅我不能把公司内部的代码贴出来~~~)
sql 限制条数,java,架构,sql

然后,我们就能在statementExecuteQueryBefore()方法中做拦截判断了:
sql 限制条数,java,架构,sql

这种方式的好处是:如果某个查询SQL确实超过限制了,那么就它被拦截了,但是缺点是:如果很多SQL并没有超过限制,那么就多余执行了count语句,降低了性能。

那么我们来看看第二种方案,这种方法重写的是preparedStatement_executeQuery方法,思路是:先执行原始SQL,得到ResultSet,然后通过ResultSet来判断结果集是否超过了限制,如果超过了限制则告警,比如代码为:
sql 限制条数,java,架构,sql

这种方案和第一种方案的优缺点正好相反,优点是:没有额外执行count语句,缺点是:如果查询语句确实超过了限制只能事后告警了。

这两种方案似乎鱼和熊掌不可兼得,大家觉得哪个方案更好呢?

我是大都督,之前是一名讲师,现在是一名架构师,实践才能出真知,这是我重回一线的原因!如果大家觉得有所收获,可以关注我的公众号:Hoeller,里面也有我的联系方式,欢迎勾搭。文章来源地址https://www.toymoban.com/news/detail-754360.html

到了这里,关于SQL拦截:想要限制每次查询的结果集不能超过10000行,该如何实现?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis拦截器-打印出真正执行的sql语句和执行结果

    目录 广而告之 背景 先看成品 实现步骤 第一步,实现Interceptor接口 ​编辑 第二步,给拦截器指定要拦截的方法签名 第三步,实现拦截器的intercept方法。 第四步,在mybatis-config.xml里配置上这个拦截器插件 第五步,禁用mybatis打印日志 给大家推荐一个好用的在线工具网站: 常

    2023年04月25日
    浏览(54)
  • 如何在 Python 中执行 MySQL 结果限制和分页查询

    限制结果数量 示例 1: 获取您自己的 Python 服务器 选择 \\\"customers\\\" 表中的前 5 条记录: 如果您想返回从第三条记录开始的五条记录,可以使用 \\\"OFFSET\\\" : 示例 2: 从位置 3 开始,返回 5 条记录 示例 注意:您可以使用JOIN代替INNER JOIN,它们都会给您相同的结果。 在上面的示

    2024年02月05日
    浏览(35)
  • SQL:查询结果升序、降序排列

    SQL 查询时,查询结果按照某一列参数升序或者降序排列后再输出是常见的用法,本文主要介绍了利用 order by 对输出结果进行排序的用法 本文部分内容参考自: SQL37 查找后多列排序 SQL38 查找后降序排列 一句话说明:order by 可以按照降序或者升序对检索结果进行排序 强调:

    2024年02月05日
    浏览(51)
  • MyBatis动态SQL、模糊查询与结果映射

    目录 前言 一、MyBatis动态SQL 1.动态SQL是什么 2.动态SQL的作用 3.常用动态SQL元素 1. where + if 元素 2. set + if 元素 3. choose + when + otherwise 元素 4. 自定义 trim 元素  1. 自定义 trim 元素改写上面的 where + if 语句 2. 自定义 trim 元素改写上面的 set + if 语句 5. foreach 元素 6.SQL片段重用 二、

    2024年02月11日
    浏览(28)
  • SQL - 将查询结果插入到另一张表中

    注意:字段必须一致(位置一致,类型一致),否则会出现数据转换错误。 例如,要将 test 表插入到 newTest 表中,则可以通过如下SQL语句实现: 使用场景: 从一个表中选取数据,然后把数据插入另一个表中。常用于创建表的备份复件或者用于对记录进行存档。

    2024年02月16日
    浏览(33)
  • 「SQL面试题库」 No_80 查询结果的质量和占比

    「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试,代码能力和工作效率也会有明显提升。 1.1 活动流程 整理题目 :西红柿每天无论刮风下雨

    2024年02月09日
    浏览(28)
  • Springboot 自定义 Mybatis拦截器,实现 动态查询条件SQL自动组装拼接(玩具)

    ps:最近在参与3100保卫战,战况很激烈,刚刚打完仗,来更新一下之前写了一半的博客。 该篇针对日常写查询的时候,那些动态条件sql 做个简单的封装,自动生成(抛砖引玉,搞个小玩具,不喜勿喷)。 来看看我们平时写那些查询,基本上都要写的一些动态sql:   一个字段

    2024年02月12日
    浏览(39)
  • MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射,让你在面试中脱颖而出!!

    目录 一、引言 二、MyBatis动态SQL 2.1.if元素使用 2.2.foreach元素使用 三、MyBatis模糊查询 ①使用#{字段名} ②使用${字段名} ③使用concat{\\\'%\\\',#{字段名},\\\'%\\\'} 总结 四、MyBatis结果映射 4.1.案例演示 4.1.1.resultType进行结果映射 4.1.2.resultMap进行结果映射 在当今的软件开发环境中,数据库的使

    2024年02月11日
    浏览(37)
  • axios拦截器:每次请求自动带上 token

    Step 1:创建Axios实例并添加拦截器 在你的Vue项目中,一般我们会先导入axios,然后创建一个axios实例。这样做是为了方便统一管理和配置。 上面的代码做了什么呢? 1. 我们创建了一个axios实例service,相当于有了一个专属邮差。 2. 给这个邮差设置了规则:每次出门送信前,先检

    2024年04月09日
    浏览(41)
  • Python3,多种方法,同时执行多条SQL语句,并把查询结果分别写入不同Sheet页,妥妥的学到了。

    小屌丝 :鱼哥,我想请教一个问题。 小鱼 :国庆假期你经历了什么,让你变得如此的 “ 善良 ”? 小屌丝 :别这么说,我一直很善良,至少,很正直… 小鱼 :打住,直接点, 你有什么需要帮助的? 小屌丝 :我就是想把查询的结果也入到excel表中 小鱼 :然后呢? 小屌丝 :

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包