Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Petapoco存储库模式存在重大性能问题_C#_Asp.net_Sql Server_Petapoco - Fatal编程技术网

C# Petapoco存储库模式存在重大性能问题

C# Petapoco存储库模式存在重大性能问题,c#,asp.net,sql-server,petapoco,C#,Asp.net,Sql Server,Petapoco,我们正在使用与此类似的petapoco存储库模式。当页面加载时,我们打开存储库,运行查询,处理,然后进行处理。这在轻量级页面上是可以的,但是当这种情况在页面中发生几次时,我们会得到相当大的性能降低 我可能错误地认为连接池可以解决这个问题,这是启用的 我做了几个测试 它所在的页面是一个aspx页面,按目前的状态加载大约需要1.2秒。该页面正在运行大约30个数据库查询…并且,查看探查器,即使使用连接池,也会对每个查询进行登录和注销 如果我坚持连接,直到页面结束才关闭,这将下降到大约70毫秒,这是一个

我们正在使用与此类似的petapoco存储库模式。当页面加载时,我们打开存储库,运行查询,处理,然后进行处理。这在轻量级页面上是可以的,但是当这种情况在页面中发生几次时,我们会得到相当大的性能降低

我可能错误地认为连接池可以解决这个问题,这是启用的

我做了几个测试

它所在的页面是一个aspx页面,按目前的状态加载大约需要1.2秒。该页面正在运行大约30个数据库查询…并且,查看探查器,即使使用连接池,也会对每个查询进行登录和注销

如果我坚持连接,直到页面结束才关闭,这将下降到大约70毫秒,这是一个相当大的节省

也许我们需要为请求保留数据库对象,但我认为PetaPoco没有这么大的开销……特别是在连接池方面

我创建了一个示例来演示它


这表明,如果重复使用存储库,则加载用户1000次需要230ms,如果每次重新创建存储库,则需要3.5秒。

您使用连接池违反了最佳做法

它说在每一次陈述之后都无处可去。我通常在处理过程中保留一个连接/存储库,只有在MVC完成我的功能后才关闭它


是的,甚至连连接池都有开销,你似乎真的很想做这个节目。

我总是做的是为每个请求创建一个存储库实例。因为我几乎完全使用MVC模式进行开发,这意味着我在每个控制器中创建一个私有类级别变量,并使用它来服务动作方法中的任何请求。转换为WebForms ASPX,这意味着我将在PageLoad之前的BeforeLoad或任何事件中创建一个,并根据需要传递它。不过,我不认为保留类级实例对于Webforms是一个好主意,但我记不太清楚

经验法则是在整个请求中使用一个repo实例或任何其他类型的类,通常是页面加载或Ajax调用。因为你指出的原因


请记住:互联网上的信息是免费的,你花钱就能得到。

好吧,这方面的最佳实践似乎非常不明确——有许多开发人员在做许多不同的事情。是否在视图方法开始时打开此连接,然后将其传递给需要执行的任何操作?似乎建议在需要时打开和关闭连接…除非我误解了这一点是的。当你需要的时候。开始处理页面,需要连接,直到我不再需要。它并不是针对每一条SQL语句。我通常在需要时打开存储库,并将其保持打开状态,直到我不再需要它为止,这通常是呈现页面的函数的结束。