mysql连接。我应该在每次交易之前保持活着还是开始新的连接?

时间:2011-01-12 18:49:37

标签: mysql mysql-management

我正在尝试使用mysql,我对如何处理应用程序的连接存有疑问。

我现在正在做的是打开一个连接并保持活着,直到我终止我的程序。我偶尔做一个mysql_ping(),然后用MYSQL_OPT_RECONNECT启动连接。

另一个选项(我能想到),就是在做任何需要我连接数据库的事情之前启动一个新连接,并在完成之后关闭它。

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

干杯;)


一些额外的细节

此时我保持连接处于活动状态,我不时地将它连接到现在它的状态并在需要时重新连接。

尽管如此,当快速连续发生查询时存在一致的并发性时,我会收到“服务器已经消失”的消息,并在一段时间后重新建立连接。

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

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

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

这样,即使在数据库服务器参与之前,您也可以更好地控制在应用程序级别打开的连接数。这是应用程序服务器为您提供的服务,但如果您希望将其保持较小,也可以很容易地进行汇总。

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

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

答案 1 :(得分:2)

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

SET SESSION wait_timeout=#

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

答案 2 :(得分:-1)

你在写什么样的申请?如果它是一个webscript:保持开放。如果它是可执行文件,则将您的连接汇集在一起​​(如果需要,大多数情况下单例将执行此操作)。