mysql长tcp断开连接四次握手和短tcp断开连接四次握手的区别

博客分类:
短连接 连接-&传输数据-&关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。
长连接 连接-&传输数据-&保持连接 -& 传输数据-& 。。。 -&关闭连接。 长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。
http的长连接 HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP 1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。
什么时候用长连接,短连接?
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
总之,长连接和短连接的选择要视情况而定。发送接收方式 1、异步 报文发送和接收是分开的,相互独立的,互不影响。这种方式又分两种情况: (1)异步双工:接收和发送在同一个程序中,由两个不同的子进程分别负责发送和接收 (2)异步单工:接收和发送是用两个不同的程序来完成。 2、同步 报文发送和接收是同步进行,既报文发送后等待接收返回报文。 同步方式一般需要考虑超时问题,即报文发出去后不能无限等待,需要设定超时时间,超过该时间发送方不再等待读返回报文,直接通知超时返回。
在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。
浏览: 1129451 次
来自: 北京
标示对java很陌生!
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
,非常好。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'数据库中长连接和短连接的区别分析
什么是长连接?
其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。
通常的短连接操作步骤是:
连接-》数据传输-》关闭连接;
而长连接通常就是:
连接-》数据传输-》保持连接-》数据传输-》保持连接-》…………-》关闭连接;
这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭就行了
什么时候用长连接,短连接?
长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信常会发生Socket出错,并且频繁创建Socket连接也是对资源的浪费。
但是对于服务端来说,长连接也会耗费一定的资源,需要专门的线程(unix下可以用进程管理)来负责维护连接状态。
总之,长连接和短连接的选择要视情况而定。
首先,如果使用了长连接而长期没有对进行任何操作,那么在timeout值后,
server就会关闭此连接,而客户端在执行查询的时候就会得到一个类似于“MySQL server has gone
away“这样的错误。
在使用mysql_real_connect连接数据库之后,再使用mysql_options(
&mysql, MYSQL_OPT_RECONNECT, … )
来设置为自动重连。这样当mysql连接丢失的时候,使用mysql_ping能够自动重连数据库。如果是在mysql
5.1.6之前,那么则应在每次执行完real_connect 之后执行mysql_options(
&mysql, MYSQL_OPT_RECONNECT, … ) ,如果是mysql
5.1.6+,则在connect之前执行一次就够了。
查看mysql连接数
mysqladmin -uroot -p& processlist
实际的测试中我发现,当设置了MYSQL_OPT_RECONNECT为1时,超时后再查看processlist,则自动建立的连接不在列表中,但事实上连接确实建立并被使用了。
在MYSQL的默认设置中,如果一个数据库连接超过8小时没有使用(闲置8小时),服务器将断开这条连接,后续在该连接上进行的查询操作都将失败。网络上对该问题的描述非常多。也提供了相应的解决办法。我在这里提一些我自己的看法。
解决办法一:修改MYSQL服务器的配置参数
道理非常简单,MYSQL的默认设置是在数据库连接超过8小时没有使用后将其断开,如果我们将这个时间改成更大的数值,那么连接超时所需的时间就会
更长,也就意味着更不容易超时。网络上提供的修改方法一般是修改/f,在这个文件中添加一行wait_timeout=你需要设置的超
时时间。实际上有一种比较简单的方法来修改这个参数:
首先作为超级用户登录到MYSQL,注意必须是超级用户,否则后面会提示没有修改权限。然后输入
show global variables like 'wait_timeout';
回车执行后显示目前的超时时间:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.00 sec)
上面显示的是默认的超时时间,即8个小时(单位是秒)。现在重新设置该参数,例如我们要将超时时间设置成10个小时,可以输入:
set global wait_timeout=36000;
回车执行,显示:
Query OK, 0 rows affected (0.00 sec)
表示设置成功,可以重新使用show global variables like 'wait_timeout'来验证。
这种方法比较直观,而且设置的参数立即生效。但如果/f中没有配置,则重启服务后,global变量会从/f中读取新的变量值。
下边是一段示例代码:
if(!mysql_real_connect(&logdb, my_hostname,
my_user, my_password, my_dbname, my_port, my_sock, 0)){
ast_log(LOG_ERROR, "Failed to connect to mysql database %s on
%s.n", my_dbname, my_hostname);
use_mysql = 0;
char value = 1;
mysql_options(&logdb, MYSQL_OPT_RECONNECT,
(char*)&value);
use_mysql = 1;
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
譬如 HTTP 的 Connection-alive 如果为 close,则 server 收到一个
并发送完一个 response
之后就会主动关闭连接,这就是短连接;如果 Connection-alive keep-alive 的话可以在一个 tcp
连接中交换多次对话。是这个定义?那就只是个程序结构设计问题了。
--------------------------------------------------------------------------------
长连接短连接只是一个概念性的问题,只要知道其概念,不是一个特殊的东西:
长连接:系统通讯连接建立后就一直保持。
短连接:只有系统需要相互发消息连接才建立(客户端发起),请求消息得到响应后连接关闭;
通讯实体间使用长连接,一般还需要定义心跳消息,定期发送来检测系统间链路是否异常,每隔一定时间发送一次心跳,如果一定次数没有收到心跳消息,这认为此连接出现问题,需要断开连接重新建立。
具体心跳消息的格式,以及发送间隔,以及多少次没有收到心跳就认为链路异常,以及数据部是否算作心跳消息(有的系统如果接收到数据包则会清除心跳计时器也
就相当于系统中的数据包也算作心跳消息);这个需要两端进行协商。比如GSM常用的短消息中心和其他网络实体互连的SMPP协议,要求建立的就是长连接.
所以长短连接只是一个概念问题长短连接的socket,就是使用普通的socket函数,没有什么特殊的。
--------------------------------------------------------------------------------
PHP在??MYSQL?r有???FUNCTION
CONNECT?PCONNECT
????函式的差?e在哪??
一般的??蚀鸢付际牵?br /&
PCONNECT是持?性的?接,PHP??匮}使用已?存在的?料?爝B?
但是再追??下去,能?得出?淼娜司蜕倭嗽S多
常?的疑??有:
什??r候要用CONNECT什??r候用PCONNECT?
mysql_close何?r使用?
?槭颤NDATABASE上有一堆SLEEP的PROCESS?
明明用PCONNECT?楹蚊看?ESOURCE ID都不同?
先回?w到最??蔚慕忉?,pconnect???z查是否有已?存在的?料?爝B?。
若有,就使用?的??;若?o,就新??⒁????
但是??所?得?z查??,是指?一??APACHE行程所??⒌馁Y料?爝B?
而不是?一台WEB SERVER所??⒌馁Y料?爝B?。
一台WEB SERVER上可能有上百??APAHE行程(2.0??最大150??)
也就是? 在最大情?r下可能??猩习??PCONNECT造成的?料?爝B?
(???上??h少於此)
所以同?邮褂?CONNECT是??霈F不同RESOURCE ID的
因?樗?赡苁窃诓煌?谐躺厦?绦?/p&
而PCONNECT是不??诓樵?完成後就??,而是??却?欢?r?
????r?可以由MYSQL上的wait_timeout?定
而且mysql_close?K?o法??pconnect所??⒌倪B?,只能??connect所??⒌馁Y料?爝B?。?然如果?]有CLOSE在??TIMEOUT?r?之後也是???B
PCONNECT必?要小心使用,在??的不好的CODE中,???留一大批的DATABASE
CONNECTION。最大值可以??佑?算
每台SERVER的APACHE行程? * 所有WEB SERVEWR?盗?br /&
?然不需要我?硖嵝眩?????都????B的CPU TIME?MEMORY
??WEB CODE?r,不?使用何??言,有?牲c一定要再?邮??之前先有答案
一是,要??ATABASE抓取什??料
二是,要?魉褪颤N?料到USER端
(其???也不只用於WEB)
DATABASE的??是很慢的,能?蛞淮巫ト&晁?璧馁Y料,就不要分?纱?/p&
--------------------------------------------------------------------------------
数据库连接池由数据库管理器提供。与连接语言无关。
提供了 pconnect 的?C制, 可以????接池的功能 .
???& mysql , mysql_pconnect 函?稻涂梢??? :
&???爝B接使用完?後, ?K不?放, 而是留在系?中, 下一次?用 mysql_pconnect
?接????r, 首先?z查是否有空?的?接未被使用, 如果有, ?t使用????接, 而不是?行?接???斓牟僮?
?亩??省系??? .
1.数据库连接池的工作机制是什么?它怎么提高数据的访问速度呢?&
---------------------------------------------------------------
连接池的作用主要是节省打开数据库的时间。&
由于打开数据库连接比较耗时,所以连接池机制预先打开N个数据库连接,把它们缓存起来,当需要使用数据库的时候就直接使用这些已经打开的连接,从而节省了
创建新的对象并初始化的操作,可能会消耗
很多的时间。在这种对象的初始化工作包含了一些费时的操作(例如,从一台位于20,000千米以外的主机上读出一些数据)的时候,尤其是这样。在需要大量
生成这样的对象的时候,就可能会对性能造成一些不可忽略的影响。要缓解这个问题,除了选用更好的硬件和更棒的虚拟机以外,适当地采用一些能够减少对象创建
次数的编码技巧,也是一种有效的对策。对象池化技术(Object&
Pooling)就是这方面的著名技巧.&
对象池化的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销。用于充当
保存对象的“容器”的对象,被称为“对象池”(Object Pool,或简称Pool)。&
数据库连接pool是专门保存和管理数据库连接的pool.&
恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率。&
采用对象池化的本意,是要通过减少对象生成的次数,减少花在对象初始化上面的开销,从而提高整体的性能。然而池化处理本身也要付出代价,因此,并非任何情
况下都适合采用对象池化。&&&
基本上,只在重复生成某种对象的操作成为影响性能的关键因素的时候,才适合进行对象池化。如果进行池化所能带来的性能提高并不重要的话,还是不采用对象池
化技术,以保持代码的简明,而使用更好的硬件和更棒的虚拟机来提高性能为佳。&&&
恰当地使用对象池化,可以有效地降低频繁生成某些对象所造成的开销,从而提高整体的性能。而借助Jakarta
Pool组件,可以有效地减少花在处理对象池化上的工作量,进而,向其它重要的工作里,投入更多的时间和精力。
数据库连接池的原理:
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。
客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。
如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。
当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
--------------------------------------------------------------------------------
Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。
Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点通讯,比如多个Client连接一个Server.
短连接常见于大客户情况 如WEB服务器如果每个连接都使用长连接 那么每个客户都保留一个socket 系统资源耗费很大 。
长连接则是多用于操作频繁情况每个TCP连接都需要三步握手 这需要时间 如果每个操作都是先连接 再操作的话那么处理速度会降低很多
所以每个操作完后都不断开 下次处理时直接发送数据包就OK了 不用建立TCP连接。
另外还有同步操作和异步操作,同步操作指上一个操作返回结果后才能发下一个操作的数据包;异步操作指先把所有的操作数据包发完后
再等待它们的返回结果。相比较看, 异步操作速度快 特别是在每个包处理方法独立的情况下 。
上面只是一个参考 最后要使用哪种类型还是决定于你。如联通的短信协议就是 连接后可以发送多个短信包
但如果一段时间(如60s)没有操作 那么连接就会被关闭。
--------------------------------------------------------------------------------
数据库永久连接
永久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP
将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相
同的用户名和密码到相同主机的连接。
服务器的工作和分布负载没有完全理解的读者可能会错误地理解永久连接的作用。特别的,永久连接不会在相同的连接上提供建立“用户会话”的能力,也不提供有效建立事务的能力。实际上,从严格意义上来讲,永久连接不会提供任何非永久连接无法提供的特殊功能。
这和 web 服务器工作的方式有关。web 服务器可以用三种方法来利用 PHP 生成 web 页面。
第一种方法是将 PHP 用作一个“外壳”。以这种方法运行,PHP 会为向 web 服务器提出的每个 PHP
页面请求生成并结束一个 PHP 解释器线程。由于该线程会随每个请求的结束而结束,因此任何在这个线程中利用的任何资源(例如指向 SQL
数据库服务器的连接)都会随线程的结束而关闭。在这种情况下,使用永久连接不会获得任何地改变??因为它们根本不是永久的。
第二,也是最常用的方法,是把 PHP 用作多进程 web 服务器的一个模块,这种方法目前只适用于
Apache。对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成 web
页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请
求时,它将有可能被一个不同的子进程来处理。在开启了一个永久连接后,所有请求 SQL 服务的后继页面都能够重新使用这个已经建立的 SQL
Server 连接。
最后一种方法是将 PHP 用作多线程 web 服务器的一个插件。目前 PHP 4 已经支持 ISAPI、WSAPI 和
NSAPI(在 Windows 环境下),这些使得 PHP 可以被用作诸如 Netscape FastTrack
(iPlanet)、Microsoft's Internet Information Server (IIS) 和
O'Reilly's WebSite Pro 等多线程 web
服务器的插件。永久连接的行为和前面所描述的多过程模型在本质上是相同的。注意 PHP 3 不支持 SAPI。
如果永久连接并没有任何附加的功能,那么使用它有什么好处?
答案非常简单??效率。当客户端对 SQL
服务器的连接请求非常频繁时,永久连接将更加高效。连接请求频繁的标准取决于很多因素。例如,数据库的种类,数据库服务和 web
服务是否在同一台服务器上,SQL
服务器如何加载负载等。但我们至少知道,当连接请求很频繁时,永久连接将显著的提高效率。它使得每个子进程在其生命周期中只做一次连接操作,而非每次在处
理一个页面时都要向 SQL 服务器提出连接请求。这也就是说,每个子进程将对服务器建立各自独立的永久连接。例如,如果有 20
个不同的子进程运行某脚本建立了永久的 SQL 服务器永久连接,那么实际上向该 SQL 服务器建立了 20
个不同的永久连接,每个进程占有一个。
注意,如果永久连接的子进程数目超过了设定的数据库连接数限制,系统将会产生一些缺陷。如果数据库的同时连接数限制为
16,而在繁忙会话的情况下,有 17
个线程试图连接,那么有一个线程将无法连接。如果这个时候,在脚本中出现了使得连接无法关闭的错误(例如无限循环),则该数据库的 16
个连接将迅速地受到影响。请查阅使用的数据库的文档,以获取关于如何处理已放弃的及闲置的连接的方法。
--------------------------------------------------------------------------------
应用程序和数据库建立连接,如果超过 wait_timeout (默认28000秒8小时)
应用程序不去访问数据库,连接一直处于空闲状态,那么MySQL就会自动关闭该连接 ,如果再在该连接上执行查询操作,就会发生MySQL
server has gone away错误。
wait_timeout
服务器在关闭连接之前在一个连接上等待行动的秒数,默认数值是28800,即如果没有事情发生,服务器在
8个小时后关闭连接。
尝试解决办法:
&1&.这是由于超时时间 wait_timeout
过短导致,所以修改它的值即可。打开MySQL安装目录下的 mysql.ini,在文件中添加一行配置项
wait_timeout=1000000 即可。(默认没有此选项,需要手动的添加)
该方法可行。
&2&.在代码中设置自动重连选项,
m_connection.set_option( new mysqlpp::ReconnectOption(true)
然后在发生 MySQL server has gone away错误 的时候 调用
Connection::ping()方法,该函数会检查对服务器的连接是否正在工作,必要时重新连接,但经过测试后发现,这种方法不起作用。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
在客服端不主动关闭连接的情况下,在php中使用pdo连接数据库(ATTR_PERSISTENT)使用持久连接和不使用持久连接的区别是什么?这个ATTR_PERSISTENT的作用是什么?会主动帮我维护连接吗?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
持久连接在脚本结束后不会被关闭,且被缓存,当另一个使用相同凭证的脚本连接请求时被重用。持久连接缓存可以避免每次脚本需要与数据库回话时建立一个新连接的开销,从而让 web 应用程序更快。
ATTR_PERSISTENT参数决定你建立的连接是否是持久连接
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:这样的TCP通讯情况下,是用长连接好,还是短连接好。-CSDN论坛
这样的TCP通讯情况下,是用长连接好,还是短连接好。
请教一个难题。
是这样的:
在一台电脑上运行“设备运行管理控制软件”,它需要远程通过TCP/IP控制128台设备运行,同时它还需要通过TCP/IP与2台操作终端通讯。
&&&对128台设备的控制时间分辨是每5秒各读写100个字节的数据。即每5秒间隔对这128台设备,通过读写100个字节进行远程控制。
1)这样的TCP通讯情况下,是用长连接好,还是短连接好?
2)TCP通讯中,上位机作为服务器端好,还是作为客户端好,&为什么?
3)怎样分配、设置,效果最好。
1.当然是长连接了
2.上位机作为服务器端,因为他是被动的
3.多线程循环读
另外,与2台操作终端通讯,上位机也用服务器模式进行通讯嘛?
首先请允许我对你的问题产生疑问..
引用在一台电脑上运行"设备运行管理控制软件"
这个东西&也就是&控制终端&是吧&比如&手机登陆3个QQ&可以随意控制.
这样的话&你这个"软件"实际上也是特殊的"客户端"了.
其次你的问题&看需求应该是类似远程控制的软件.所以这个还是长连接比较好&采用tcp通讯
至于你口中的上位机可能你还是没明白什么意思..
这样来说吧&&比如&有100个电脑&都运行了一个client.exe的服务,他们会每隔1分钟&连接192.168.1.130:9999这个服务
那么&这个192.168.1.130:9999的这个服务&我一般叫他上位机..负责接收下面上传的数据(软件或者硬件)或者转发数据.
然而你还有一个clientServer.exe的管理软件来控制那100个client电脑..
所以实际上你这个也是client但是不是所谓的"终端".
这种情况跟现在的远程控制&很相像.所以&完成一套整体的东西&你需要开发3个东西
1`client.exe(终端服务)
2`clientManager.exe(终端管理软件)
3`server.exe(上位机服务)
至于如何实现可能对你来说还需要时间.先不用找什么东西最好..先了解整体流程思路,然后画出来.
最终在在代码上动手.
我给你的忠告是先做出来,然后在谈什么效率高优化速度什么的.
引用至于如何实现可能对你来说还需要时间.先不用找什么东西最好..先了解整体流程思路,然后画出来.
谢谢&diaodiaop!
现在是想先把东西做出来再说。只是以我现在的能力,连需要用哪些东西、怎样的结构层次做都不清楚。
虽然已经饿啃了几本C#方面基础书和SQL书籍。所以请教各位大神了。&&
回复什么是长连接?
其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。
通常的短连接操作步骤是:
连接-》数据传输-》关闭连接;
而长连接通常就是:
连接-》数据传输-》保持连接-》数据传输-》保持连接-》…………-》关闭连接;
这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭就行了
什么时候用长连接,短连接?
长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信常会发生Socket出错,并且频繁创建Socket连接也是对资源的浪费。
但是对于服务端来说,长连接也会耗费一定的资源,需要专门的线程(unix下可以用进程管理)来负责维护连接状态。
总之,长连接和短连接的选择要视情况而定。
首先,如果使用了长连接而长期没有对进行任何操作,那么在timeout值后, server就会关闭此连接,而客户端在执行查询的时候就会得到一个类似于“MySQL server has gone away“这样的错误。
在使用mysql_real_connect连接数据库之后,再使用 mysql_options( &mysql, MYSQL_OPT_RECONNECT, … ) 来设置为自动重连。这样当mysql连接丢失的时候,使用mysql_ping能够自动重连数据库。如果是在mysql 5.1.6之前,那么则应在每次执行完real_connect 之后执行mysql_options( &mysql, MYSQL_OPT_RECONNECT, … ) ,如果是mysql 5.1.6+,则在connect之前执行一次就够了。
第一种方法,当然是增加你的 wait-timeout值,这个参数是在my.cnf(在Windows下台下面是my.ini)中设置,我的数据库负荷稍微大一点,所以,我设置的值 为10,(这个值的单位是秒,意思是当一个数据库连接在10秒钟内没有任何操作的话,就会强行关闭,我使用的不是永久链接 (mysql_pconnect),用的是mysql_connect,关于这个wait-timeout的效果你可以在MySQL的进程列表中看到 (show processlist) ),你可以把这个wait-timeout设置成更大,比如300秒,呵呵,一般来讲300秒足够用了,其实你也可以不用设置,MySQL默认是8个小 时。情况由你的服务器和站点来定。
第二种方法:
这也是我个人认为最好的方法,即检查MySQL的链接状态,使其重新链接。
可能大家都知道有mysql_ping这么一个函数,在很多资料中都说这个mysql_ping的API会检查数据库是否链接,如果是断开的话会尝 试重新连接,但在我的测试过程中发现事实并不是这样子的,是有条件的,必须要通过mysql_options这个C API传递相关参数,让MYSQL有断开自动链接的选项(MySQL默认为不自动连接),但我测试中发现的MySQL的API中并不带这个函数,你重新编辑MySQL吧,呵呵。但mysql_ping这个函数还是终于能用得上的,只是要在其中有一个小小的操作技巧:
这是我的的数据库操作类中间的一个函数
function ping(){
if(!mysql_ping($this-&link)){
mysql_close($this-&link); //注意:一定要先执行数据库关闭,这是关键
$this-&connect($this-&t_dbhost,$this-&t_dbuser,$this-&t_dbpw,$this-&t_dbname,$this-&t_pconnect);}
我需要调用这个函数的代码可能是这样子的
for($i=0;$i&10;i++){
$str=file_get_contents(’’);
$db-&ping(); //经过前面的网页抓取后,或者会导致数据库连接关闭,检查并重新连接
$db-&query(’select * from table’);
ping()这个函数先检测数据连接是否正常,如果被关闭,整个把当前脚本的MYSQL实例关闭,再重新连接。
经过这样处理后,可以非常有效的解决MySQL server has gone away这样的问题,而且不会对系统造成额外的开销。
阅读(...) 评论()

我要回帖

更多关于 ssl tls 的文章

 

随机推荐