• typeorm 批量插入数据优化和插入冲突操作


    d本文主要记录一下批量插入数据的优化。

    一、批量插入

    首先能实现批量插入在typeorm中有save、insert和createQueryBuilder 这三种都可以。

    根据官网上介绍的

    You can create INSERT queries using QueryBuilder. Examples:

    1. await dataSource
    2. .createQueryBuilder()
    3. .insert()
    4. .into(User)
    5. .values([
    6. { firstName: "Timber", lastName: "Saw" },
    7. { firstName: "Phantom", lastName: "Lancer" },
    8. ])
    9. .execute()

    This is the most efficient way in terms of performance to insert rows into your database. You can also perform bulk insertions this way.

    这是一个非常搞笑的批量插入。但是我们发现如果我插入500条数据还会在操作日志中,还有跟着500条select 查询对应插入数据的id。加入我们不需要这个id的话 我们是可以关闭这个select的

    1. entityManager
    2. .createQueryBuilder()
    3. .insert()
    4. .into("user")
    5. .values(users)
    6. .updateEntity(false)
    7. .execute();

    或者save操作的时候增加参数{ reload: false }。

    二、插入如果出现冲突的操作

    有的时候在并发情况下插入数据会出现Duplicate entry '6' for key 'PRIMARY 主键冲突。

    当然了 如果加分布式锁也会有一定影响。

    1. 加分布式锁也可能会影响消费者的消息处理速度。
    2. 消费者依赖于redis,如果redis出现网络超时,我们的服务就悲剧了。

    如果对业务影响不是很大的话 可以考虑使用下面的语句。

    1. await connection.createQueryBuilder()
    2. .insert()
    3. .into(Post)
    4. .values(post2)
    5. .onConflict(`("id") DO NOTHING`)
    6. .execute();
    7. await connection.createQueryBuilder()
    8. .insert()
    9. .into(Post)
    10. .values(post2)
    11. .onConflict(`("id") DO UPDATE SET "title" = :title`)
    12. .setParameter("title", post2.title)
    13. .execute();

     对应的sql语句

    1. INSERT INTO table (column_list)
    2. VALUES (value_list)
    3. ON DUPLICATE KEY UPDATE c1 = v1, c2 = v2,...;
  • 相关阅读:
    关于建立开放的学术论文共享平台的倡议
    Linux安装haproxy
    Citus 分布式 PostgreSQL 集群 - SQL Reference(手动查询传播)
    央国企、金融信创改造必备的Windows AD域控国产替代方案
    【学习笔记】用线段树维护区间计数问题
    算法通关村第十六关青铜挑战——原来滑动窗口如此简单!
    推荐云盘哪个好,各有各的优势
    矩阵分析与应用-06-概率密度函数01
    Matlab之创建空数组的多种方法汇总
    MySQL进阶查询
  • 原文地址:https://blog.csdn.net/xiangzaixiansheng/article/details/126228014