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设置一个超时时间,时间小于数据库的超时时间即可。
 
 

最新文章

  1. JavaScript 入门教程二 在HTML中使用 JavaScript
  2. Authentication in .NET Web Api
  3. FusionCharts的使用方法
  4. linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】
  5. javascript面向对象规则汇总以及json
  6. jQuery事件绑定方式(转)
  7. Protected Functions 是理解OO的难点和关键
  8. 通过JSTL用表格的形式显示
  9. Linux下Nginx的安装、升级及动态添加模块
  10. android自定义控件之滚动广告条
  11. 【Android & iOS】应用升级实现
  12. CKEditor 自主控制图片上传
  13. Oracle中 union 和 union all 的区别
  14. Neo4j 第二篇:图形数据库
  15. IIS无法启动,应用程序池自动关闭,应用程序池XXXX将被自动禁用 解决方案之一
  16. Aprior算法
  17. vue项目在移动端(手机)调试
  18. 简易Asset工作流
  19. IO创建Socket通信中慎用BufferReader中的readLine()
  20. Java第14章笔记

热门文章

  1. Linux使用sar进行性能分析
  2. FFMPEG中最要害的结构体之间的关系
  3. 算法笔记_141:无向图的欧拉回路判断问题(Java)
  4. git:could not open a connection to your authentication agent
  5. 塔防游戏 代码project as 分享
  6. P2P原理
  7. ubuntu PATH 出错修复
  8. Column count of mysql.user is wrong. Expected 43, found 42. Created with MySQL 50518, now running 50641. Please use mysql_upgrade to fix this error.
  9. 超级干货,python常用函数大总结
  10. SQL Server 2008、SQL Server 2008R2 自动备份数据库