减少 MVC 网站中的数据库调用次数
Reduce the number of database calls in a MVC website
我有一个连接到多个数据库的复杂 C# MVC 4 网站。每个请求都经过以下步骤
- 检查用户是否登录并从身份验证 cookie 中获取用户名。
- 查询查找数据库以找出客户端数据库的位置并获取它的连接字符串(我们为每个客户端维护一个不同的数据库)。
- 连接到客户端数据库并运行查询以获取用户的详细信息(ID、phone 号码、偏好等)。
- 根据请求执行select/update/delete或插入。
除了上述步骤之外,我们还有各种操作过滤器,用于查询数据库和检查角色等。这些操作过滤器必须执行步骤 1、2、3 和 4 来获取用户信息。我现在发现应用程序 运行 由于需要执行的查询数量而变慢。我可以通过在会话中缓存连接字符串和用户详细信息来显着加快速度。
我们很快会将网站移至服务器场,我不想依赖会话进行缓存。是否有任何其他明显的设计选择被我忽略了,或者我是否必须继续使用 memcached 形式的缓存或一些适用于整个服务器场的解决方案?
编辑:
我应该提到数据库和网站位于不同的服务器上,有时数据库调用必须通过 WAN 进行,具体取决于客户端的位置。我已经测量过性能并且知道数据库调用是导致性能不佳的原因。
您是否考虑过将客户端 ID 存储在身份验证 cookie 中,然后保留 [ClientId -> ConnectionString] 的服务器端缓存?
您可以在第一步后生成和验证 cookie,并将数据保存在会话或 cookie 中。稍后您可以使用之前存储的数据 cookie/session 并跳过第 1 步。
您可以尝试使用集群索引来更快地获取数据
您可以在此处尝试使用 HttpCookie
和 AuthenticationCookie
来维护您将跨视图和控制器访问的冗余数据的状态。我想说的一个简单示例是维护已登录用户的 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 或名称或 Phone 号码或其他任何内容时都访问数据库。您只需从您创建的 cookie 中检索该信息。
希望对您有所帮助。
我有一个连接到多个数据库的复杂 C# MVC 4 网站。每个请求都经过以下步骤
- 检查用户是否登录并从身份验证 cookie 中获取用户名。
- 查询查找数据库以找出客户端数据库的位置并获取它的连接字符串(我们为每个客户端维护一个不同的数据库)。
- 连接到客户端数据库并运行查询以获取用户的详细信息(ID、phone 号码、偏好等)。
- 根据请求执行select/update/delete或插入。
除了上述步骤之外,我们还有各种操作过滤器,用于查询数据库和检查角色等。这些操作过滤器必须执行步骤 1、2、3 和 4 来获取用户信息。我现在发现应用程序 运行 由于需要执行的查询数量而变慢。我可以通过在会话中缓存连接字符串和用户详细信息来显着加快速度。
我们很快会将网站移至服务器场,我不想依赖会话进行缓存。是否有任何其他明显的设计选择被我忽略了,或者我是否必须继续使用 memcached 形式的缓存或一些适用于整个服务器场的解决方案?
编辑: 我应该提到数据库和网站位于不同的服务器上,有时数据库调用必须通过 WAN 进行,具体取决于客户端的位置。我已经测量过性能并且知道数据库调用是导致性能不佳的原因。
您是否考虑过将客户端 ID 存储在身份验证 cookie 中,然后保留 [ClientId -> ConnectionString] 的服务器端缓存?
您可以在第一步后生成和验证 cookie,并将数据保存在会话或 cookie 中。稍后您可以使用之前存储的数据 cookie/session 并跳过第 1 步。
您可以尝试使用集群索引来更快地获取数据
您可以在此处尝试使用 HttpCookie
和 AuthenticationCookie
来维护您将跨视图和控制器访问的冗余数据的状态。我想说的一个简单示例是维护已登录用户的 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 或名称或 Phone 号码或其他任何内容时都访问数据库。您只需从您创建的 cookie 中检索该信息。
希望对您有所帮助。