Navicat使用常见的两个问题及解决方法,提高开发效率

摘要:
通常,您不会直接使用命令行来操作MySQL数据库,然后查看从MySQL服务启动到当前的周期的查询最大值。使用的连接然后根据其值和服务器的性能确定最适合当前项目的最大连接数。有两种方法可以使用SQL语句修改最大连接数(立即生效,重新启动后生效,但更改最大连接数只能表面上解决问题。
Navicat使用常见问题

在我们日常开发过程中,一般不会直接使用命令行来操作 MYSQL 数据库,而会选择一些图形化界面去帮助我们来进行此类操作,常用的有:SQLyog(Logo也是小海豚),Navicat,或者直接使用编辑器自带的图形化界面工具。我这边开发使用的是 Navicat,在日常使用的时候出现过一下的问题:

Too Many Connections - 1040

在 Navicat 的界面中,这是一个很讨人厌的提示框,多人协作开发的时候经常出现。原因有二:

一是 Mysql 数据库的默认最大连接数是:151,

二是 对于多人开发的单体项目来说,虽然我们同时在用的连接不会超过10个,理论上100 绰绰有余,但是除了我们正在使用的连接以外,还有很大一部分 Sleep 的连接,这个才是真正的罪魁祸首。

分析到了问题的根源,我们就需要对症下药,依次解决:

修改 Mysql 最大连接数量

首先查看当前 Mysql 最大连接数量是多少:

show variables like '%max_connections%';

1569728623643

这里我已经修改过了,所以是 1000,没有改过的童鞋应该还是 100,

然后查看从这次 mysql 服务启动到现在,同一时刻并行连接数的最大值:

show status like 'Max_used_connections';

1569728770594

对于 Mysql 的最大连接数设置,在首次配置的时候设置一个较大的数值,以后在使用的过程中,周期的查询 Max_used_connections 然后根据他的值和服务器的性能确定一个最适合当前项目的最大连接数

最大连接数的修改有两种方式

  1. 使用 sql 语句(立即生效,但服务器重启后失效):
set global max_connections = 1000;

1569732049126

  1. 修改 /etc/my.cnf.添加 max_connections = 1000 永久有效。重启后生效

但更改最大连接数只能从表面上解决问题,随着我们开发人员的增多,Sleep 连接也会更多,到时候万一又达到了 1000 的上限,难道我们又得改成 10000 吗?这显然是非常不可取的。所以我们不仅要治标,还要治本。杀掉多余的 Sleep 连接就是治本

杀掉Sleep连接

我们可以通过 show_processlist 命令来查看当前的所有连接状态

1569739161678

可以发现, Sleep 的连接占了绝大多数。

Mysql 数据库有一个属性 wait_timeout 就是 sleep 连接最大存活时间,默认是 28800 s,换算成小时就是 8 小时,我的天呐!这也太长了!严重影响性能。相当于今天上班以来所有建立过而未关闭的连接都不会被清理。

执行命令:

show global variables like '%wait_timeout';

1569738432344

我们将他修改成一个合适的值,这里我改成了 250s。当然也可以在配置文件中修改,添加 wait_timeout = 250。这个值可以根据项目的需要进行修改,以 s 为单位。我在这里结合 navicat 的超时请求机制配置了 240s。

执行命令:

set global wait_timeout=250;

这样,就能从根本上解决 Too Many Connections 的问题了

正在准备...

我们在使用 Navicat 的时候,有时候查询完一次数据之后,就去编写代码,等下次回来的打开表的时候就会出现:正在准备... 等字样,这次查询可能会消耗 20s 以上的时间,这是不能容忍的。

这个时候我们就需要想办法解决他了,首先我想到的是 mysql 的 connection 连接被清理了,通过复现 正在准备... 并同时在 linux 通过 show processlist 命令查看连接状态发现,并不是。这个请求在正在准备的前10几秒并没有和 mysql 建立connection 连接。

那么我分析可能是 navicat 和数据库服务器之间的通信连接断掉了导致了,而根据 navicat 文档说明,在连接高级设置这里有一个保持连接间隔(官方文档-通过 ping 来保持连接。你可以在编辑框中设置 ping 与 ping 之间的间隔)的时长配置:将其设置成 240s。这样每过240s,软件就会像服务器发送心跳请求,以保证连接不被断开。这样我们就不会出现正在准备。。。等字样了

1570438982547

免责声明:文章转载自《Navicat使用常见的两个问题及解决方法,提高开发效率》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇3. Android程序生成步骤spark之单词统计下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间

错误场景:用ASP.NET制作web网站的添加用户功能时,调用写好的存储过程出错 错误提示: 出错原因:出现这种问题多半是因为你插入或者更新数据库时,datetime字段值为空默认插入0001年01月01日造成datetime类型溢出。 传给数据库表的时间类型值是null值。这里的null指的是程序代码中的null,多数出现这种情况的场景是:在程序里面定...

[转]Android 操作SQLite基本用法

在Android开发中SQLite起着很重要的作用,网上SQLite的教程有很多很多,不过那些教程大多数都讲得不是很全面。本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的。一.SQLite的介绍1.SQLite简介SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入  式的,而且目前已经在很多嵌入...

【Linux】ODBC安装

ODBC介绍   ODBC是Open Database Connect 即开发数据库互连的简称,它是一个用于访问数据库的统一界面标准。ODBC引入一个公共接口以解决不同数据库潜在的不一致性,从而很好的保证了基于数据库系统的应用程序的相对独立性。   很多程序员都已经体会到了在Windows平台下通过ODBC进行数据库编程开发的益处,其实在Linux/Uni...

(转)SQLSERVER表分区的介绍(一)

下面进入正题吧,很多时候当单张数据表的数据量比较大的时候比如千万级别条记录、上亿级别记录,如果不做优化,那么查询的效率大家清楚。 有经验的人会通过各种手段做优化,其中表分区就是其中一种手段。 个人对表分区的口语化解释:把一张表分成几个区域 例如:一张业务表,有一个字段是月份或者年份,那么可以按照月份/年份来分区,当客户要查询某个月份/年份的数据的时候就到那...

SQL Server 2008安装和配置图解 giser

SQL Server 2008我们也能从中体验到很多新的特性,但是对于SQL Server 2008安装,还是用图来说话比较好。本文将从SQL Server 2008安装开始讲起。     本来这篇是打算玩玩服务器功能中的第一个:adrms的,没想到装了几次都安装成功,但是有错误,后来没招了,打算将rms的数据库放到sql上来折腾折腾,所以为了不让大家觉得...

拒绝了对对象 'sp_OACreate' (数据库 'mssqlsystemresource',架构 'sys')的 EXECUTE 权限。

执行一个存储过程, 由于里面使用到了一些 --创建对象 EXEC sp_OACreate 'VBScript.RegExp', @objRegexOUT --设置属性 EXEC sp_OASetProperty @objRegex, 'Pattern', @pattern EXEC sp_OASetProperty @objRegex, 'Ign...