C# Petapoco存储库模式存在重大性能问题
我们正在使用与此类似的petapoco存储库模式。当页面加载时,我们打开存储库,运行查询,处理,然后进行处理。这在轻量级页面上是可以的,但是当这种情况在页面中发生几次时,我们会得到相当大的性能降低 我可能错误地认为连接池可以解决这个问题,这是启用的 我做了几个测试 它所在的页面是一个aspx页面,按目前的状态加载大约需要1.2秒。该页面正在运行大约30个数据库查询…并且,查看探查器,即使使用连接池,也会对每个查询进行登录和注销 如果我坚持连接,直到页面结束才关闭,这将下降到大约70毫秒,这是一个相当大的节省 也许我们需要为请求保留数据库对象,但我认为PetaPoco没有这么大的开销……特别是在连接池方面 我创建了一个示例来演示它C# Petapoco存储库模式存在重大性能问题,c#,asp.net,sql-server,petapoco,C#,Asp.net,Sql Server,Petapoco,我们正在使用与此类似的petapoco存储库模式。当页面加载时,我们打开存储库,运行查询,处理,然后进行处理。这在轻量级页面上是可以的,但是当这种情况在页面中发生几次时,我们会得到相当大的性能降低 我可能错误地认为连接池可以解决这个问题,这是启用的 我做了几个测试 它所在的页面是一个aspx页面,按目前的状态加载大约需要1.2秒。该页面正在运行大约30个数据库查询…并且,查看探查器,即使使用连接池,也会对每个查询进行登录和注销 如果我坚持连接,直到页面结束才关闭,这将下降到大约70毫秒,这是一个
这表明,如果重复使用存储库,则加载用户1000次需要230ms,如果每次重新创建存储库,则需要3.5秒。您使用连接池违反了最佳做法 它说在每一次陈述之后都无处可去。我通常在处理过程中保留一个连接/存储库,只有在MVC完成我的功能后才关闭它
是的,甚至连连接池都有开销,你似乎真的很想做这个节目。我总是做的是为每个请求创建一个存储库实例。因为我几乎完全使用MVC模式进行开发,这意味着我在每个控制器中创建一个私有类级别变量,并使用它来服务动作方法中的任何请求。转换为WebForms ASPX,这意味着我将在PageLoad之前的BeforeLoad或任何事件中创建一个,并根据需要传递它。不过,我不认为保留类级实例对于Webforms是一个好主意,但我记不太清楚 经验法则是在整个请求中使用一个repo实例或任何其他类型的类,通常是页面加载或Ajax调用。因为你指出的原因
请记住:互联网上的信息是免费的,你花钱就能得到。好吧,这方面的最佳实践似乎非常不明确——有许多开发人员在做许多不同的事情。是否在视图方法开始时打开此连接,然后将其传递给需要执行的任何操作?似乎建议在需要时打开和关闭连接…除非我误解了这一点是的。当你需要的时候。开始处理页面,需要连接,直到我不再需要。它并不是针对每一条SQL语句。我通常在需要时打开存储库,并将其保持打开状态,直到我不再需要它为止,这通常是呈现页面的函数的结束。