桌面C#SQL Server(LocalDB)数据库访问模式

时间:2014-07-26 22:55:07

标签: c# sql sql-server ado.net

我来自Native C++ / PHP / MySQL / SQLite背景。

本周末学习C# / WinForms / SQL Server / ASP.NET。而这一切似乎都有所不同。特别是考虑到我不再确切知道引擎盖下发生了什么,我可以在哪里优化等等。

需要使用 SQL Server (LocalDB)我想在我阅读的大多数在线示例中都注意到了一种奇怪的数据库访问模式+视频教程(我得到了来自亚马逊的2本书,但他们下周到达,所以目前,我很遗憾,在线学习基础知识

他们每次访问这些示例中的数据库时,都会为每个查询打开并关闭SqlConnection

using(var sql = new SqlConnection())
{
    sql.Open();
    // do Sql stuff here
}

对于一个C ++人来说,这让我非常紧张:

  • 当我需要进行查询时,打开/关闭连接的开销是多少?
  • 为什么不打开一个对象并在需要时重复使用它?

有人可以告诉我这是Desktop C#中的性能友好型数据库访问模式还是计划B?最终结果将是C# Windows Service,其中包含{ {1}}服务器(我已经发现)应该处理多达1,000个连接。它不会是非常数据密集的。但即使有100个客户端,Sql Open / Close操作开销(如果有的话)也可以快速加起来。

我还注意到 MultipleActiveResultSets = True; 应该使这对多次读取特别友好。所以,我想象一下整个应用程序的读取访问权限和单个连接。使用IOCP进行短写可以解决问题吗?!大型MARS / INSERT的专用连接。

  

计划B :我最初考虑过为短读/写操作创建连接池。另一个用于更长的读/写操作。并自己循环...或者每个客户端可能有一个连接,但我不确定这不会是非常滥用。

1 个答案:

答案 0 :(得分:3)

实际上,这里的性能问题非常少,并且可维护性的大幅增加弥补了少量的开销。

首先,SqlConnection默认使用ADO.NET连接池。因此,连接实际上并未打开并关闭到服务器。相反,内部ADO.NET具有在适当时重用的连接池,并按ConnectionString对它们进行分组。它非常擅长管理这些资源,只要您在完成这些资源时能够很好地清理它们。

这是使这项工作成为可能的一部分。通过关闭连接,您告诉连接池该连接可以由不同的SqlConnection重用,因此实际上,您视为性能问题的实际上是性能优化。

来自本机编程,您必须首先了解如何在托管环境中编写代码,您发布资源,否则垃圾收集器无法获得有效地清理它们。我知道你的第一个冲动是尝试自己管理生命,但你应该只在绝对必要的时候这样做。

要学习的第二件事是停止紧张&#34;关于您认为潜在性能问题的事情......只有在您知道它们成为问题时才进行优化(即,您使用了分析器并发现正常方式并不像您希望的那样高效。< / p>

  

一如既往,请阅读文档:

http://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx