MySQL连接,我能保持它打开吗?

17

在整个会话期间保持连接是否明智? 我制作了一个连接到MySQL数据库的C#应用程序,该程序既读取又写入数据库,每天需要连续运行大约10个小时。

与每次从数据库中获取内容后调用close()函数然后再需要新内容时重新打开连接相比,保持连接的风险有哪些?

11个回答

17

保持连接一段时间是可以的,但需要注意以下几点:

  1. 不要同时拥有太多空闲连接,避免达到MySQL连接限制;

  2. 不要让连接处于数小时的空闲状态。默认的MySQL连接等待超时时间为8小时,如果连接长时间处于空闲状态,下次使用时会出现“MySQL服务器已关闭”的错误。


3
假设提供程序使用连接池,则保持连接处于打开状态不会带来任何实际好处。官方的MySQL Connector/Net提供程序默认使用连接池。原帖未提及实际使用的提供程序,但如果它支持池化,则我会采用“迟开早关”策略,并让提供程序管理底层物理连接。 - LukeH
抱歉在旧帖子中添加评论。我阅读了http://download.oracle.com/javadb/10.3.3.0/devguide/cdevconcepts89498.html,似乎只要您的应用程序具有多个线程/事务,将每个线程分配给不同的连接是一个好的实践。谢谢。 - Lee Chee Kiam

11

由于您正在使用ADO.NET,您可以使用ADO.NET内置的连接池功能。实际上,让我澄清一下:您必须始终使用ADO.NET内置的连接池功能。这样做将使.NET运行时在后台透明地为您管理连接。即使您关闭了连接,它也会保持连接一段时间并在打开新连接时重用它们。这是非常快速的。

请确保在连接字符串中注明您需要使用连接池,因为它可能不是默认行为。

只有在需要时才需要在本地创建连接,因为它们在后台被池化,因此创建新连接没有任何开销:

using (var connection = SomeMethodThatCreatesAConnectionObject())
{
    // do your stuff here
    connection.Close(); // this is not necessary as
                        // Dispose() closes it anyway
                        // but still nice to do.
}

这就是在.NET中应该做的方法。


1

可以的,只要:

  • 如果连接丢失,您将重新连接
  • 如果发生异常情况,您可以重置连接状态
  • 您将检测连接是否“静默”,例如防火墙超时发生时

基本上需要注意故障情况和正确恢复;经常连接和断开连接要容易得多。


1

我认为,如果有连接池机制,最好关闭连接。

其中一个原因是您不需要重新检查连接是否仍然存在。


0
如果应用程序正在使用连接,则没有关闭它的理由。如果您不需要该连接,则应关闭它。如果您要有多个应用程序连接到数据库,则对该数据库的连接数是固定的。这就是为什么在完成操作后最好关闭连接,并在需要时重新打开连接的原因。

0
从安全角度来看,我认为在查询后关闭连接更好,以确保没有其他程序可以将自己的东西注入到打开的连接中。
就性能而言,始终保持连接打开显然更好。
你自己决定^^

0

不,我看不出为什么不能保持连接并重复使用它:毕竟,这是各种连接池技术的全部要点(尽管这些技术通常仅适用于多线程情况下所有操作均在同一数据源上的情况)。

但是,为了扩展bobince的答案,即使您没有关闭连接,也不要假设其他事情不会发生:连接可能会超时,可能会出现连接问题或其他一百个原因导致连接断开。您需要假设连接可能不存在,并添加逻辑以处理此异常情况。


0

在我看来,保持连接不是一个好的做法。 另一个有利于每次关闭连接的方面是可伸缩性。现在保持连接可能没问题,但如果您的应用程序使用的用户数量增加了两倍或三倍,回头修改所有代码将会是一件让人头疼的事情。(我知道我已经做过了 :-))


0
如果您在代码中使用连接池,您的问题将得到解决。您不需要打开和关闭连接,因此节省了在打开连接时使用的宝贵资源。您只需将连接返回到池中,当请求连接时,它会返回一个空闲连接。
当然,我的观点是获取连接的实例、使用它、提交/回滚您的工作并将其返回到池中。我不建议保持连接长时间处于打开状态。

0

其他答案中没有提到的一件事情是:如果您有准备好的语句或临时表,它们可能会阻塞服务器资源直到连接关闭。但另一方面,保持连接一段时间而不是每隔几分钟重新创建连接可能是有用的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接