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

时间:2014-12-10 10:26:02

标签: c# asp.net sql-server petapoco

我们正在使用petapoco存储库模式(类似于此blog post)。当页面加载时,我们打开存储库,运行查询,处置然后继续处理。这在轻量级页面上很好,但是当在页面中发生这种情况时,我们会出现相当大的性能下降。

我可能错误地认为连接池会处理这个问题,这是启用的。

我做了几次测试。

它所在的页面(它是一个aspx页面)大约需要1.2秒才能加载。该页面运行大约30个数据库查询...并且,查看分析器,每个查询正在进行登录和注销(即使使用连接池)。

如果我坚持连接并且不关闭直到页面结束,这将下降到大约70毫秒,这是非常显着的节省。

也许我们需要为请求保留数据库对象,但我并不认为PetaPoco有这么大的开销......尤其是连接池。

我创建了一个test app来演示它。

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

2 个答案:

答案 0 :(得分:0)

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

它说在每次陈述后都无处可去。我通常在进行处理时保留一个连接/存储库,只在我的函数完成时关闭它(使用MVC)。

是的,即使是连接池也有开销,你似乎真的受制于该节目。

答案 1 :(得分:0)

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

经验法则是对您的整个请求使用您的repo的一个实例(或任何其他类型的类),这通常是页面加载或Ajax调用。由于你已经指出的原因。

请记住:互联网上的信息是免费的,您可以获得所需的费用。