Apache::DBI与MYsql的持续连接太多的问题
我经过这几天研究发现mod_perl提供的持续连接并不智能(也许是我还没有找到更
好的解决方案),如果脚本中的参数和初始化的参数不一样,在内存中会出现两个
句柄。
Apache::DBI->connect_on_init("DBI:mysql:mysql:localhost","root","root",
{
PrintError => 1,
RaiseError => 0,
AutoCommit => 1,
});
和
my $dbh = DBI->connect("DBI:mysql:database=localhost","root","root",{
PrintError => 1,
RaiseError => 0,
AutoCommit => 1,
});
以上两个语句实现同一个连接,返回同一种结果,但是他们的概念完全不一样。
经过统一参数,写作方法,和格式。测试后,发现process不再无故增长,达到预
期效果。
事故原因分析:对于一个数据库,Apache::DBI建立一个持续连接, 如果在
startup.pl文件中初始化的时候采用一种书写格式,参数,而脚本中
DBI->connect又采用不同的连接方式和格式,因此假如一个以上的句柄实现同一个
目的(连接同一个数据库)的话,最后一个连接进入时,它会企图查找最后一个相
匹配的句柄(Handler),换句话说就是找一个参数,格式都一样的句柄。这里问题
就出来了,内存中存在两个实现同一目的的句柄(但是格式或参数不一样),这个
连接无法识别应该使用哪一个,所以被迫建立一个新的句柄,而导致原先的句柄继
续Sleep(我管它叫做僵尸句柄)。
解决方案:其实解决方法非常简单,因为昨天我也在其他操作系统上(RedHat 7)装
了Apache+Mod_perl+Mysql,仍然出现相同的问题。根据内存分析与同伴们的测
试。得出一个结论,当内存中连接同一数据库的句柄数在一个以上的时候,
process会无故增加,当句柄为一个的时候,process不会增长,而采用原有内存中
的句柄,这个就是我们想要的。为实现这一目的,我们需要统一初始化和connect
的格式,参数和相关信息。
关于并发处理:测试发现,句柄初始化在process中建立的5个连接完全可以人工控
制。修改MinSpareServers(最小空闲服务器)和MaxSpareServers(最大空闲服务器)
的数量。该数量放的越大,服务器的并发处理能力就越高。但是我们要付出的是宝
贵的内存为代价,根据网站的点击次数合理调节该数量是最为明智的选择。如果服
务器遇到大量并发请求,系统会自动克隆相应的句柄以适应并发的数量。当请求完
毕后,系统将自动断开克隆的句柄以释放沉余的内存。大家看下面的例子,我
相关文档:
mysql
服务器中有六个关键位置使用了字符集的概念,
他们是:
client
、connection
、database
、results
、server,
a
、其中client
是客户端使用的字符集,相当于网页中的字符集设置如下
<
meta http-equiv
=
"Content-Type"
content
=
"text/html;charset=utf ......
这些函数都是MySQL自带的,可以直接使用在PHP写的MySQL查询语句中哦
1-CURDATE()或CURRENT_DATE()和CURTIME()或CURRENT_TIME()
这两个函数是比较常用到的,顾名思义,第一个返回当前日期,第二个返回当前时间
可以在MySQL客户端或者PHP语句里写"SELECT CURDATE(),CURTIME()"查看相关信息.
还有一个很重要的函 ......
/* CSS Document */
body {
font: normal 11px auto "Trebuchet MS", verdana, arial, helvetica, sans-serif;
color: #4f6b72;
background: #e6eae9;
}
a {
color: #c75f3e;
}
table{
padding: 0;
margin: 0;
border-left: 1px solid #c1dad7;
}
caption { ......
MySQL优化
同时在线访问量继续增大,对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机,或者时不时的服务器卡一下,这个问题曾经困扰了我半个多月。MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。
安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql ......
在PHP代码段前面运行以下语句
@mysql_connect($host,$user,$password);
@mysql_query('SET NAMES "UTF8"');
@mysql_query('SET COLLATION_CONNECTION=utf8_general_ci');
或者在MYSQL中运行一次:
SET NAMES "UTF8";
SET COLLATION_CONNECTION=utf8_general_ci
一劳永逸
......