同一时间,网站mysql的jdbc连接mysql数据库代码过多怎么办

轻松解决MySQL数据库连接过多的错误_数据库技术_Linux公社-Linux系统门户网站
你好,游客
轻松解决MySQL数据库连接过多的错误
来源:Linux社区&
作者:Linux
1、MySQL数据库系统允许的最大可连接数max_connections。这个参数是可以设置的。如果不设置,默认是100。最大是16384。
2、数据库当前的连接线程数threads_connected。这是动态变化的。
查看max_connections、max_connections的办法见后。
如果 threads_connected == max_connections 时,数据库系统就不能提供更多的连接数了,这时,如果程序还想新建连接线程,数据库系统就会拒绝,如果程序没做太多的错误处理,就会出现类似强坛的报错信息。
因为创建和销毁数据库的连接,都会消耗系统的资源。而且为了避免在同一时间同时打开过多的连接线程,现在编程一般都使用所谓数据库连接池技术。
但数据库连接池技术,并不能避免程序错误导致连接资源消耗殆尽。
这种情况通常发生在程序未能及时释放数据库连接资源或其他原因造成数据库连接资源不能释放,但强坛系统估计不会发生这种低级的编程错误。
该错误的简便的检查办法是,在刷新强坛页面时,不断监视threads_connected的变化。如果max_connections足够大,而 threads_connected值不断增加以至达到max_connections,那么,就应该检查程序了。当然,如果采用数据库连接池技术, threads_connected增长到数据库连接池的最大连接线程数时,就不再增长了。
从强坛出错的情况看,更大的可能性是数据库系统没能进行适当地配置。下面提出一点建议。供参考
让你们的工程师把MySQL的最大允许连接数从默认的100调成32000。这就不会老出现连接过多的问题了。
查看max_connections
进入MySQL,用命令:
show variables
查看数据库最大可连接数的变量值:
max_connections
查看threads_connected
进入MySQL,用命令:
show status
查看当前活动的连接线程变量值:
threads_connected
设置max_connections
设置办法是在my.cnf文件中,添加下面的最后红色的一行:
[mysqld] port=3306 #socket=MySQL skip-locking set-variable = key_buffer=16K set-variable = max_allowed_packet=1M set-variable = thread_stack=64K set-variable = table_cache=4 set-variable = sort_buffer=64K set-variable = net_buffer_length=2K set-variable = max_connections=32000
修改完毕后,重启MySQL即可。当然,为了确保设置正确,应该查看一下max_connections。
1、虽然这里写的32000。但实际MySQL服务器允许的最大连接数16384;
2、除max_connections外,上述其他配置应该根据你们系统自身需要进行配置,不必拘泥;
3、添加了最大允许连接数,对系统消耗增加不大。
4、如果你的mysql用的是my.ini作配置文件,设置类似,但设置的格式要稍作变通
相关资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款MySQL最大连接数超过限制的解决方法_数据库技术_Linux公社-Linux系统门户网站
你好,游客
MySQL最大连接数超过限制的解决方法
来源:Linux社区&
作者:Linux
最近网站出现 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)
以后再慢慢研究。
--------------------------------------分割线 --------------------------------------
14.04下安装MySQL
《MySQL权威指南(原书第2版)》清晰中文扫描版 PDF
Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL
Ubuntu 14.04下搭建MySQL主从服务器
Ubuntu 12.04 LTS 构建高可用分布式 MySQL 集群
Ubuntu 12.04下源代码安装MySQL5.6以及Python-MySQLdb
--------------------------------------分割线 --------------------------------------
本文永久更新链接地址:
相关资讯 & & &
& (07/17/:45)
& (04/22/:32)
& (02/15/:21)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款我们公司用的是MySQL+.NET,运行一段时间以后,总是出现超过最大连接池,这样网站就报错了,怎么回事?怎么解决?
发布时间: 6:29:29
编辑:www.fx114.net 我要评论
本篇文章主要介绍了"我们公司用的是MySQL+.NET,运行一段时间以后,总是出现超过最大连接池,这样网站就报错了,怎么回事?怎么解决?
20cydall]",主要涉及到我们公司用的是MySQL+.NET,运行一段时间以后,总是出现超过最大连接池,这样网站就报错了,怎么回事?怎么解决?
20cydall]方面的内容,对于我们公司用的是MySQL+.NET,运行一段时间以后,总是出现超过最大连接池,这样网站就报错了,怎么回事?怎么解决?
20cydall]感兴趣的同学可以参考一下。
我们公司用的是MySQL+.NET,运行一段时间以后,总是出现超过最大连接池,这样网站就报错了,怎么回事?怎么解决?
还有,关于DataReader与DataSet在性能上的区别!连接字符串中可以设置连接池数的,你试试看!
&&&add&name="ConnectionString"&connectionString="Provider=Data&Source=PC1116;Initial&Catalog=data_Persist&Security&Info=TUser&ID=Connection&lifetime=0;min&pool&size=10;max&pool&size=300"
&&&providerName="System.Data.SqlClient"&/&Connection使用后没有Close?mark,我也关注!
up第一,如一楼的,加大连接池连接数,最大写大点,
第二,如二楼的,在数据库连接执行完后,要及时关闭。
conn.close();DataReader&使用完毕业之后关闭还有数据库连接也要关闭极大的可能性是:用了数据库连接以后没有关闭。鏈接使用了之后沒有關閉吧同意5楼&6楼的说法,自己去查查看,有没有关DataReader:只读只进的&resultset、recordset
Dataset:就是一小数据库,但是是断开式链接,
给推荐一泛型:List&T&&挺不错最大的可能是你装mysql的时候有个最大的连接数限制,你应该设置为10000或者更多,默认的连接数字蛮小的没有关闭连接吧,net&2.o不是现在有using嘛,我建议把数据连接和操作放在里面,避免没有释放资源,datareader是轻量级的,处于连接状态,dataset是和数据库断开了&add&key="data"&value="server=192.168.1.123;&Port=3306;&uid=&pwd=database=pooling=min&pool&size=5;max&pool&size=512;connect&timeout&=&20;&"/&
大家看看,这个max&pool&size=512,是这么设置的吗?还能提高吗?
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:已解决问题
php如何在一个页面同时保持两个mysql数据库连接?
我的意思是两个链接完全是独立的,一个连接的是数据库a,一个连接的是数据库b,听别人说用句柄可以,但不知如何实现
浏览次数:2298
最满意答案
$conn1&=&mysql_connect(&$dbhost&,&&$dbuser&,&$dbpassword&);&mysql_select_db(&&a&,$conn1);$conn2&=&mysql_connect(&$dbhost&,&&$dbuser&,&$dbpassword&,true);&mysql_select_db(&b&,$conn2);看看mysql_connect该函数的第四个参数new_link,mysql_connect()默认new_link为false在一个脚本里用同样的参数调用N次的话,&它不会重新打开新的连接,而是直接返回上一次打开的连接资源句柄!&如果new_link值为true,它会重新打开一个新的连接并且返回新的连接资源句柄。
答案创立者
以企业身份回答&
正在进行的活动
生意经不允许发广告,违者直接删除
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题
问题排行榜
当前问题的答案已经被保护,只有知县(三级)以上的用户可以编辑!写下您的建议,管理员会及时与您联络!
server is ok每个连接的 最长时间是多少?该如何处理
每个连接的 最长时间是多少?该如何处理
xxka917 & &
发布时间: & &
浏览:8 & &
回复:2 & &
悬赏:0.0希赛币
每个连接的 最长时间是多少?如果一个程序一直和mysql保持连接,mysql回多长时间就关闭此连接?
& 另外 & mysql_connect &
& 和 & mysql_real_connect & 主要区别是什么?
默认情况下是8个小时断开连接,如果因为这个时间问题产生Segment fault,建议升级数据库到5.1版本.4.几的版本在mysql_real_connect时一旦网络有故障,很容易dump.xxklzg & &
19:58:19 & &
& & (1)(0)引用该函数已过时。最好使用mysql_real_connect()取而代之。
mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。
如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。
程序会自动维护连接如果出现网络中断或其它情况会自动断开连接的
xxkb57 & &
19:58:19 & &
& & (0)(0)引用
本问题标题:
本问题地址:
温馨提示:本问答中心的任何言论仅代表发言者个人的观点,与希赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的言论违反希赛网问答中心的规则,将会被删除。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&}

我要回帖

更多关于 jdbc连接mysql数据库代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信