免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6975 | 回复: 20
打印 上一主题 下一主题

MySQL持续连接问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-30 20:16 |只看该作者 |倒序浏览
之前在做数据库连接时一直用持续连接,但是偶尔开发人员会忘记关闭连接,导致数据库访问阻塞和崩溃

有什么办法可以让PHP执行完后自动关闭数据库连接的,短连接除外。

论坛徽章:
0
2 [报告]
发表于 2007-08-30 22:03 |只看该作者
「PHP 执行完成自动关闭数据库连接」

↑这不就是 connect 做的事情吗?

论坛徽章:
0
3 [报告]
发表于 2007-08-30 23:33 |只看该作者
原帖由 bs 于 2007-8-30 20:16 发表
之前在做数据库连接时一直用持续连接,但是偶尔开发人员会忘记关闭连接,导致数据库访问阻塞和崩溃

有什么办法可以让PHP执行完后自动关闭数据库连接的,短连接除外。

mysql_pconnect()?
是不能被关闭的

论坛徽章:
0
4 [报告]
发表于 2007-08-31 10:47 |只看该作者
mysql_connect()应该是每执行PHP程序一SQL语句就连接一次数据库
如果执行10条SQL,那么就连接10次(本机还好,远程就要命了),执行SQL本身是很快的,但断开和连接却需要很长的时间

至今没想通PHP在执行完程序后, mysql_pconnect()不关闭留着干嘛?难道还能重复使用?

[ 本帖最后由 bs 于 2007-8-31 10:48 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-08-31 10:53 |只看该作者
原帖由 bs 于 2007-8-31 12:47 发表
mysql_connect()应该是每执行PHP程序一SQL语句就连接一次数据库
如果执行10条SQL,那么就连接10次(本机还好,远程就要命了),执行SQL本身是很快的,但断开和连接却需要很长的时间

至今没想通PHP在执行完程序后, mysql_pconnect()不关闭留着干嘛?难道还能重复使用?


1、请问红色部分的理解从何而来???
2、黑,pconnect 还真就是不关闭可以重复使用的。

唉,手册看还是不看,这是个问题。

论坛徽章:
0
6 [报告]
发表于 2007-08-31 11:12 |只看该作者
原帖由 dz902 于 2007-8-31 10:53 发表


1、请问红色部分的理解从何而来???
2、黑,pconnect 还真就是不关闭可以重复使用的。

唉,手册看还是不看,这是个问题。



针对2:
pconnect 不关闭   在数据库端 SHOW PROCESSLIST  出现大量 sleep 线程如何解释?是真的重复使用了吗

实际上未必

[ 本帖最后由 bs 于 2007-8-31 11:29 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-08-31 12:21 |只看该作者
原帖由 bs 于 2007-8-31 13:12 发表



针对2:
pconnect 不关闭   在数据库端 SHOW PROCESSLIST  出现大量 sleep 线程如何解释?是真的重复使用了吗

实际上未必


请看下面两个手册的连接:

http://www.php.net/manual/en/features.persistent-connections.php
http://www.php.net/manual/en/function.mysql-pconnect.php

或者

http://www.php.net/manual/zh/features.persistent-connections.php
http://www.php.net/manual/zh/function.mysql-pconnect.php

如果看完还是不知道为什么请给 10 分我跟你说。

论坛徽章:
0
8 [报告]
发表于 2007-08-31 14:21 |只看该作者
我想楼上的只知其一不知其二,手册只是基础



我也引用一篇网上的文章:

在某些场合,mysql_pconnect( ) 是不适用的。

--------------------------------------------------------------------------------

状况一:

 使用 1 部 web server 与 1 部 MySQL server(两者可能同在一部主机上),而 web server 固定只对 MySQL server 上的某一个数据库进行存取动作。

 因为每次存取数据库时,都是由 web 那边使用同一账号对 MySQL 上的同一数据库作业,若我们将 MySQL 与 web server 的「同时联机数」都调整为 200,就好像 MySQL 这边一直有 200 位「服务生」,随时等着接待来自 web 的 200 位「顾客」似的。而且「顾客」离开之后,「服务生」也不下场休息,时时都站在门口等着接待下一个「顾客」。

 在这种情况下,您只要注意将 MySQL 的「同时联机数」调得比 web server 的高或相等,就会发现使用 mysql_pconnect( ) 是个不错的选择。


--------------------------------------------------------------------------------

状况二:

 使用 1 部 web server 与 1 部 MySQL server(两者可能同在一部主机上),而 web server 会对 MySQL server 上的两个数据库进行存取动作。

 从 web server 那边提出数据存取需求时,有时是针对第 1 个数据库(DB1),有时则是针对第 2 个数据库(DB2)。若我们也将 MySQL 与 web server 的「同时联机数」都调整为 200,这样一来,就好像 MySQL 这边有 200 位「服务生」,但同时经营两个「吧台」(DB1 与 DB2),而「顾客」可能多达 200 位。

 一开始,DB1 这个「吧台」比较热门,MySQL 派了 150 位「服务生」上场接待;同样地,当「顾客」离开之后,这 150 位「服务生」仍守着 DB1 而不下场休息。后来,DB2 那边也热闹起来了,「顾客」越来越多,MySQL 得加派「服务生」上场,有几个能派?答案是 50 个!

 为什么「服务生」的人力调配会捉襟见肘?那是因为 web 那边使用了 mysql_pconnect( ) 来建立联机。「服务生」一开始被指定到哪个「吧台」工作,就会持续在那边停留,绝不「转台」。


--------------------------------------------------------------------------------

 请注意,当使用持续性的联机时,每个已建立的联机只为来自同一部 web server、使用同一组账号,且存取同一数据库的使用者服务。

 如此一来,假设每部 web server 的「同时联机数」都是 200,而且同时使用 2 部 web server 会怎么样呢?从 web1 来了 50 个「顾客」,先是到 DB1 走一趟,接着再到 DB2 晃一圈,这样需要多少「服务生」接待他们?100 个(web1->DB1: 50 web1->DB2: 50)!又从 web2 来了 50 个「顾客」,也做了同样的动作(web2->DB1: 50 web2->DB2: 50)。在此之后,还有「服务生」是闲着的吗?后续若从 web1 或 web2 同时涌入多于 50 位「顾客」时,谁来应付他们?

 倘若您使用的是像 Apache 这类的 multi-process web server(一个 parent process 协调一组 children processes 运作),某个 children process 建立的「持续联机」,是不能分享给其它 children process 来使用的(「服务生」只对先前接待过的「顾客」服务)。在这样的情况下,将会使得 MySQL 上闲置的 process 越积越多(很多「服务生」站在门口等着「老顾客」上门,而不理会「新顾客」)。
 mysql_pconnect( ) 一定是最佳选择吗?我想未必尽然。

[ 本帖最后由 bs 于 2007-8-31 14:23 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-08-31 15:16 |只看该作者
原帖由 bs 于 2007-8-31 16:21 发表
我想楼上的只知其一不知其二,手册只是基础



我也引用一篇网上的文章:

[quote]在某些场合,mysql_pconnect( ) 是不适用的。

--------------------------------------------------------------------------------

状况一:

 使用 1 部 web server 与 1 部 MySQL server(两者可能同在一部主机上),而 web server 固定只对 MySQL server 上的某一个数据库进行存取动作。

 因为每次存取数据库时,都是由 web 那边使用同一账号对 MySQL 上的同一数据库作业,若我们将 MySQL 与 web server 的「同时联机数」都调整为 200,就好像 MySQL 这边一直有 200 位「服务生」,随时等着接待来自 web 的 200 位「顾客」似的。而且「顾客」离开之后,「服务生」也不下场休息,时时都站在门口等着接待下一个「顾客」。

 在这种情况下,您只要注意将 MySQL 的「同时联机数」调得比 web server 的高或相等,就会发现使用 mysql_pconnect( ) 是个不错的选择。


--------------------------------------------------------------------------------

状况二:

 使用 1 部 web server 与 1 部 MySQL server(两者可能同在一部主机上),而 web server 会对 MySQL server 上的两个数据库进行存取动作。

 从 web server 那边提出数据存取需求时,有时是针对第 1 个数据库(DB1),有时则是针对第 2 个数据库(DB2)。若我们也将 MySQL 与 web server 的「同时联机数」都调整为 200,这样一来,就好像 MySQL 这边有 200 位「服务生」,但同时经营两个「吧台」(DB1 与 DB2),而「顾客」可能多达 200 位。

 一开始,DB1 这个「吧台」比较热门,MySQL 派了 150 位「服务生」上场接待;同样地,当「顾客」离开之后,这 150 位「服务生」仍守着 DB1 而不下场休息。后来,DB2 那边也热闹起来了,「顾客」越来越多,MySQL 得加派「服务生」上场,有几个能派?答案是 50 个!

 为什么「服务生」的人力调配会捉襟见肘?那是因为 web 那边使用了 mysql_pconnect( ) 来建立联机。「服务生」一开始被指定到哪个「吧台」工作,就会持续在那边停留,绝不「转台」。


--------------------------------------------------------------------------------

 请注意,当使用持续性的联机时,每个已建立的联机只为来自同一部 web server、使用同一组账号,且存取同一数据库的使用者服务。

 如此一来,假设每部 web server 的「同时联机数」都是 200,而且同时使用 2 部 web server 会怎么样呢?从 web1 来了 50 个「顾客」,先是到 DB1 走一趟,接着再到 DB2 晃一圈,这样需要多少「服务生」接待他们?100 个(web1->DB1: 50 web1->DB2: 50)!又从 web2 来了 50 个「顾客」,也做了同样的动作(web2->DB1: 50 web2->DB2: 50)。在此之后,还有「服务生」是闲着的吗?后续若从 web1 或 web2 同时涌入多于 50 位「顾客」时,谁来应付他们?

 倘若您使用的是像 Apache 这类的 multi-process web server(一个 parent process 协调一组 children processes 运作),某个 children process 建立的「持续联机」,是不能分享给其它 children process 来使用的(「服务生」只对先前接待过的「顾客」服务)。在这样的情况下,将会使得 MySQL 上闲置的 process 越积越多(很多「服务生」站在门口等着「老顾客」上门,而不理会「新顾客」)。
 mysql_pconnect( ) 一定是最佳选择吗?我想未必尽然。

[/quote]

我想告诉你的是:「重复使用」四个字分为「重复」和「使用」两个词。这个词组的意思是,使用完后可以再利用。而不是说,A 还没用完 B 就可以用了。这个是并发的问题而不是重复使用的 bug。如果你还不懂,那么请看下面这个例子:


  1. A 和 B 和 C 分别为三个 apache process,都使用 mysql_pconnect:


  2. A------------>|
  3.          B------------->|
  4. C------------>|
  5. ----------------------------------
  6. 时间 ----------------------->
复制代码


竖线表示使用完成。上面这种情况,就必须有 3 个并发连接,并且不能重复使用,因为 A、B、C 在需要数据库连接的时候,前面的人还没有用完。而众所周知 pconnect 是不会关闭连接的,所以就会有 3 个 sleep 的 mysql process。所以你认为这种情况是「没有重复使用」的原因吗?

另外,关于你的引用,特别是你(注意是你自己)标注成红色的部分,和手册是有冲突的:

The second, and most popular, method is to run PHP as a module in a multiprocess web server, which currently only includes Apache. A multiprocess server typically has one process (the parent) which coordinates a set of processes (its children) who actually do the work of serving up web pages. When a request comes in from a client, it is handed off to one of the children that is not already serving another client. This means that when the same client makes a second request to the server, it may be served by a different child process than the first time. When opening a persistent connection, every following page requesting SQL services can reuse the same established connection to the SQL server.

第二,也是最常用的方法,是把 PHP 用作多进程 web 服务器的一个模块,这种方法目前只适用于 Apache。对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成 web 页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个永久连接后,所有请求 SQL 服务的后继页面都能够重新使用这个已经建立的 SQL Server 连接。


如果我理解没有错误,那么手册是说 persistent connection 是可以在子进程中共享的,当然,关于这个我也在本机测试了。如果两者一定要选一个来相信,那么我相信手册,也相信自己测试的结果。

根据你的上一个回帖,你并没有认真去看手册,甚至我给你说了两页,就两页,最为直接相关的手册页面,你也没有认真看过。No offence,但我觉得你这是对我的不尊重。

PS: 如果可以请给辛苦分 10 分,谢谢。

论坛徽章:
0
10 [报告]
发表于 2007-08-31 16:35 |只看该作者
手册哪年看的早忘记了,就觉得那不一定都准,因为我也试过了,数据库的处理队列逐渐庞大,依然困惑。。。

依然谢谢了

好的,我愿意给100分,怎么给教一下,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP