golang :连接数据库闲置断线的问题
admin
2023-05-24 01:22:55
0
golang在进行数据库操作,一般来说我们使用Open函数创建一个数据库(操作)句柄:func Open(driverName, dataSourceName string) (*DB, error)
    我们知道,返回的*DB是一个具有零到多个底层连接的连接池,可以安全的被多个go程使用,并且会维护自身的闲置连接。所以一般来说open函数我们只调用一次,几乎很少需要关闭DB。
    连接池可以使得连接更好的控制,于是简单配置甚至是不做什么配置就可以用了,事实好像也是如此,连上数据库就都ok了。但是!你很可能会遇到下面这样的错误:
[mysql] 2017/01/15 12:23:43 packets.go:124: write tcp 127.0.0.1:45697->127.0.0.1:3306:write: broken pipe
    其原因很有可能就是你的连接池没有做好相关配置,或者配置了却设置的值不对,那么超时的原因大概有以下几点:
    1.最大连接数大于数据库服务器端配置的最大连接数,多余的连接在被使用到的时候出现连接超时
    2.网络抖动:每次连接的时候提交或维护大量数据,此时网络不稳定导致连接超时
    3.占用的资源未被释放,我们一般只open一次,获取一个*DB,但是在使用stmt,rows或者是tx时候用完没有关闭,耗尽资源也有可能导致连接超时。
    对于出现的3中问题,你可以试试下面的解决方案:
    1.对于最大连接数的问题,调用函数Db.SetMaxOpenConns()设置值(小于数据库配置的最大连接)
    2.对于维护大量数据,可以尝试采用事务操作,若失败,回滚。然后重试。
    3.使用defer关键字,在启用操作的时候直接在下一行加上defer *.close()函数return的时候会执行相关的关闭函数。
  如果你尝试了以上的解决方案,还是发现偶尔会出现连接超时的错误的话,很可能是因为数据库本身对连接有一个超时时间的设置,如果超时时间到了数据库会单方面断掉连接,此时再用连接池内的连接进行访问就会出错,连接池中的每个连接都维护了一个创建时间,取连接的时候会自动检查的,你可以试试调用db的SetConnMaxLifetime()方法来给db设置一个超时时间,时间小于数据库的超时时间即可。


相关内容

热门资讯

鲁比奥:霍尔木兹海峡协议取得进... 美国国务卿鲁比奥表示,在霍尔木兹海峡自由通行协议方面已经取得了“进展……但尚未最终达成协议”。美国最...
从实验室到产业一线:AI“入海... 新华网北京8月3日电(杨易辰 记者刘军)记者8月3日从自然资源部获悉,今年上半年,我国海洋经济实现稳...
OpenAI和Anthropi... 7月16日,月之暗面发布2.8万亿参数的Kimi K3。AI评测平台Arena联合创始人直言,这可能...
400余名青少年珠算爱好者亮相... 8月2日至3日,2026青少年珠算文化非遗美育大会暨第七届“指尖上的智慧”珠算文化非遗教育成果展演亮...
原创 涨... 01、主力机型集体涨价,热搜两极分化 8月2日0点,小米商城价格悄然刷新:REDMI Turbo 5...
伊朗高官:美试图阻挠伊朗阿曼就... 据伊朗方面4日消息,一名伊朗高级官员说,美国政府试图阻挠伊朗与阿曼之间关于霍尔木兹海峡管理的持续谈判...
铠侠与闪迪发布第十代332层Q... IT之家 8 月 4 日消息,铠侠株式会社今天宣布与闪迪公司共同推出下一代四层单元(QLC)3D 闪...
官方通报卫生巾疑现虫卵:对涉事... 8月4日晚,广西桂林市七星区市场监督管理局发布情况通报:4日,网络上关于“购买的卫生巾疑现虫卵”的信...
奖励一颗小行星命名!中国科学家... 中国科学家又有喜讯了。 综合中国气象报社、科技日报消息,当地时间8月3日,在意大利佛罗伦萨举办的第4...
全球最大通信卫星刚上天,休斯为... 卫星互联网商业模式观察 全球最大通信卫星刚上天, 休斯为什么还是被星链逼到破产? 作者 | 老谭 ...