概念说明
- 短连接:是指程序和数据库通信时需要建立连接,执行操作后,连接关闭。短连接简单来说就是每一次操作数据库,都要打开和关闭数据库连接,基本步骤是:连接→数据传输→关闭连接。
- 长连接:是指程序之间的连接在建立之后,就一直打开,被后续程序重用,基本步骤是:连接→数据传输→保持连接→数据传输……。使用长连接的初衷是减少连接的开销,尽管MySQL的连接比其他数据库要快得多。长连接在没有数据通信时,定时发送数据包,以维持连接状态。
- 数据库连接池:是一些网络代理服务或应用服务器实现的特性,如J2EE服务器,它实现了一个持久连接的“池”,允许其他程序、客户端来连接,这个连接池将被所有连接的客户端共享使用,连接池可以节省打开数据库的时间,加速连接,也可以减少数据库连接,降低数据库服务器的负载;它是预先打开N个数据库连接,把它们缓存起来,当需要使用数据库的时候就直接使用这些已经打开的连接,节省时间
- J2EE数据库连接池的原理:
- J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。
- 客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。
- 如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。
- 当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
适用场景
- 长连接优劣势
- 从客户端的角度来说,使用长连接可以不用每次创建新连接,若客户端对MySQL服务器的连接请求很频繁,永久连接将更加高效。
- 从服务器的角度来看,情况则略有不同,它可以节省创建连接的开销,但维持连接也是需要内存的。如果滥用长连接的话,可能会使用过多的MySQL服务器连接。现代的操作系统可以拥有几千个MySQL连接,但很有可能绝大部分都是睡眠(sleep)状态的,这样的工作方式不够高效,而且连接占据内存,也会导致内存的浪费。
- 长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信常会发生Socket出错,并且频繁创建Socket连接也是对资源的浪费;但是对于服务端来说,长连接也会耗费一定的资源,需要专门的线程(unix下可以用进程管理)来负责维护连接状态。
- 长连接是一些驱动、驱动框架、ORM工具的特性,由驱动来保持连接句柄的打开,以便后续的数据库操作可以重用连接,从而减少数据库的连接开销。而连接池是应用服务器的组件,它可以通过参数来配置连接数、连接检测、连接的生命周期等。
注意事项
- 我们一般使用mysql -uroot -p只不过是使用了管理员的身份来创建一个connection,从而登录mysql,mysql的连接过程,内部实际上是经过tcp/ip协议的,当然mysql封装了tcp/ip有自己的一套协议。mysql是会创建一个线程来处理到来的连接的,我们可以在mysql中show status;然后在连接mysql,再次show status就可以看到Thread_connected的数量会增加1
- 在生产繁忙的系统中,连接也可能会受到系统端口数的限制,如果要每秒建立几千个连接,那么连接断开后,端口不会被马上回收利用,必须经历一个“FIN”阶段的等待,直到可被回收利用为止,这样就可能会导致端口资源不够用。
- 如果客户端和MySQL数据库之间有连接池或Proxy代理,一般在客户端推荐使用短连接。对于长连接的使用一定要慎重,不可滥用
- 如果使用了长连接而长期没有对数据库进行任何操作,那么在timeout值(默认8小时)后,mysql server就会关闭此连接,而客户端在执行查询的时候就会得到一个类似于“MySQL server has gone away“这样的错误。在使用mysql_real_connect连接数据库之后,再使用mysql_options( &mysql, MYSQL_OPT_RECONNECT, … ) 来设置为自动重连。
常用工具
- 查看mysql连接数:
mysqladmin -uroot -p processlist