当前位置: 首页 > article >正文

开发指南094-in语句的处理

      微服务架构下,提倡数据库分布,也就是按照业务把数据库分成多个;同时提倡一个微服务只链接一个数据库。这种情况下跨库关联就成了一个问题。尽管从性能考虑不提倡in语句,但是也没有特别好的方法。

       一般情况下是这样处理跨库关联(不一定是sql库,也可能非sql库):前端通过一个微服务接口获取关键字字符串,‘A’,'B','C'...然后作为参数调用另一个服务。这时该服务就不可避免使用in语句了。但是数据库这边对in的参数数量有限制,而且测试表明,拆分成多个or,比直接用in要快。

     根据这些,底层提供了CommonsUtil.splitInSql函数:

public static String splitInSql(String[] ids, String fieldName) {
    StringBuffer sqlStr = new StringBuffer();
    if (ids == null || ids.length == 0 || fieldName == null || "".equals(fieldName))
        return null;
    int len = ids.length;
    int num = 1;
    if (len > 500)
        num = (len % 500 == 0) ? len / 500 : (len / 500) + 1;
    int j = 0;
    int i = 1;
    Hashtable hash = new Hashtable();
    for (; i <= num; i++) {
        StringBuffer sb = new StringBuffer();
        String str = "";
        for (; j < i * 500 && j < len; j++) {
            if (ids[j] == null || "".equals(ids[j]) || hash.containsKey(ids[j])) continue;
            sb.append("'")
                    .append(ids[j])
                    .append("',");
            hash.put(ids[j], "");
        }
        str = sb.toString();
        str = str.substring(0, str.length() - 1);
        sqlStr.append("or ").append(fieldName).append(" in (").append(str).append(") ");
    }
    hash.clear();
    hash = null;
    if (sqlStr.length() > 0) {
        sqlStr.delete(0, 2);
        return "(" + sqlStr.toString() + ")";
    } else
        return "(" + fieldName + " in (''))";
}


http://www.kler.cn/a/532676.html

相关文章:

  • 【Java】位图 布隆过滤器
  • 介绍一下Mybatis的Executor执行器
  • Python网络自动化运维---批量登录设备
  • 数组排序算法
  • 我的创作纪念日
  • Vue 3 30天精进之旅:Day 13 - 路由守卫
  • Maven(Ⅱ):依赖范围,依赖传递,依赖阻断,可选依赖
  • 10分钟本地部署Deepseek-R1
  • Laravel Validation validated() 的实现
  • Selenium记录RPA初阶 - 基本输入元件
  • js --- 获取随机数
  • 预防和应对DDoS的方法
  • 【力扣】283.移动零
  • springboot后台系统开发(三)- 日志
  • 【OS】AUTOSAR架构下的Interrupt详解(上篇)
  • 某某音乐歌单下载(电脑)
  • 物联网领域的MQTT协议,优势和应用场景
  • spark君第一篇图文讲解Delta源码和实践的文章
  • C基础寒假练习(8)
  • ioDraw桌面版 v3.4.0发布!AI文生图,AI图生图,手绘风格一键转换!
  • 37、【OS】【Nuttx】OSTest分析(2):任务创建
  • 深入探索Vue 3组合式API
  • 实例研究:设计一个文档编辑器(1)
  • 有用的sql链接
  • 调用DeepSeek API实现对本地数据库的AI管理
  • 手扶电梯缺陷检测数据集VOC+YOLO格式67张1类别