5

我第一次尝试使用 mysql,但我对如何处理我的应用程序的连接有疑问。

我现在正在做的是打开一个连接并保持它处于活动状态,直到我终止我的程序。我时不时地做一个 mysql_ping(),连接是用 MYSQL_OPT_RECONNECT 开始的。

另一种选择(我能想到的)是在执行任何需要我连接到数据库的操作之前启动一个新连接,并在完成后关闭它。

这两种方法的优缺点是什么?长连接的“副作用”是什么?处理这个最常用的方法是什么?

干杯;)


一些额外的细节

在这一点上,我保持连接处于活动状态,我不时地对其进行 ping 操作,直到现在它的状态并在需要时重新连接。

尽管如此,当查询连续发生一些一致的并发时,我收到“服务器已离开”消息,一段时间后重新建立连接。

我想知道这是否是长时间连接的副作用,或者这只是 mysql 服务器配置错误的情况。

有任何想法吗?

4

3 回答 3

9

通常,打开连接时会产生相当多的开销。根据您期望这种情况发生的频率,它可能没问题,但是如果您正在编写任何类型的应用程序,它在每个程序运行时执行的命令不仅仅是很少的命令,我会推荐一个连接池(用于服务器类型的应用程序)或您的独立应用程序中至少有一个或很少的连接要保持打开一段时间并重复用于多个事务。

这样,即使在涉及数据库服务器之前,您也可以更好地控制在应用程序级别打开了多少连接。这是应用程序服务器为您提供的一项服务,但如果您想让它更小,它也可以很容易地卷起来。

除了性能原因之外,池也是为需求高峰做好准备的好主意。当有大量请求进入并且每个请求都尝试打开到数据库的单独连接时——或者正如你所建议的更多(每个事务)——你很快就会耗尽资源。请记住,每个连接都会消耗 MySQL 内部的内存!

此外,您要确保使用非 root 用户进行连接,因为如果您不这样做(我认为它与 MySQLSUPER权限相关),您可能会发现自己被锁定了。MySQL 为管理员保留至少一个连接来修复问题,但如果您的应用程序使用该权限连接,那么当您尝试手动灭火时,所有连接都将被用完。

于 2011-01-14T10:09:07.957 回答
2

除非您担心打开的连接过多(即超过 1,000 个),否则您应该让连接保持打开状态。连接/重新连接的开销只会减慢速度。如果您知道您将需要连接保持打开一段时间,请运行此查询而不是定期 ping:

SET SESSION wait_timeout=#

其中 # 是保持空闲连接打开的秒数。

于 2011-01-12T20:02:21.617 回答
-1

你在写什么样的应用程序?如果是网页脚本:保持打开状态。如果它是一个可执行文件,请将您的连接池化(如果需要,大多数情况下单例都会这样做)。

于 2011-01-12T18:58:31.833 回答