在整个会话期间保持连接打开是否明智? 我创建了一个连接到MySql数据库的C#应用程序,该程序读取和写入它,并且应用程序必须每天运行大约10个小时不间断。
每次从数据库中提取内容并在需要新内容后再次打开时,是否存在保持连接打开而不是调用close()函数的风险?
答案 0 :(得分:9)
只要打开连接一段时间就可以了:
您没有那么多并发空闲连接,而是达到MySQL连接限制;
你没有做任何事情就不会让它开放小时。默认的MySQL连接wait_timeout
是8小时;保持连接长时间不活动,当你下次使用它时,你会得到一个“MySQL服务器已经消失”的错误。
答案 1 :(得分:9)
由于您使用的是ADO.NET,因此可以使用ADO.NET内置的连接池功能。实际上,让我改进一下:您必须始终使用ADO.NET的内置连接池功能。通过这样做,您将使.NET运行时在后台透明地管理您的连接。即使您关闭它们并在打开新连接时重复使用它,它也会保持连接打开一段时间。这真的很快。
请务必在连接字符串中提及您想要池化连接,因为它可能不是默认行为。
您只需要在需要时在本地创建连接,因为它们是在backrgound中汇集的,因此创建新连接没有任何开销:
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中完成它。
答案 2 :(得分:0)
如果应用程序正在使用该连接,则没有理由将其关闭。如果您不需要连接,则应将其关闭。如果您要将多个应用程序连接到数据库,则您具有到该数据库的固定数量的连接。这就是为什么最好在完成后关闭并在需要时重新打开。
答案 3 :(得分:0)
从安全的角度来看,我会说在查询后关闭它会更好,只是为了确保没有其他程序可以将它自己的东西注入打开的连接中。
随着性能的提升,在整个时间内打开连接显然会更好。
您的选择^^
答案 4 :(得分:0)
不,我没有看到为什么不打开连接并重新使用它的任何理由:毕竟,这是各种连接池技术背后的全部要点(尽管这些通常是为多线程情况,其中的工作都在同一数据源上运行。)
但是,要扩大bobince的答案, - 只是因为你没有关闭连接,不要认为别的东西不会:连接可能超时,可能存在连接问题或者一百零一个其他问题你的连接死亡的原因。您需要假设连接可能不存在,并为此异常情况的代码添加逻辑。
答案 5 :(得分:0)
我认为保持联系开放并不是一个好习惯。 每次关闭连接的另一个方面是可扩展性。现在可以将它保持打开状态,但是如果你的应用程序被用户使用量的两倍,那该怎么办呢。回到原点并改变所有代码是痛苦的。 (我知道我已经做到了: - )
答案 6 :(得分:0)
如果在代码中使用连接池,则问题将得到解决。您无需打开和关闭连接,因此可以节省打开连接时使用的宝贵资源。您只需将连接返回到池,当请求连接时返回空闲连接。
当然我认为,获取连接的实例,使用它,提交/回滚您的工作并将其返回到池中。我不建议保持连接打开这么久。
答案 7 :(得分:0)
我在其他答案中没有看到一件事:如果您准备好了语句或临时表,他们可能会阻止服务器资源,直到连接关闭。但另一方面,将连接保持一段时间而不是每隔几分钟重新创建它们会很有用。
答案 8 :(得分:0)
如果您经常打开和关闭连接,您将支付性能损失。如果您担心应用程序的运行副本太多会占用太多数据库连接,那么使用连接池和简短wait_timeout
可能是明智之举。
答案 9 :(得分:0)
是的,你可以,提供:
基本上,它需要对失败案例和正确的恢复进行大量关注;连接和断开通常要容易得多。
答案 10 :(得分:0)
我认为,如果存在连接池机制,则最好关闭连接。
这样做的一个原因是您无需重新检查您的连接是否仍然存在。