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

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

一、批量插入

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

根据官网上介绍的

You can create INSERT queries using QueryBuilder. Examples:

await dataSource
    .createQueryBuilder()
    .insert()
    .into(User)
    .values([
        { firstName: "Timber", lastName: "Saw" },
        { firstName: "Phantom", lastName: "Lancer" },
    ])
    .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的

entityManager
  .createQueryBuilder()
  .insert()
  .into("user")
  .values(users)
  .updateEntity(false)
  .execute();

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

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

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

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

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

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

await connection.createQueryBuilder()
        .insert()
        .into(Post)
        .values(post2)
        .onConflict(`("id") DO NOTHING`)
        .execute();

await connection.createQueryBuilder()
        .insert()
        .into(Post)
        .values(post2)
        .onConflict(`("id") DO UPDATE SET "title" = :title`)
        .setParameter("title", post2.title)
        .execute();

 对应的sql语句pss

INSERT INTO table (column_list)
VALUES (value_list)
ON DUPLICATE KEY UPDATE c1 = v1, c2 = v2,...;

 ps:这里还是需要注意一下: ON DUPLICATE KEY UPDATE语句判断是否冲突是依靠主键或唯一索引,因此sql当中必须体现出键

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值