就像HTTP中的长连接和短连接,数据库连接也会遇到长连接和短连接这种操作。写下这篇文章是因为一次面试的时候,有个问题时长连接和短连接何时可以关闭,这个问题就把我问懵了。所以今天学习一下这个知识点,作为学习笔记。
基本概念
长连接短连接只是一个概念性的问题,只要知道其概念,不是一个特殊的东西:
- 长连接:系统通讯连接建立后就一直保持。
- 短连接:只有系统需要相互发消息连接才建立(客户端发起),请求消息得到响应后连接关闭;
通讯实体间使用长连接,一般还需要定义心跳消息,定期发送来检测系统间链路是否异常,每隔一定时间发送一次心跳,如果一定次数没有收到心跳消息,这认为此连接出现问题,需要断开连接重新建立。具体心跳消息的格式,以及发送间隔,以及多少次没有收到心跳就认为链路异常,以及数据部是否算作心跳消息(有的系统如果接收到数据包则会清除心跳计时器也就相当于系统中的数据包也算作心跳消息);这个需要两端进行协商。比如GSM常用的短消息中心和其他网络实体互连的SMPP协议,要求建立的就是长连接.
应用程序和数据库建立连接,如果超过 wait_timeout (默认28000秒8小时) 应用程序不去访问数据库,连接一直处于空闲状态,那么MySQL就会自动关闭该连接 ,如果再在该连接上执行查询操作,就会发生MySQL server has gone away错误。
何时关闭连接
短连接中,经历连接=》传递=》关闭这个过程,就是数据传送成功后,没有数据传送时就会关闭连接。
长连接中,经历连接=》传递=》等待=》连接=》传递... 这个过程,当没有数据传递时,会重新自动发送连接请求保持连接,当没有数据传递并且超过了一个设定的超时时间,就会关闭连接
数据库连接池的基本概念
连接池的作用主要是节省打开数据库的时间。 由于打开数据库连接比较耗时,所以连接池机制预先打开N个数据库连接,把它们缓存起来,当需要使用数据库的时候就直接使用这些已经打开的连接,从而节省了 时间。
对象池化的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销。用于充当 保存对象的“容器”的对象,被称为“对象池”(Object Pool,或简称Pool)。
数据库连接pool是专门保存和管理数据库连接的pool.
恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率。
采用对象池化的本意,是要通过减少对象生成的次数,减少花在对象初始化上面的开销,从而提高整体的性能。然而池化处理本身也要付出代价,因此,并非任何情 况下都适合采用对象池化。
基本上,只在重复生成某种对象的操作成为影响性能的关键因素的时候,才适合进行对象池化。如果进行池化所能带来的性能提高并不重要的话,还是不采用对象池 化技术,以保持代码的简明,而使用更好的硬件和更棒的虚拟机来提高性能为佳。
PHP实现数据库长连接和短连接
在php中实现长连接就是使用mysql_pconnect(server,user,pwd,clientflag);
mysql_pconnect() 和 mysql_connect() 非常相似,但有两个主要区别:
- 当连接的时候本函数将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接。
- 其次,当脚本执行完毕后到 SQL 服务器的连接不会被关闭,此连接将保持打开以备以后使用(mysql_close() 不会关闭由 mysql_pconnect() 建立的连接)。
在PHP中使用短连接操作就是使用
mysql_connect(server,user,pwd,newlink,clientflag)打开非持久的数据库连接
脚本一结束,到服务器的连接就被关闭,除非之前已经明确调用 mysql_close()关闭了。
网友评论