2017-06-02 56 views
0

我有一个开始大量使用的大型企业Web应用程序。最近我注意到,我们正在进行许多数据库调用,例如用户权限,访问权限,配置文件信息的一般位。大型应用程序 - 如何处理数据访问

从我在Azure上可以看到的数据来看,我们每小时平均查看50,000 db查询。

我们使用Linq通过DevExpress XPO ORM进行查询。现在其中一些是连接,但大多数都是简单的1表查询。

是否不断触碰数据库是访问此类信息的最佳方式?我们是否有办法卸载数据库工作,因为这些信息中的一些永远不会改变?

在此先感谢。

+1

您的问题是非常广泛和不确定的。我们无法了解您的设置,所以不能提出改进建议。即使*如果*你提供的这个问题太广泛了,因为有几十个优化机会。此外,你认为“大量使用”和“大量数据库调用”可能是相关的。特别是它不是Linq *或*存储过程,它也可以是一个加法。这两者都没有什么区别,它们完全取决于你如何使用它们。 – HimBromBeere

+0

谢谢队友,对不起,问题是模糊的。我已经重新措辞,希望它更清楚。 – bExplosion

+1

每小时50K查询并不大。标准指导适用。不要认为数据库很慢,它始终是您的代码。使用适当的模式,索引。不要加载你不想要的东西。不要使用ORM进行报告。使用乐观并发。不要使用事务,因为有人误解了“每次请求事务”的含义。 –

回答

2

让我们开始对此进行透视。一小时内3600秒,每秒钟少于20次操作。在任何测量中都很低。

也就是说,例如缓存用户权限,例如30秒或一分钟,没有任何问题。

通常尝试缓存不在您的代码中,但在前面 - ASP.NET输出缓存和甜甜圈缓存是大多数忽略但仍然最有效的概念。

http://www.dotnettricks.com/learn/mvc/donut-caching-and-donut-hole-caching-with-aspnet-mvc-4

有更多的信息。然后忽略所有的大数字并运行一个分析器 - 看看你真正的重量级玩家是什么(可能在每个页面上都使用这些权限)。把它放到一个子系统中并缓存它。假设你可以将它预先加载到asp.net子系统中的用户标识对象中 - 你的代码不应该碰到页面中的数据库,所以缓存在asp.net中的一些过滤器中是孤立的。

措施。确保你的SQL很聪明 - EF和LINQ导致非常愚蠢的SQL,因为人们太懒惰了。避免实例化完整的对象只是为了抛弃它们,只问你需要的字段。确保你的指数是有效的。当你开始有一个真正的问题(测量)时回来。

但是旧的规则是:缓存提前。而且LINQ优化在后面还相当远。

+0

提到LINQ和连接的问题表明ORM已经存在问题组态。我还会添加'不要使用事务,因为您认为乐观并发是棘手的''并且'忘记每个请求的事务,它并不意味着数据库事务'。这两个足以使写得不好的ORM代码的行为比VB6和ADO代码差几个数量级 –

+0

只是对问题做了一个快速更改,实际上我们并没有使用事务。我使用了错误的词:) – bExplosion

+0

谢谢汤姆,我将与分析一起研究这一点。 – bExplosion

0

为了从数据库中获取用户特定的信息,如配置文件,访问等,而不是为每个请求提取它,最好在登录时获取一次信息并保持会话。这应该减少您与数据库的交易

相关问题