c# - 将数据保存在内存中

标签 c# .net multithreading memory collections

我有一个 http 处理程序,我将每个请求存储到内存中的并发队列集合中。一段时间后,我将集合批量插入到数据库中。

这是个坏主意吗?因为体积大,这似乎是 IMO 更好的方法。

我确实看到了一些差异(命中数与数据库中存储的元素数),由于线程,当我刷新并发集合时,我锁定它并批量插入其内容,然后清空集合。然后从集合中删除锁。

有更好的做法吗?或者你做过类似的事情吗?

最佳答案

抱歉,但我会说这是个坏主意。存在以下问题:

  • 如果应用程序池在数据写入数据库之前回收,您将丢失数据
  • 将所有数据保存在同一个集合中会导致需要在插入数据、将数据写入磁盘和清除集合时锁定该集合。这可能会导致整个网站在批量插入期间暂停。
  • 您的代码将因额外的步骤而变得更加复杂。解决线程问题很困难

我们编写的 Web 应用程序可以在峰值负载时每秒向 SQL Server 数据库写入 1000 行。

首先尝试编写尽可能简单的应用程序,然后对其进行性能测试。

插入数据库的速度很大程度上取决于您的硬件,但您也可以在程序中执行一些操作:

  • 表上只有一个索引(聚集)。 key 自动编号。
  • 确保尽快释放与数据库的连接。

关于c# - 将数据保存在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132175/

相关文章:

c# - WPF UI 仅在调试时崩溃

c# - 如何在具有相同参数的两个不同操作方法之间进行路由

c# - 嵌套列表,我如何使用 lambda 表达式来做到这一点?

c# - 某些项目无法加载 PDB 文件

python - wxPython 与长时间运行的进程卡住动画 gif

c# - 从另一个线程更新标签

python - 使用线程时单元测试 Python 中的 time.sleep()

c# - 我可以仅按文件名查找文件吗(即扩展名未知)

c# - Linq 按日期和时间分组顺序

c# - 什么是托管原型(prototype)?