保存数据库调用 - 一次显示一行

时间:2009-11-23 02:22:48

标签: asp.net sql-server caching

首先让我解释一下我的情景:

我正在使用C#Asp.net开发一个测验引擎。可以选择一次显示一个问题。由于会有很多用户访问测验,我不想为每个问题进行数据库调用。理想情况下,我想加载页面加载的所有问题,并以某种方式一次显示一个问题。

每个问题的操作:

  1. 问题控件将根据问题类型动态生成。

  2. 在每个问题之后,我需要保存用户响应。

  3. 通过保存数据库调用来实现此目的的理想方法是什么?我真的很喜欢一些方向。提前谢谢。

5 个答案:

答案 0 :(得分:2)

除非你期望高达每秒数百的交易率,否则我不会打扰。

过早优化会导致实际问题,只能解决虚构问题。

现代DBMS拥有非常有效的缓存机制,为什么要重新发明轮子呢?保持您的应用程序简单到位,让DBMS处理缓存并解决您实际拥有它们时的任何性能问题。

答案 1 :(得分:1)

我对所有用户的问题都是一样的,那么您可以考虑使用应用程序范围的问题和响应缓存。为此,您可以一次性获取所有问题或第一次获取问题,然后将其缓存。

对于每个用户的内容,例如保存对问题的回答,您可以使用会话对象。由于您在应用程序范围的缓存中有问题及其相关选项,因此您只能在会话对象中保存问题关键字和所选选项。

答案 2 :(得分:0)

使用JavaScript应该相对容易实现。 您只需将所有问题存储在本地哈希表(简单的javascript对象)中,然后显示然后您喜欢。

您可以使用/重复使用jQuery Quiz plug in,或只是查看并了解一些提示和技巧(see this page as well)

答案 3 :(得分:0)

  

理想情况下我想加载所有   关于页面加载的问题,以某种方式   一次显示一个问题。

这意味着某种缓存。不要使用会话状态,因为您无法将其从一个用户共享到另一个用户。

您可能想要使用Cache对象。例如,(从您的代码背后):

DataSet quiz;
string quizName = "quiz#1";
lock (quizLock)
{
    quiz = (DataSet)this.Cache[quizName];
    if (quiz == null)
    {
        quiz = DAL.ReadQuiz(quizName);
        this.Cache.Insert(quizName, quiz);
    }
}

答案 4 :(得分:-1)

您可以在会话变量中存储用户的问题,但您应该考虑这会如何影响内存使用情况。通过为每个用户存储大量数据,可用内存将限制应用程序可以处理的用户数量。

通过从数据库中获取每个问题,每个页面请求的处理时间会稍长,但您可以将瓶颈从可以处理的用户数量转换为每秒可处理的页数。这也是一个更软的限制,即服务器只需要更长的时间来响应你的容量,而不是因为内存不足而开始丢弃用户会话。