Node.js|typeorm 批量插入数据优化和插入冲突操作

d本文主要记录一下批量插入数据的优化。
一、批量插入 【Node.js|typeorm 批量插入数据优化和插入冲突操作】首先能实现批量插入在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语句
INSERT INTO table (column_list) VALUES (value_list) ON DUPLICATE KEY UPDATE c1 = v1, c2 = v2,...;

    推荐阅读