Answers:
如果您为每个查询/事务创建一个,则管理“关闭”连接要容易得多。
我可以看到为什么常识指示您应该打开一个并在整个过程中使用它,但是会遇到连接断开和多线程的问题。因此,您的下一步将是打开一个包含50个连接的池,并使它们保持打开状态,并将它们分配给不同的进程。然后您会发现这正是.NET框架已经为您完成的工作。
如果您在需要时打开一个连接,并在完成后将其处理,则实际上并不会关闭该连接,它只会将其返回到连接池中以再次使用。
最佳实践是为每个查询创建一个连接-并且在显示数据的情况下,最佳实践是让查询一次性输入所有需要的数据。
背景资料:
在.NET中,SqlConnection.Open()
默认情况下,调用将始终透明地使用连接池(请参阅MSDN上的“在SQL Server中使用连接池”)。因此,您只需使用即可建立新的连接Open()
,并Close()
在完成后进行调用,.NET会做正确的事。
请注意,如果没有连接池,则每个查询只能建立一个连接,因为创建实际的数据库连接可能会非常昂贵(身份验证,网络开销等),并且同时打开的连接数通常非常有限。
SqlConnection.Open()
将始终透明地使用连接池。因此,“打开连接”和“从池中检索连接”之间不存在区别。我的误会 我可以自由地在问题中添加一些解释,然后收回表决权。
请记住,所有这些都是在.Net生态系统的背景下进行的。
开发人员有时希望“优化”他们的代码以重新使用他们的连接对象。在这个问题的背景下,这几乎总是一个错误。
ADO.Net具有称为连接池的功能。当您创建并打开一个新的连接对象时,您真正要做的就是从池中请求连接。关闭连接后,会将其返回到池中。
重要的是要了解我们直接在代码中使用的对象:SqlConnection,MySqlConnection,OleDbConnectio等,它们都是由ADO.Net管理的真实基础连接的包装,而ADO.Net真实连接则“重”得多且价格昂贵从性能的角度来看。正是这些基础对象担心身份验证,网络传输,加密等问题,这些东西远远超过了您在自己的代码中实际看到的对象中的少量内存。
当您尝试重新使用连接对象时,将破坏ADO.Net有效管理重要基础连接的能力。您可以在小事情上获得效率,却要牺牲大得多的事情。
在应用程序或http请求之间重用连接也可能会迫使您意外地序列化某些本可以并行运行的内容,并成为性能瓶颈。我已经看到这种情况发生在实际的应用程序中。
在这里的网页示例中,您至少仅在单个http请求/响应的持续时间内保持较小的连接,通过评估您在请求管道中运行的查询并尝试获取它们尽可能减少对数据库的单独请求(提示:您可以在单个SQL字符串中提交多个查询,并使用DataReader.NextResult()
或检查其中的不同表在DataSet
它们之间移动)。
换句话说,与其考虑为应用程序或http请求重用一个连接,而不是针对每个查询重用一个连接,而是考虑每次调用数据库时都要使用一个连接……每次往返。然后尝试通过最小化这些行程的数量来最小化连接的数量。这样,您就可以满足两个目标。
但这只是一种优化。还可以优化程序员的时间,并获得有效的代码重用。开发人员不想一遍又一遍地编写相同的样板代码,只是想获得一个开放的,随时可用的连接对象。这不仅繁琐,而且是将错误引入程序的一种方式。
但是,即使在这里,每个查询(或往返)通常也要建立一个连接。您可以使用其他模式来避免重写相同的样板代码。这是我喜欢的一个示例,但还有许多其他示例。