我的sql数据库中有三个表说特价,商家,评论。在我的主页面中,我有一个提示区域,我需要在每次页面刷新期间根据某些条件显示这3个表中的替代数据(这些表有超过1000条记录)。那么在这种情况下,从这些表中检索数据的最佳选择是什么?
每次从数据库访问数据都不是一个好主意我知道,有没有其他好方法可以做到这一点,比如缓存或任何其他有效管理它的新技术。现在每次刷新页面后加载页面需要花费太多时间。
请提出您的建议。
目前我计划的是创建一个用于数据检索的SP并保持在Session中返回的值。
这样我们就可以访问此会话中的数据,而不是每次刷新页面时都转到DB。但是不知道还有其他有效的方法来实现同样的目标。
答案 0 :(得分:3)
每次从数据库访问数据都不是一个好主意
并非总是如此,这取决于数据变更的频率。如果选择缓存数据,则每次更改数据时都必须重新验证数据。我假设你不想显示静态计数或曾经显示的东西不会改变。如果情况并非如此,您只需存储在Cookie中并从那里进行显示即可。
现在每次刷新页面后加载页面需要花费太多时间。
你知道什么需要花费太多时间吗?是客户端代码还是服务器端代码(使用Glimpse知道)?如果服务器端,它是在内存操作中命中数据库和查询执行时间或其服务器端的代码。
通常,提高性能的第一步是精确测量它,为了解决这些问题,您应该知道问题所在。
根据你的第一个陈述,如果我是你,我会在一个单独的div中显示每个计数,它将异步刷新。您可以选择使用计时器定期更新数据,甚至可以更好地从服务器推送数据(使用SignalR)。更新将以透明方式进行,因此无需重新加载页面。
希望这有帮助。
答案 1 :(得分:1)
我同意1000条记录看起来并不多,但如果你真的不担心会有轻微的延迟,你可以尝试使用HttpContext.Cache对象。它非常像一个包含字符串键和对象值的字典,另外还可以设置过期等...
原谅错别字,在移动设备上没有编译检查:
var tableA = HttpContext.Cache.Get("TableA")
if tableA == null {
//if its null, there was no copy in the cache so create your
//object using your database call
tableA = Array, List, however you store your data
//add the item to the cache, with an expiration of 1 minute
HTTPContext.Cache.Insert("TableA", tableA, null, NoAbsoluteExpiration, TimeSpan(0,1,0))
}
现在,无论有多少请求通过,您只需每分钟打一次数据库,或者根据您的需要认为合理的时间长一次。如果发生某些特定情况,您还可以触发从缓存中删除项目。
答案 2 :(得分:0)
一个建议是将您的数据库视为仅仅保存状态的存储库。您的应用程序层可以缓存业务对象的集合,在更改时保留它们,并立即将状态返回到您的表示层(网页)。
这假设所有数据更新都来自您的页面。如果从不同的地方填充数据库,则需要将所有内容绑定到公共应用程序层,或者轮询数据库以更新缓存。