【发布时间】:2010-12-15 00:30:45
【问题描述】:
在整个会话期间保持连接打开是否明智? 我制作了一个连接到 MySql 数据库的 C# 应用程序,程序对其进行读写,并且该应用程序必须每天不间断地运行大约 10 个小时。
保持连接打开而不是每次从数据库中提取某些内容并在需要新内容时再次打开它时调用 close() 函数是否存在任何风险?
【问题讨论】:
标签: c# mysql connection
在整个会话期间保持连接打开是否明智? 我制作了一个连接到 MySql 数据库的 C# 应用程序,程序对其进行读写,并且该应用程序必须每天不间断地运行大约 10 个小时。
保持连接打开而不是每次从数据库中提取某些内容并在需要新内容时再次打开它时调用 close() 函数是否存在任何风险?
【问题讨论】:
标签: c# mysql connection
如果应用程序正在使用连接,则没有理由关闭它。如果您不需要连接,则应关闭它。如果您要让多个应用程序连接到数据库,那么您与该数据库的连接数是固定的。这就是为什么最好在完成后关闭并在需要时重新打开。
【讨论】:
让连接打开一段时间是可以的,只要:
您的并发空闲连接数没有达到 MySQL 连接限制;
您不会在不做任何事情的情况下将其打开小时。默认 MySQL 连接wait_timeout 为 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 扩展答案, - 只是因为您没有关闭连接,不要假设其他事情不会:连接可能超时,可能存在连接问题或一百零一个您的连接断开的原因。您需要假设连接可能不存在,并为此异常情况的代码添加逻辑。
【讨论】:
在我看来,保持连接打开并不是一个好习惯。 每次关闭连接的另一个方面是可扩展性。现在将其保持打开状态可能会很好,但如果您的应用程序的用户数量是两倍 3 倍怎么办。返回并更改所有代码是一件令人头疼的事情。 (我知道我已经做到了:-)
【讨论】:
如果您在代码中使用连接池,您的问题将得到解决。您不需要打开和关闭连接,因此您可以节省打开连接时使用的宝贵资源。您只需将连接返回到一个池,当请求连接时返回一个空闲连接。
当然我的意见是,获取一个连接实例,使用它,提交/回滚你的工作并将其返回到池中。我不建议长时间保持连接打开。
【讨论】:
我在其他答案中没有看到的一件事:如果您准备了语句或临时表,它们可能会阻塞服务器资源,直到连接关闭。但另一方面,将连接保持一段时间而不是每隔一段时间重新创建它们会很有用。
【讨论】:
如果您不断打开和关闭连接,您将付出性能损失。如果您担心应用的太多运行副本会占用太多数据库连接,那么使用连接池和简短的 wait_timeout 可能是明智的。
【讨论】:
可以,前提是:
基本上,它需要大量关注故障情况并正确恢复;经常连接和断开连接要容易得多。
【讨论】:
我觉得,如果有连接池机制,最好关闭连接。
其中一个原因是您不需要重新检查您的连接是否仍然存在。
【讨论】: