在整个会话期间保持连接是否明智? 我制作了一个连接到MySQL数据库的C#应用程序,该程序既读取又写入数据库,每天需要连续运行大约10个小时。
与每次从数据库中获取内容后调用close()函数然后再需要新内容时重新打开连接相比,保持连接的风险有哪些?
在整个会话期间保持连接是否明智? 我制作了一个连接到MySQL数据库的C#应用程序,该程序既读取又写入数据库,每天需要连续运行大约10个小时。
与每次从数据库中获取内容后调用close()函数然后再需要新内容时重新打开连接相比,保持连接的风险有哪些?
保持连接一段时间是可以的,但需要注意以下几点:
不要同时拥有太多空闲连接,避免达到MySQL连接限制;
不要让连接处于数小时的空闲状态。默认的MySQL连接等待超时时间为8小时,如果连接长时间处于空闲状态,下次使用时会出现“MySQL服务器已关闭”的错误。
由于您正在使用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中应该做的方法。
可以的,只要:
基本上需要注意故障情况和正确恢复;经常连接和断开连接要容易得多。
我认为,如果有连接池机制,最好关闭连接。
其中一个原因是您不需要重新检查连接是否仍然存在。
不,我看不出为什么不能保持连接并重复使用它:毕竟,这是各种连接池技术的全部要点(尽管这些技术通常仅适用于多线程情况下所有操作均在同一数据源上的情况)。
但是,为了扩展bobince的答案,即使您没有关闭连接,也不要假设其他事情不会发生:连接可能会超时,可能会出现连接问题或其他一百个原因导致连接断开。您需要假设连接可能不存在,并添加逻辑以处理此异常情况。
在我看来,保持连接不是一个好的做法。 另一个有利于每次关闭连接的方面是可伸缩性。现在保持连接可能没问题,但如果您的应用程序使用的用户数量增加了两倍或三倍,回头修改所有代码将会是一件让人头疼的事情。(我知道我已经做过了 :-))
其他答案中没有提到的一件事情是:如果您有准备好的语句或临时表,它们可能会阻塞服务器资源直到连接关闭。但另一方面,保持连接一段时间而不是每隔几分钟重新创建连接可能是有用的。