首先让我解释一下我的情景:
我正在使用C#Asp.net开发一个测验引擎。可以选择一次显示一个问题。由于会有很多用户访问测验,我不想为每个问题进行数据库调用。理想情况下,我想加载页面加载的所有问题,并以某种方式一次显示一个问题。
每个问题的操作:
问题控件将根据问题类型动态生成。
在每个问题之后,我需要保存用户响应。
通过保存数据库调用来实现此目的的理想方法是什么?我真的很喜欢一些方向。提前谢谢。
答案 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)
您可以在会话变量中存储用户的问题,但您应该考虑这会如何影响内存使用情况。通过为每个用户存储大量数据,可用内存将限制应用程序可以处理的用户数量。
通过从数据库中获取每个问题,每个页面请求的处理时间会稍长,但您可以将瓶颈从可以处理的用户数量转换为每秒可处理的页数。这也是一个更软的限制,即服务器只需要更长的时间来响应你的容量,而不是因为内存不足而开始丢弃用户会话。