gorm+goroutine 协程请求mysql

博客讲述了在公司项目中遇到SQL查询慢的问题,特别是涉及`COUNT`操作时。作者通过引入协程和异步请求来优化,但遇到了空指针错误。经过排查,发现GORM在新建会话后才能复用`*gorm.DB`。解决方案是使用`Session`方法创建新会话,从而实现协程中的正确复用,有效提高了查询效率。
摘要由CSDN通过智能技术生成

        最近公司要优化一些比较慢的接口,然后就找到慢的sql 加索引优化,然后发现有一类的问题都是属于count比较慢的  表数据虽然只有几百万但是sql中用了or加了索引也是很慢,最后决定先用协程将列表和count异步请求,这样就将程序时间限制在执行count中了,因为查列表的时间大大的少于count时间。

        先上第一波代码

	var wg sync.WaitGroup
	wg.Add(1)
	// 协程
	go func(dbq *gorm.DB) {
        // 查询的代码
		defer wg.Add(-1)
	}(dbq)
	dbq.Count(&total)
    // 等待协程完成
	wg.Wait()

要用协程 自然而然的就这么写了   然后运行的时候拼命的报空指针,一开始以为是dbq没有传进去,用闭包传进去也报错,后面把count注释了发现就好了,后面我就想是不是mysql连接池没有触发,后面把dbp赋值给也给新的传进去也是报空指针,最后实在没办法了,去官网查资料,后面发现 新初始化的 *gorm.DB 或调用 新建会话方法 后,GORM 会创建新的 Statement 实例。因此想要复用 *gorm.DB,您需要确保它们处于 新建会话模式

          所以想用复用gorm最好的办法就是新建会话,因为dbp是带了where条件而不是刚初始化出来的,就有了下一段新的代码了

	// 创建新会话
    dbq = dbq.Session(&gorm.Session{})
    var wg sync.WaitGroup
	wg.Add(1)
	// 协程
	go func(dbq *gorm.DB) {
        // 查询的代码
		defer wg.Add(-1)
	}(dbq)
	dbq.Count(&total)
    // 等待协程完成
	wg.Wait()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值