asp.net - 一种在页面上存储 View 以及何时保存到数据库的快速方法

标签 asp.net database performance

我想实现一个像大多数论坛、Youtube 和其他几个论坛一样的观看次数计数器。因此,每次用户阅读一篇文章时,都会存储并记住该文章。我也想知道谁看过这篇文章。

我的问题是:如何有效地实现这一点?最佳实践是什么?

一种方法是为每个 View 调用一个存储过程,但这会导致对数据库大量不必要的调用

另一种方法是将其存储到某个全局应用程序对象,然后每 5 分钟左右存储在数据库中(您甚至可以用一种好的方式做到这一点吗?)

最好的方法是什么?

最佳答案

数据库操作非常便宜,而且确实不值得担心。如果数据库操作的成本稍高,那么您始终可以将阻塞操作委托(delegate)给新线程,从而释放页面生成线程(对于从数据库不返回任何内容的 UPDATE 和 INSERT 操作,您可以轻松地执行此操作 -它们是无关紧要的)。

存储过程现在并不流行 - 它们从预先计算的执行计划中获得的性能优势几乎被消除了,因为现代服务器缓存了所有先前查询的计划,并且对于简单的 SELECT、INSERT 和 UPDATE 操作,您可以开始遭受代码复杂性增加的困扰。现在内联 SQL 命令没有任何问题。

无论如何,回到主题并总结一下:您的假设是错误的。在每个页面 View 上运行 UPDATE Pages SET ViewCount = ViewCount + 1 WHERE PageId = @pageId 没有任何问题。这样做也没有任何问题:INSERT INTO UserPageviews (UserId, PageId, DateTime) VALUES (@userId, @pageId, NOW())。这两个操作都非常便宜,即使在旧的数据库服务器上也能在 2-3 毫秒内执行。

关于asp.net - 一种在页面上存储 View 以及何时保存到数据库的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12556367/

相关文章:

java - J2ME 中的哈希表效率

c# - SelectedIndexChanges 在 TextChanged 事件之前触发

android - [android]如何在缺少一列的情况下向数据库添加新列?

sql - 选择具有分区时间戳的查询

java - 由 : android. database.sqlite.SQLiteException 引起:接近 "":语法错误(代码 1):

java - GC 期间 JVM 标记 GC 线程的 -XX :+UseDynamicNumberOfGCThreads -XX:+TraceDynamicGCThreads enabled to see no.。请解释一下输出日志?

asp.net - 最好是处理 SQL 异常还是使用 customError 页面和 Global.asax 中的 Application_Error 方法?

c# - ASP.NET 在引号前的字符串中添加斜杠

c# - 使用反射获取未由接口(interface)实现的对象的所有属性

performance - 搜索响应时间不稳定地翻了一番