Go语言使用MySQL的常见故障分

导读:很多同学在使用Go和数据库打交道的过程中,经常会遇到一些异常不知道为什么,本文从SQL连接池的原理进行分析,模拟了一些例子对异常的现象进行解读分析,并给出一些常见的应对手段,期望能帮助到大家。全文字,预计阅读时间32分钟有很多同学遇到了MySQL查询缓慢的问题,其可能表现为SQL语句很简单,但是查询耗时很长。可能是由于这样一些原因所致。、资源未及时释放Go的sql包使用的是长连接方式让Client和SQLServer交互,为了避免SQLServer链接过多,一般会在Client端限定最大连接数。下面是sql的连接池的状态图(设置了最大打开连接数的情况):SQLClient和Server交互后,有些结果返回的是一个流(Stream),此时的网络连接(Conn)是被Stream对象继续使用的,Client需要迭代读取结果,读取完成后应立即关闭流以回收资源(释放conn)。比如最长用的DB.QueryContext方法即是如此:

//QueryContext查询一些结果//query:select*fromtestlimit0func(db*DB)QueryContext(ctxcontext.Context,querystring,args...any)(*Rows,error)typeRowsstruct{Close()errorColumnTypes()([]*ColumnType,error)Columns()([]string,error)Err()errorNext()boolNextResultSet()boolScan(dest...any)error}当还有结果的时候(即Rows.Next()==true时),说明还有结果未读取出来,此时必须调用Rows.Close()方法来对流进行关闭以释放连接(让当前连接变为空闲状态以让其他逻辑可以使用该连接)。.实验-不调用Rows.Close()若不调用Close又会怎样呢?下面做一个实验来观察一下:

select*fromuser;+----+-------+---------------------+----------+--------+

id

email

register_time

password

status

+----+-------+---------------------+----------+--------+

2

dw

20--:0:00

d

0

+----+-------+---------------------+----------+--------+rowinset(0.03sec)

packagemainimport("context""database/sql""encoding/json""fmt""sync""time"_"github.


转载请注明:http://www.aierlanlan.com/grrz/791.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了