我们正在使用petapoco存储库模式(类似于此blog post)。当页面加载时,我们打开存储库,运行查询,处置然后继续处理。这在轻量级页面上很好,但是当在页面中发生这种情况时,我们会出现相当大的性能下降。
我可能错误地认为连接池会处理这个问题,这是启用的。
我做了几次测试。
它所在的页面(它是一个aspx页面)大约需要1.2秒才能加载。该页面运行大约30个数据库查询...并且,查看分析器,每个查询正在进行登录和注销(即使使用连接池)。
如果我坚持连接并且不关闭直到页面结束,这将下降到大约70毫秒,这是非常显着的节省。
也许我们需要为请求保留数据库对象,但我并不认为PetaPoco有这么大的开销......尤其是连接池。
我创建了一个test app来演示它。
这表明如果重新使用存储库,则加载用户1000次需要230ms,但如果每次都重新创建存储库,则需要3.5秒。
答案 0 :(得分:0)
您对连接池的使用违反了最佳做法。
它说在每次陈述后都无处可去。我通常在进行处理时保留一个连接/存储库,只在我的函数完成时关闭它(使用MVC)。
是的,即使是连接池也有开销,你似乎真的受制于该节目。
答案 1 :(得分:0)
我一直在做的是为每个请求创建一个我的存储库的单个实例。因为我几乎只使用MVC模式开发,这意味着我在每个控制器中创建一个私有类级变量,并使用它来为我的Action方法中的任何请求提供服务。转换为WebForms(ASPX),这意味着我将在BeforeLoad中创建一个(或者在PageLoad之前的任何事件)并根据需要传递它。我不认为保持一个类级别的实例对于Webforms来说是一个好主意,但是我记不太清楚了。
经验法则是对您的整个请求使用您的repo的一个实例(或任何其他类型的类),这通常是页面加载或Ajax调用。由于你已经指出的原因。
请记住:互联网上的信息是免费的,您可以获得所需的费用。