繁体   English   中英

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

[英]Desktop C# SQL Server (LocalDB) database access patterns

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

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

需要使用SQL Server (LocalDB)我想我在阅读的大多数在线示例和视频教程中都注意到了一种奇怪的数据库访问模式(我从Amazon那里买了2本书,但是它们在下周到货,因此,我感到羞耻的是,学习基础知识在线)

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

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

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

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

谁能告诉我这是Desktop C#性能友好的数据库访问模式还是与Plan B一起使用? 最终结果将是带有IOCP服务器(我已经弄清楚)C# Windows Service ,该服务器应处理多达1,000个连接。 它不会占用大量数据。 但是,即使有100个客户端,Sql Open / Close操作的开销(如果有的话)也可能很快累加。

我还注意到MultipleActiveResultSets = True; 这应该使它特别适合多次阅读。 因此,我想使用MARS进行整个应用程序的读取访问和短写入的单个连接应该能解决问题! 以及专用于较大的INSERT / UPDATE连接。

计划B :我最初考虑过要创建一个连接池以进行简短的读/写操作。 另一个用于更长的读/写操作。 然后自己遍历它……或者每个客户端一个连接,但是我不确定那不会很滥用。

实际上,这里几乎没有性能问题,可维护性的大幅提高弥补了少量开销。

首先,默认情况下, SqlConnection使用ADO.NET连接池。 因此,实际上并没有打开和关闭服务器的连接。 相反, ADO.NET在内部具有一个连接池,可以在适当时重用这些ConnectionString ,并按ConnectionString将它们分组。 只要您擅长在处理完对象后清理它们,就非常擅长管理这些资源。

这就是这项工作的一部分。 通过关闭连接,您告诉连接池该连接可以被其他SqlConnection重用,因此,实际上,您认为性能问题实际上是性能优化。

从本地编程来了,你必须了解在管理世界编写代码的第一件事是,你必须释放你的资源,否则垃圾收集器将无法有效地清除它们。 我知道您的第一个冲动就是尝试自己管理寿命,但是只有在绝对必要时才应该这样做。

要学习的第二件事是停止对您认为是潜在的性能问题的事情“紧张”……仅当您知道它们是一个问题时才进行优化(即,您已经使用了探查器并且发现正常的方法不是高效如您所愿。

与往常一样,请阅读文档:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM