【发布时间】:2014-08-26 11:32:35
【问题描述】:
这个问题以前曾被问过,但不是在多线程应用程序的上下文中。
因此,给定一个单线程应用程序,字典将在 O(1) 时间内找到给定键的值。给定一个表(来自数据库),该表在“X”列上有一个主键(簇索引),搜索与“X”列上的键相关联的元组将在 O(log n) 时间内找到该元组。添加字典的内存优势,字典胜出。
给定一个高度并行(例如异步套接字服务器)应用程序,该应用程序依赖于一个通用数据结构(即字典 vs 数据库)来维护应用程序范围的状态信息(例如连接的用户),其中 50% 的访问是读取,大约 50 % 的访问是更新/删除/插入,在我看来字典更好。原因如下:
1) 要使字典对并发访问是线程安全的,必须使用锁定机制。 lock() 将锁定整个字典,并且一次只允许一个线程访问数据结构。即使使用 readerWriterLockSlim 也会在提升到 writeLock 时锁定整个字典。
2) 数据库在更新/删除/插入主键时提供行级锁定的好处。
3) 字典在内存中(更快),而数据库连接使用套接字(更慢)
所以问题是,关系数据库继承的行级锁定特性是否比内存中字典访问的好处更重要?
【问题讨论】:
-
这个项目有多大?有多少行和表?
-
在任何给定时间大约有 50 个并发用户都在以大约每秒一次的速率发送状态信息。
标签: c# database sockets dictionary