2019独角兽企业重金招聘Python工程师标准>>>

Go中连接数据库的连接池:当你需要和数据库通信时,就会从连接池里面取出一个连接,和数据库交互。使用完的闲置的连接会回到连接池,等待下一次的调用。如果连接池里面没有闲置的连接,会自动创建一个新的连接出来。其中有一段:

An sql.Row returns the connection when Scan() is called, sql.Rows returns either when Close() is called or all rows have been iterated over with Next(), and sql.Tx will return when Commit or Rollback() are called. If you forget to completely iterate an sql.Rows and you forget to Close it, that connection will never go back to the pool.

从上面可以看到,sql.Row如果不遍历完或者直接调用Close()方法,执行这次查询的连接就会一直存在!当连接池里的可用连接用光后,就开始创建新的连接。这就是为什么调用SetMaxOpenConns没有用的原因,因为这个函数只是设置连接池里的连接数而已!如果因为不及时释放连接而让连接池干掉了,还是会不断的创建新的连接,直到用光MySql所有的连接,报错。明白以后,在所有调用DB.Query的函数里加上了:

defer row.Close()

这样查询连接就能在函数结束或者异常的情况下被关闭,就不会持续创建新的连接了。满以为这样就可以解决问题了,但是服务器运行了以后,过段时间仍然会出现相同的错误。在phpMyadmin里的监控页面,可以看到程序运行以后MySql的连接数猛增。问题又变得无解了,只能重新一行行检查代码。

Go中的函数可以有多个返回值,使用下划线可以忽略不需要的返回值:

_, err := m.DB.Query("sql")

程序中update和del之类的sql语句不需要返回值,就直接忽略了。猜想这样也是没法释放连接的,因为即使你不接受返回值,不代表这个变量就不存在了。也就是说返回的sql.Row还是存在的,只是你没有接收而已。没接收,就更谈不上释放连接了,所以最后产生了大量的连接继续报错。回头看看那篇文章,看到这么一段:

Ping and Exec will release the connection right before returning, but the others will pass ownership of the connection to the result, whether that's an sql.Row, sql.Rows, or sql.Tx.

也就是说Ping和Exec方法在调用完之后,会自动释放连接。把代码中所有不需要返回值的语句改成由Exce方法执行,go run 一下,ok,连接数终于正常了!

问题是解决了,总起来以后要注意一下的东西:

  • 程序连接数据库会有连接泄漏的情况,需要及时释放连接

  • Go sql包中的Query和QueryRow两个方法的连接不会自动释放连接,只有在遍历完结果或者调用close方法才会关闭连接

  • Go sql中的Ping和Exec方法在调用结束以后就会自动释放连接

  • 忽略了函数的某个返回值不代表这个值就不存在了,如果该返回值需要close才会释放资源,直接忽略了就会导致资源的泄漏。

  • 有close方法的变量,在使用后要及时调用该方法,释放资源

转载于:https://my.oschina.net/u/567830/blog/425529

Go连接MySql数据库too many connections相关推荐

  1. django 操作MySQL 中文乱码_Django 连接mysql数据库中文乱码

    版本:CentOS6.8 python3.6.4 django1.8.2 数据库pymysql 我使用的终端是CentOS终端,CentOS桌面版安装的pycham,windows使用Navicat连 ...

  2. python django mysql写入中文乱码_Django 连接mysql数据库中文乱码

    版本:CentOS6.8 python3.6.4 django1.8.2 数据库pymysql 我使用的终端是CentOS终端,CentOS桌面版安装的pycham,windows使用Navicat连 ...

  3. cas mysql_使用CAS连接Mysql数据库

    CAS安装好默认使用的是静态用户和密码,但实际使用中,我们可能连接LDAP.数据库等其他情况.接下来,我们看一下如何使用CAS连接Mysql数据库. 创建数据库1 2 3 4 5 6 7 8DROP ...

  4. python 无法加载mysql数据库_Python无法连接MySQL数据库是什么原因?

    我想要使用Python来连接MySQL数据库,但是报了如下错误File "/usr/local/lib/python3.5/dist-packages/pymysql/__init__.py ...

  5. 使用eclipse连接mysql数据库步骤

    1.导入连接MySQL数据库驱动包(例如mysql-connector-java-5.1.7-bin.jar),并测试. 步骤: 1)在eclipse里面点击右上角的图标,如下图所示. 2)选中Dat ...

  6. .net连接mysql数据_.net连接MYSQL数据库的方法及示例!

    连接MYSQL数据库的方法及示例 方法一: 使用MYSQL推出的MySQL Connector/Net is an ADO.NET driver for MySQL 该组件为MYSQL为ADO.NET ...

  7. JDBC连接MySQL数据库及演示样例

    JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  8. python用django连接mysql_三分钟了解Django如何连接Mysql数据库

    处理用户注册请求.Django连接MysqL数据库相关配置.数据库迁移命令: my_Dproject/app01/views.py    在views函数文件中添加register函数,来处理用户注册 ...

  9. eclipselink mysql_Eclipse连接MySQL数据库(傻瓜篇)

    Eclipse连接MySQL数据库(傻瓜篇) 本来不想写这么简单人文章,在百度上搜索我这个标题,完全符合标题的一大堆.但我按照那些文章捣鼓了很久,就是不行. 我的环境:MySQL:mysql-esse ...

最新文章

  1. net localgroup 命令详解
  2. Git学习笔记:Git简介
  3. 解决 FTPClient 出现的553错误
  4. 概率论 条件概率 全概率 贝叶斯公式
  5. java重定向代码_Java程序员经典面试题集大全 (三十四)
  6. hibernateTemplate update 修改指定字段
  7. [bzoj4568][Scoi2016]幸运数字
  8. 小强的HTML5移动开发之路(50)——jquerymobile页面初始化过程
  9. Docker实践(二)镜像
  10. 文件编程概念(C语言库函数系统调用API)
  11. 视频去水印工具-视频去水印哪个软件好用免费
  12. ssis 链接mysql_SSIS 连接数据
  13. html特殊符号对照表
  14. 博客营销成功案例分析
  15. 未来规划——北京大学数院432应用统计备考攻略
  16. Kali Linux Web 渗透测试秘籍 第七章 高级利用
  17. 顺序主子式的英文翻译(定义)
  18. Ardunio开发实例-TSL2591数字环境光传感器
  19. 怎样在微信中直接下载秒借类金融贷款APP,避免下载链接域名被微信屏蔽封杀的处理方式
  20. c++——dynamic_cast的使用

热门文章

  1. 第02次作业-线性表
  2. 让服务器iis支持.apk文件下载的设置方法
  3. java操作word (jacob)
  4. PL/SQL学习笔记-循环控制与顺序控制
  5. 【创业公司的机遇与挑战】如何在1年内从产品助理到产品高管?
  6. 产品助理要练哪些姿势,才能看上去舞步优雅?
  7. WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆)
  8. Outlook 2010 配置关联QQ邮箱
  9. 查询磁盘的性能(iostat)
  10. PHP ElasticSearch的使用