回忆前篇文章我们已经知道给MySQL创建用户时候,需要创建用户名和允许连接服务器的主机,这就说明了我们登录数据库不一定是本地连接,还包括远程连接,那么当远程连接时候,那么就需要建立网络来进行数据通讯。所以本节讨论下长连接、短连接和连接池的概念。
短连接就是我们开发的应用程序需要访问数据库时候,需要建立数据连接,执行SQL操作,关闭连接,用JAVA中的伪代码来描述一下这个过程:
conn = session.onpenConnection(); conn.execute('SQL命令'); session.close();
简单讲就是每一次操作数据库,都要执行一次上述操作。它的弊端就是:如果网络速度不是很理想的情况下,短连接的会消耗大量的系统资源,在生产环境中,业务很多的话,可能1秒内几千个连接,如果都是短连接,且sql处理慢的话,连接关闭不及时,那么资源耗尽速度可能发生在几分钟甚至几秒,所以我们系统不大可能一直是短连接。
长连接是指我们的程序和数据库连接之后,就一直打开,后面程序来访问相同数据库就复用该连接,使用长连接主要是考虑到减少短连接连接的开销。有资料显示Mysql的连接比其他数据库要快。
目前php程序连接数据库是默认采用长连接模式,当它要建立连接来访问数据库时候,PHP会检查是否有相同的连接,存在的话就复用该连接,不存在就新建一个长连接。怎么认为是相同连接呢,其实很简单,只要用户名密码相同,且连接同一个IP的主机数据库,就认为相同。从程序来讲,作为客户端,使用长连接可以不用每次都创建连接对象,如果业务很繁忙的话,使用长连接时候,程序性能会很高效。但是PHP长连接也会导致数据库连接超过闲置,或者内存耗尽的问题。需要合理的设计和优化。
但是从服务器端来看,维持一个连接会占用服务器内存,如果所有程序都是长连接,肯定会有部分连接处于闲置状态,但是无论什么状态连接,都占用内存,这会造成服务器端的资源浪费,也显得不是很高效。
对于扩展性好的系统,往往大部分访问不需要连接数据库,它们会采用缓存的方式来避免频繁连接数据库。
正是因为无论长连接和短连接都有一些弊端,造成创建连接或者维护连接开销导致所耗资源过多,此时需要增加连接池来改进性能。它是一个预先创建的连接缓冲池,考虑到某些数据进行连接之后,处理时间过长,而不想它闲置,允许给其他线程使用。一般现在的应用服务器都带有连接池组件,允许应用程序,客户端来连接,应用服务器维护着连接池的整个生命周期。
数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服无论长连接和短连接缺点,极大地节省系统资源和时间。
在与数据库有关的应用开发中,数据库连接的管理是一个难点。所以我们要不断的优化连接池的参数配置,配合性能压测,达到一个理想的性能指标值。
如果本文对你有用,请加关注,后续会有更多的运维开发经验。