怎样用simatic net的dll与西门子bwcc.dllplc直接通信

MySQL连接数超过限制的解决方法 max_user_connection
User 数据库名称 has already more than 'max_user_connections' active connections 的报错,网站瘫痪。
max_user_connections 是 MySQL 用户连接数的最大值设置,整段语句的意思是:服务器的 MySQL 的最大连接数参数设置不足。解决方法:修改 MySQL 安装目录下 my.ini 或者 my.cnf 文件内的 max_user_connections 参数的数值,重启 MySQL 服务器。
但是正常来说,MySQL默认的100个连接数是 足够的。我们需要从程序上去考虑。MySQL的默认最大连接数为100(N),实际给普通用户使用只有N-1个,保留一个连接是留给超级管理员使用的,防 止连接占满了不会把管理员也踢出来。很多网站在运行的时候都会出现连接数受限现象,我认为十之八九并非是网站的真实访问量太大导致连接数超标,更多是因为 我们在设计网站程序的时候采用了不合理的设计架构或数据结构引起的。非正常连接超限可能原因如下(天缘即时归纳未必完整或无错讹仅供参考):
类似人数、在线时间、浏览数等统计功能与主程序数据库同属一个数据空间时就很容易出现。
复杂的动态页尤其是用户每次浏览都涉及到多数据库或多表操作时候也很容易出现。
还有就是程序设计的不合理(比如复杂运算、等待等操作放置在数据库交互行为中间进行),或者程序存在释放BUG。
计算机硬件配置太低却安装太高版、太高配置的MySQL。
未采用缓存技术。
数据库未经过优化或表格设计及其复杂。
等 等一些原因,都会延长数据库的数据交互时间或增加交互次数。所以,如果大家遇到这类问题,首先要考虑程序是否存在BUG导致连接释放失败,再次就是考虑优 化软硬件。当然修改MySQL连接数也是软件优化的操作方法之一,希望大家都能够本着学习的态度通过研究一下自身的原因从而解决这一问题。如果实在是找不 到原因,那就只好先修改连接数,暂缓定位真实原因了。
关于PHP的数据库持久连接 mysql_pconnect
PHP程序 员应该都知道连接MySQL数据库可以使用mysql_pconnect(永久连接)函数,使用数据库永久连接可以提高效率,但是实际应用中数据库永久连 接往往会导致出现一些问题,通常的表现就是在大访问量的网站上时常发生断断续续的无法连接数据库的情况,出现类似"Too many connections in ..."的错误提示信息,重新启动服务器又正常了,但过不了一会儿又出现同样的故障。对于这些问题的成因,恐怕就不是每个人都能说清楚的了,虽然PHP文 档里有一些相关资料,但是解释的并不浅显易懂,这里我厚着脸皮试图做一个简单的讨论,所述观点不见得全都正确,欢迎大家反馈意见。
首先 看看数据库永久连接的定义:永久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓&相同&的连接是指用相 同的用户名和密码到相同主机的连接。
PHP使用永久连接方式操作MySQL是有前提的:就是PHP必须安装为多线程或多进程Web服务 器的插件或模块。最常见的形式是把PHP用作多进程Apache服务器的一个模块。对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运 行,其中实际生成Web页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户 端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个永久连接后,所有不同子进程请求SQL服务的后继页面都能够重新使用这个 已经建立的 SQL服务器连接。它使得每个子进程在其生命周期中只做一次连接操作,而非每次在处理一个页面时都要向 SQL 服务器提出连接请求。每个子进程将对服务器建立各自独立的永久连接。PHP本身并没有数据库连接池的概念,但是Apache有进程池的概念, 一个Apache子进程结束后会被放回进程池, 这也就使得用mysql_pconnect打开的的那个mysql连接资源可以不被释放,而是依附在相应的Apache子进程上保存到了进程池中。于是在 下一个连接请求时它就可以被复用。一切看起来似乎都很正常,但是在Apache并发访问量大的时候,如果使用mysql_pconnect,会由于之前的 Apache子进程占用的MySQL连接没有close, 很快使MySQL达到最大连接数,使得之后的请求可能得不到响应。
上面的部分文字是摘抄自PHP文档,看起来可能还是有些文绉绉的不好理解,那么我就用大白话再举一个例子来说明问题:
假 设Apache配置最大连接数为1000,MySQL配置最大连接数为100,当Apache服务器接到200个并发访问的时候,其中100个涉及到数据 库访问,剩下的100个不涉及数据库访问,因为这个时候还不存在可用的数据库连接,所以这里面涉及到数据库访问的100个并发会同时产生100个数据库永 久连接,达到了数据库最大连接数,当这些操作没有结束的时候,任何其他的连接都无法再获得数据库连接,当这些操作结束了,相应的连接会被放入进程池,此时 Apache的进程池里就有了200个空闲的子进程,其中100个是带有数据库连接的,由于Apache会为访问请求随机的挑选空闲子进程,所以你得到的 子进程很可能是不包含数据库连接的那100个中的一个,而数据库连接已经达到了最大值,你也不可能成功的建立新的数据库连接,唉,你便只好不停的刷新页 面,哪个时候运气好,碰巧分配到了带有数据库连接的子进程,才能正常浏览页面。如果是大访问量的网站来说,任何时候都可能存在大量的并发,所以浏览者可能 就会不停的发现无法连接数据库的现象了。
或许你会说,我们把Apache和MySQL的最大连接数调成一样大不就可以了么?是的,合理 的调整这个最大连接数某种程度上会避免这个问题的发生,但是Apache和MySQL的负载能力是不同的,如果按照Apache的负载能力来设置,对于 MySQL来说,这个最大连接数就偏大,会产生大量的MySQL数据库永久连接,打个比方,就好像和平时代还要养活一个几百万的军队一样,其开销得不偿 失;而如果按照Mysql的负载能力设置,对于Apache来说,这个最大连接数就偏小,有点杀鸡牛刀的感觉,无法发挥Apache的最大效率。
所 以按照PHP手册上的介绍,只适合在并发访问不大的网站上使用数据库永久连接,但对于一个并发访问不大的网站来说,使用数据库永久连接带来的效率提高似乎 没有太大的意义,从这个角度上来看,我觉得PHP中的数据库永久连接基本上是一个鸡肋的角色,如果你一定要使用数据库连接池的概念,可以尝试一下 sqlrelay或者Apache本身提供的mod_dbd,说不定会有惊喜。
关于mysql_free_result和mysql_close
之前用mysql的时候一直是在用短链接,调用mysql_store_result获取一次数据之后就直接调用:
mysql_free_result(m_result);
mysql_close(m_Database);
但是有两个问题:
当使用长连接时(即connect之后一直不close),如果最后会调用mysql_close,需不需要每次都调用mysql_free_result呢?
当mysql_close调用之后,m_result的数据是否还可以用。
先说一下结论:
必须每次调用。因为经过测试,每次mysql_store_result的指针都是不同的,可见并不是共享了同一块buf。
还是可以使用。经过valgrind扫描,只调用mysql_close的扫描结果是:
==9397== 16,468 (88 direct, 16,380 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 5
==9397== at 0x40219B3: malloc (vg_replace_malloc.c:195)
==9397== by 0x8053EA2: my_malloc (in /data/home/dantezhu/appbase/application/platform/openqqcom/share/db_openright/test/test)
==9397== by 0x806D314: mysql_store_result (in /data/home/dantezhu/appbase/application/platform/openqqcom/share/db_openright/test/test)
==9397== by 0x804BB04: CMySQLCppClient::Result(st_mysql_res*&) (mysql_cpp_client.cpp:127)
==9397== by 0x804AB58: CDBOpenRight::GetUinsByApp(unsigned int, std::set&unsigned int, std::less&unsigned int&, std::allocator&unsigned int& &&) (db_openright.cpp:58)
==9397== by 0x8049F10: main (test.cpp:27)MySQL最大连接数设置_性能与架构_传送门
你是真实用户吗(Are you a robot)?
我们怀疑你不是真实用户,已对你的访问做了限制。如果您是真实用户,非常抱歉我们的误判对您造成的影响,您可以通过QQ()或电子邮件()反馈给我们,并在邮件和QQ请求信息里注明您的IP地址:220.177.198.53,我们会尽快恢复您的正常访问权限。另外,如果您不是在访问的当前页面,我们建议您移步
或者 在浏览器中输入以下地址:http://chuansong.me/n/ 访问,您所访问的网站是从抓取的数据,请直接访问,会有更好的体验和更及时的更新。We suspect you are a robot.We are really sorry if you are not,and you can email us () with your current IP address: 220.177.198.53 to get full access to .If you are not accessing
for the current page,you'd better visit
for better performance,as the current website you are accessing is just spam.
觉得不错,分享给更多人看到
性能与架构 微信二维码
分享这篇文章
性能与架构 最新头条文章
性能与架构 热门头条文章Linux下修改Mysql最大并发连接数 -linux-操作系统-壹聚教程网Linux下修改Mysql最大并发连接数
在mysql中最大并发连接数修改方法只要在my.cnf文件加找到max_connections
或修改max_connections
的参考即可了,后面的参数越大就是并发越大了。
第一步,先查看下当前MYSQL的最大连接数
[root@localhost ~]# /usr/local/mysql/bin/mysqladmin -uroot -ppassword variables |grep max_connections
(注意,root替换成你的数据库,不过一般默认就是root,password是数据库密码,) 输入以上命令后会显示下面的信息,这个是最大连接数是100
| max_connections | 100 //默认是100
第二部,修改最大连接数为200
[root@localhost ~]# nano /f
输入以上命令后会进入my.cnf文件内容,在其中加入下面这行代码
max_connections=200
使用上下箭头移动光标,输入后按ctrl+o组合键后保存,保存的时候要再按回车键确定的,这个地方也是我开始没注意的地方,确定后按ctrl+x组合键退出回到命令行
最后一步就是重启mysql
[root@localhost ~]# service mysqld restart //重启mysql的命令
下面是我自己的Centos下测试通过
查看当前系统下mysql设置的最大连接数
1 [root@localhost ~]# /usr/bin/mysqladmin -uroot -p variables |grep max_connections
| max_connections | 100 //默认是100
1 [root@localhost ~]# nano /f
编辑my.cnf在[mysqld]中加入:
1 set-variable=max_connections=1000
1 [root@localhost ~]# service mysqld restart //重启mysql
小提示,并且不是你的mysql并发数设置越大越好,我们需要根据自己的服务器与网站状态高调整网站并发数量了。
上一页: &&&&&下一页:相关内容一个Web报表项目的性能分析和优化实践(六):设置MySQL的最大连接数(max_connections) - 推酷
一个Web报表项目的性能分析和优化实践(六):设置MySQL的最大连接数(max_connections)
因此,需要手动设置MySQL的最大连接数(max_connections)。
就是这么一个简单的事,花了几个小时,查询很多资料,请教好友同事“飞鸟”,才搞定这个问题。
问题中存在问题,问题中存在陷阱,是这个问题的真实写照。
1.设置MySQL的最大连接数。
&网友有如下经验,使用下面这个命令
&set GLOBAL max_connections=1500;
让人迷惑的是,提示“查询OK,0行受到影响”
&mysql&& set GLOBAL max_connections=1500;
&Query OK, 0 rows affected (0.00 sec)
&我误认为没有设置成功,并且通过“show status”这个命令也没有找到“max_connections”这个参数和值。
实际查询确认方法
&mysql& show variables like '%max_connections%';
+—————–+——-+
| Variable_name&& | Value |
+—————–+——-+
| max_connections | 1500& |
+—————–+——-+
1 row in set (0.05 sec)
通过这种方法,MySQL重启后,仍然有效。
2.MySQL配置文件总是被忽略。
World-writable config file '/f' is ignored
To fix this problem, use the following command to change file’s permissions
要修复该问题,使用以下命令更改该文件的权限。
chmod 644 /f
权限过大是导致这个问题的原因。
3.奇葩的MySQL配置文件。
Linux系统/f有下面这项配置。
&因为第一次打开这个文件的时候,就有这项配置,我就觉得这个配置是合理的。
&不但如此,我们启动MySQL的方式是 &mysqld_safe &&,所以我理解成下面这个配置是
&专门为这个命令配置的。
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid
datadir=/usr/local/mysql/var
socket=/usr/local/mysql/mysql.sock
max_connections=1000
&实际上,上面这个配置根本是不合理的,真够坑的。
正确的配置
datadir=/usr/local/mysql/var
socket=/usr/local/mysql/mysql.sock
pid-file=/usr/local/mysql/mysqld.pid
log-error=/var/log/mysqld.log
max_connections=1000
1:如果这个地方配置了“max_connections”,同时设置了“set GLOBAL max_connections=1500”,哪个会起作用呢?
2:今天在看MySQL5.1参考手册时,&一般情况,你不应编辑
mysqld_safe
脚本。相反,应使用命令行选项或
选项文件的
[mysqld_safe]
部分的选项来配置
mysqld_safe
。&貌似[mysqld_safe]是可以存在的。
更多详细配置
可以参考Windows下MySQL的配置参数,&my.ini、&my-huge.ini、&my-large.ini。
4.mysqld_safe正确的启动方式。
&mysqld_safe &&&,&&&的作用是让MySQL服务在后台跑。这样,咱们仍然可以正常使用当前bash终端。
&以前书上有讲过,忘记了。
5.无法使用localhost主机连接mysql。
&mysql -uroot -p123456
&无法登录,提示&Can't connect to local MySQL server through socket '/tmp/mysql.sock'&
&而 mysql -h 192.168.1.1 -uroot -p123456
&可以登录。
最终,我们发现mysql.sock是手动创建的,而Linux的socket文件是不能被编辑的。
&解决方案:给个链接。
&ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
或者mysql的配置文件socket=/usr/local/mysql/mysql.sock,不使用/tmp/mysql.sock。
在解决这个看似简单的问题过程中,遇到了更多的问题。
此外,认真看书,打好基础,也是可以避免一些问题的。
幸好,有网友分享经验,有好友同事“飞鸟”相助,总算是圆满解决了。
自己也算是积累了不少经验。
“老鸟”与“菜鸟”的一个重要区别就是,“老鸟”有着丰富的实践经验,而“菜鸟”没有。
很多问题,不亲自遇到并解决一次,你根本就不知道这些莫名其妙的问题为什么会发生。
我不想一直作为“菜鸟”,希望早日成为“老鸟”,倘若是一只“年轻的老鸟”就更好了。
不但如此,还希望能够及时总结这些经验,供今日的和明日的菜鸟参考。
若干年之后,当回想起作为“菜鸟”的日子,亦能感到自豪。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致MySQL最大连接数max_connections设置的两种方法_MySQL_第七城市
MySQL最大连接数max_connections设置的两种方法
在使用MySQL数据库的时候,经常会遇到这么一个问题,就是“Can not connect to MySQL server.&Too many connections”-mysql 1040错误,这是因为访问MySQL且还未释放的连接数目已经达到MySQL的上限。通常,mysql的最大连接数默认是100, 最大可以达到16384。&&&& 在Windows下常用的有两种方式修改最大连接数。&&&& 第一种:命令行修改。&&& &mysql -uuser -ppassword(命令行登录MySQL)&&& mysql&show variables like 'max_connections';(查可以看当前的最大连接数)&&& msyql&set global max_connections=1000;(设置最大连接数为1000,可以再次查看是否设置成功)&&& mysql&exit(推出)&&& 这种方式有个问题,就是设置的最大连接数只在mysql当前服务进程有效,一旦mysql重启,又会恢复到初始状态。因为mysql启动后的初始化工作是从其配置文件中读取数据的,而这种方式没有对其配置文件做更改。&&& 第二种:修改配置文件。&& 这 种方式说来很简单,只要修改MySQL配置文件my.ini 或 my.cnf的参数max_connections,将其改为max_connections=1000,然后重启MySQL即可。但是有一点最难的就是my.ini这个文件在哪找。通常有两种可能,一个是在安装目录下(这是比较理想的情况),另一种是在数据文件的目录下,安装的时候如果没有人为改变目录的话,一般就在C:/ProgramData/MySQL往下的目录下。&与连接数相关的几个参数:&&&& 在修改最大连接数的时候会有这样一个疑问—这个值是不是越大越好,或者设置为多大才合适?这个参数的大小要综合很多因素来考虑,比如使用的平台所支持的线程库数量(windows只能支持到2048)、服务器的配置(特别是内存大小)、每个连接占用资源(内存和负载)的多少、系统需要的响应时间等。可以在global或session范围内修改这个参数。连接数的增加会带来很多连锁反应,需要在实际中避免由此引发的负面影响。&&& 首先看一下MySQL的状态:mysql&--------------mysql& Ver 14.14 Distrib 5.5.15, for Win32 (x86)Connection id:&&&&&&&&& 1Current database:Current user:&&&&&&&&&&&root@localhostSSL:&&&&&&&&&&&&&&&&&&& Not in useUsing delimiter:&&&&&&& ;Server version:&&&&&&&& 5.5.15 MySQL Community Server (GPL)Protocol version:&&&&&& 10Connection:&&&&&&&&&&&& localhost via TCP/IPServer characterset:&&& utf8Db&&&& characterset:&&& utf8Client characterset:&&& gbkConn.& characterset:&&& gbkTCP port:&&&&&&&&&&&&&& 3306Uptime:&&&&&&&&&&&&&&&& 1 hour 3 min 27 secThreads: 12& Questions: 18& Slow queries: 10& Opens: 33& Flush tables:&5& Open tables:&34& Queries per second avg: 6.256--------------Open tables:34,即当前数据库打开表的数量是34个,注意这个34并不是实际的34个表,因为MySQL是多线程的系统,几个不同的并发连接可能打开同一个表,这就需要为不同的连接session分配独立的内存空间来存储这些信息以避免冲突。因此连接数的增加会导致MySQL需要的文件描述符数目的增加。另外对于MyISAM表,还会建立一个共享的索引文件描述符。&&& 在MySQL数据库层面,有几个系统参数决定了可同时打开的表的数量和要使用的文件描述符,那就是table_open_cache、max_tmp_tables和open_files_limit。mysql& show variables like 'table_open%';+------------------+-------+| Variable_name&&& | Value |+------------------+-------+| table_open_cache | 256&& |+------------------+-------+1 row in set (0.00 sec)table_open_cache:256,这就是说所有的MySQL线程一共能同时打开256个表,我们可以搜集系统的打开表的数量的历史记录和这个参数来对比,决定是否要增加这个参数的大小。查看当前的打开表的数目(Open tables)可用上边提到过的status命令,另外可以直接查询这个系统变量的值:mysql& show status like 'open_tables';+---------------+-------+| Variable_name | Value |+---------------+-------+| Open_tables&& |&3&&&& |+---------------+-------+1 row in set (0.00 sec)Open_tables就是当前打开表的数目,通过flush tables命令可以关闭当前打开的表。 这个值如果过大,并且如果没有经常的执行flush tables命令,可以考虑增加table_open_cache参数的大小。&接下来看max_tmp_tables:mysql& show variables like 'max_tmp%';+----------------+-------+| Variable_name& | Value |+----------------+-------+| max_tmp_tables | 32&&& |+----------------+-------+1 row in set (0.00 sec)max_tmp_tables:32即单个客户端连接能打开的临时表数目。查看当前已打开的临时表的信息:mysql& show global status like '%tmp%table%';+-------------------------+-------+| Variable_name&&&&&&&&&& | Value |+-------------------------+-------+| Created_tmp_disk_tables | 0&&&& || Created_tmp_tables&&&&& | 11&&& |+-------------------------+-------+2 rows in set (0.00 sec)根据这两个值可以判断临时表的创建位置,一般选取BLOB和TEXT列、Group by 和 Distinct语句的数据量超过512 bytes,或者union的时候select某列的数据超过512 bytes的时候,就直接在磁盘上创建临时表了,另外内存中的临时表变大的时候,也可能被MySQL自动转移到磁盘上(由tmp_table_size和max_heap_table_size参数决定)。&增加table_open_cache或max_tmp_tables 参数的大小后,从操作系统的角度看,mysqld进程需要使用的文件描述符的个数就要相应的增加,这个是由open_files_limit参数控制的。mysql& show variables like 'open_files%';+------------------+-------+| Variable_name&&& | Value |+------------------+-------+| open_files_limit | 2670& |+------------------+-------+1 row in set (0.00 sec)但是这个参数是OS限制的,所以我们设定的值并不一定总是生效。如果OS限制MySQL不能修改这个值,那么置为0。如果是专用的MySQL服务器上,这个值一般要设置的尽量大,就是设为没有报Too many open files错误的最大值,这样就能一劳永逸了。当操作系统无法分配足够的文件描述符的时候,mysqld进程会在错误日志里记录警告信息。相应的,有两个状态变量记录了当前和历史的文件打开信息:mysql& show global status like '%open%file%';+---------------+-------+| Variable_name | Value |+---------------+-------+| Open_files&&& | 0&&&& || Opened_files& | 76&&& |+---------------+-------+2 rows in set (0.00 sec)MySQL为每个连接分配线程来处理,可以通过threads_connected参数查看当前分配的线程数量:mysql& show status like '%thread%';+------------------------------------------+-------+| Variable_name&&&&&&&&&&&&&&&&&&&&&&&&&&& | Value |+------------------------------------------+-------+| Delayed_insert_threads&&&&&&&&&&&&&&&&&& | 0&&&& || Performance_schema_thread_classes_lost&& | 0&&&& || Performance_schema_thread_instances_lost | 0&&&& || Slow_launch_threads&&&&&&&&&&&&&&&&&&&&& | 0&&&& || Threads_cached&&&&&&&&&&&&&&&&&&&&&&&&&& | 0&&&& || Threads_connected&&&&&&&&&&&&&&&&&&&&&&& | 1&&&& || Threads_created&&&&&&&&&&&&&&&&&&&&&&&&& | 1&&&& || Threads_running&&&&&&&&&&&&&&&&&&&&&&&&& | 1&&&& |+------------------------------------------+-------+8 rows in set (0.00 sec)比较threads_connected参数和前面提到的max_connections参数,也可以作为目前的系统负载的参照,决定是否需要修改连接数。查看每个线程的详细信息:mysql&对影响系统运行的线程:kill connection|query threadid的命令杀死。文章来源:青青草原WiFi
最新教程周点击榜
微信扫一扫

我要回帖

更多关于 西门子simatic 的文章

 

随机推荐