繁体   English   中英

减少MVC网站中的数据库调用次数

[英]Reduce the number of database calls in a MVC website

我有一个复杂的C#MVC 4网站,可以连接到多个数据库。 每个请求都经过以下步骤

  1. 检查用户是否登录并从身份验证cookie中获取用户名。
  2. 查询查找数据库以找出客户端数据库所在的位置,并获取其连接字符串(我们为每个客户端维护一个不同的数据库)。
  3. 连接到客户端数据库并运行查询以获取用户的详细信息(ID,电话号码,首选项等)。
  4. 根据请求执行选择/更新/删除或插入。

除了上述步骤之外,我们还具有各种操作筛选器,用于查询数据库并检查角色等。这些操作筛选器必须执行步骤1,2、3和4才能获取用户信息。 我现在发现该应用程序由于需要执行的查询数量而运行缓慢。 通过在会话中缓存连接字符串和用户详细信息,我可以大大加快速度。

我们将很快将网站移至服务器场,并且我不想依赖会话进行缓存。 我还有其他明显的设计选择要忽略吗?还是必须继续以memcached形式使用缓存或在整个服务器场中均可使用的某些解决方案?

编辑:我应该提到数据库和网站位于不同的服务器上,有时必须根据客户端的位置通过WAN进行数据库调用。 我已经测量了性能,并且知道数据库调用是性能下降的原因。

您是否考虑过将客户端ID存储在身份验证Cookie中,然后保留[ClientId-> ConnectionString]的服务器端缓存?

您可以在第一步之后生成并验证Cookie,然后将数据保存在会话或cookie中。之后,您可以使用先前存储的cookie /会话中的数据,并跳过步骤1。

您可以尝试集群索引以更快地获取数据

您可以在此处尝试使用HttpCookieAuthenticationCookie来维护将在视图和控制器之间访问的冗余数据的状态。 我想说的一个简单示例是维护已登录用户的userId和userName的状态。这可以用作参考:

private void SetCookie(string userName, long userId)
{
   string IdUser = Common.Encrypt(userId.ToString());
   FormsAuthentication.SetAuthCookie(userName, false);
   HttpCookie uCookie = new HttpCookie("UserId", IdUser);
   Response.Cookies.Add(uCookie);
}

这只是一个示例代码,显示了如何生成Cookie。 在cookie中设置信息之后,您无需在每次需要该ID或姓名或电话号码或其他任何信息时都访问数据库。 您只需要从创建的cookie中检索该信息。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM