本地(localhost)mabatis plus 插入数据sql耗时太长(10s)请问一下大家是什么原因?
·
·
·
1.下图是代码,业务是利用线程池并发添加多个数据库表记录(分别insert,总共3个):
·
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.下面是线程池的声明
·
【以下回答由 GPT 生成】
问题原因可能是由于数据库的性能问题导致的,或者是并发插入时的线程竞争导致的锁等待时间过长。可以尝试以下解决方案来优化:
如果数据库表的数据量较大,可以考虑进行分库分表,将数据分散存储,提高查询和插入性能。
并发插入优化:
以下是代码示例:
// 调整线程池大小
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();
如以上优化措施仍不能解决问题,可能需要进一步分析具体的数据库表结构和数据量,以及系统负载等因素,并进行更深入的调优和排查。