本地(localhost)mabatis plus 插入数据sql耗时太长

本地(localhost)mabatis plus 插入数据sql耗时太长(10s)请问一下大家是什么原因?
·
·
·
1.下图是代码,业务是利用线程池并发添加多个数据库表记录(分别insert,总共3个):
·

img


·
2.goods属性

public class Goods extends BaseEntity {

    private static final long serialVersionUID = 1L;

    @JsonSerialize(using = ToStringSerializer.class)  //解决js 的number精度不够问题
    @ApiModelProperty("id")
    @TableId("id")
    private Long id;

    @JsonSerialize(using = ToStringSerializer.class)  //解决js 的number精度不够问题
    @ApiModelProperty("分类id (dic)")
    @TableField("cat_id")
    private Long catId;

    @JsonSerialize(using = ToStringSerializer.class)  //解决js 的number精度不够问题
    @ApiModelProperty("用户id")
    @TableField("user_id")
    private Long userId;

    @ApiModelProperty("用户头像地址")
    @TableField("avatarUrl")
    private String avatarUrl;

    @ApiModelProperty("用户昵称")
    @TableField("nickName")
    private String nickName;

    @JsonSerialize(using = ToStringSerializer.class)  //解决js 的number精度不够问题
    @ApiModelProperty("用户qq账号")
    @TableField("qq")
    private Long qq;

    @ApiModelProperty("商品标题")
    @TableField("title")
    private String title;

    @ApiModelProperty("商品详情")
    @TableField("detail")
    private String detail;

    @ApiModelProperty("商品价格")
    @TableField("price")
    private BigDecimal price;

    @ApiModelProperty("商品首图地址")
    @TableField("first_img_url")
    private String firstImgUrl;

    @ApiModelProperty("校区(0 美兰校区;1 云龙校区)")
    @TableField("zone")
    private Integer zone;

    @ApiModelProperty("宿舍楼(dic)")
    @TableField("zone_dormitory")
    private Integer zoneDormitory;

    @ApiModelProperty("联系方式")
    @TableField("contact")
    private String contact;

    @ApiModelProperty("库存")
    @TableField("stock")
    private Integer stock;

    @ApiModelProperty("1 已通过;0 已拒绝")
    @TableField("is_checked")
    private Byte isChecked;

    @ApiModelProperty("1 已经审核; 0 等待审核")
    @TableField("is_have_checked")
    private Byte isHaveChecked;

    @ApiModelProperty("1 上架中;0 下架中")
    @TableField("is_shelf")
    private Byte isShelf;

    @ApiModelProperty("删除时间")
    @TableField("delete_time")
    private Instant deleteTime;

·
3.下面是线程池的声明
·

img


`
4.sql监控
·

img


·

img

【以下回答由 GPT 生成】

问题原因可能是由于数据库的性能问题导致的,或者是并发插入时的线程竞争导致的锁等待时间过长。可以尝试以下解决方案来优化:

  1. 数据库性能优化:
  2. 检查数据库服务器的性能参数设置,如内存分配、并发连接数、缓冲区大小等,根据服务器硬件资源进行调整。
  3. 对表的字段进行合理的索引设计,加快查询速度。
  4. 使用数据库调优工具,如EXPLAIN命令、Slow Query Log等,查看是否存在慢查询SQL语句,进行优化。
  5. 如果数据库表的数据量较大,可以考虑进行分库分表,将数据分散存储,提高查询和插入性能。

  6. 并发插入优化:

  7. 调整线程池的大小,根据数据库服务器的处理能力,合理分配线程数量,避免资源争用。
  8. 考虑使用批量插入操作,将多个插入操作合并成一次数据库操作,减少与数据库的交互次数。
  9. 使用数据库连接池,提前创建一定数量的数据库连接,在插入时直接使用连接,避免频繁创建连接的开销。

以下是代码示例:

// 调整线程池大小
ExecutorService executor = Executors.newFixedThreadPool(20);

List<Goods> goodsList = generateGoodsList();

// 批量插入操作
List<List<Goods>> batches = ListUtils.partition(goodsList, 1000); // 每批1000条数据
List<CompletableFuture<Void>> futures = batches.stream()
    .map(batch -> CompletableFuture.runAsync(() -> goodsDao.insertBatch(batch), executor))
    .collect(Collectors.toList());

CompletableFuture.allOf(futures.toArray(new CompletableFuture[]{})).join();

executor.shutdown();

如以上优化措施仍不能解决问题,可能需要进一步分析具体的数据库表结构和数据量,以及系统负载等因素,并进行更深入的调优和排查。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^