饶雨涛 2023-08-07 18:06 采纳率: 28.6%
浏览 11

本地(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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-07 20:45
    关注

    【以下回答由 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();
    

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


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

报告相同问题?

问题事件

  • 创建了问题 8月7日

悬赏问题

  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出