MySQL客户端的Server层由连接器、分析器、优化器和分析器构成。

其中连接器负责跟客户端建立连接、获取权限、维持和管理连接。

今天在学习MySQL的时候再次遇到了“长连接与短连接”这个老生常谈的话题,遂整理了一下自己的理解:

关于长连接与短连接:

长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。

即:连接—>数据传输—>保持连接—>数据传输—>保持连接……………—->关闭连接

短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。

即:连接—>数据传输—>关闭连接

长连接在没有数据通信时需要定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭。

该如何选择长连接与短连接?

长连接:主要用于少数客户端与服务端的频繁通信。因为此时如果使用短连接,频繁通信就需要频繁建立socket连接,而建立连接的过程复杂、易出错并且耗时长。

短连接:主要用于多数客户端与服务端的低频通信。使用长连接虽然避免了频繁建立连接,但是长连接耗费的资源多,需要专门的线程(unix下可以用进程管理)来负责维护连接状态 。表现为:全部使用长连接时,MySQL内存飞快增长,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是 MySQL 异常重启了。

总而言之:使用长连接与短连接时要适当把握,谨慎选择。

Python如何与MySQL****保持长连接?

在执行sql前, ping一下连接是否正常。

如果正常,则不受影响,正常执行sql就行了;

如果异常,则需要重新连接数据库。

1
2
3
4
5
6
7
8
9
10
11
def test_conn(self):
try:
self.conn.ping()
except:
self.conn = pymysql.connect(
host=MYSQL_HOST,
user=MYSQL_USER,
password=MYSQL_PASSWORD,
database=MYSQL_DATABASE,
charset=MYSQL_CHARSET)
self.cursor = self.conn.cursor()