如何为缓存或内存db类实现表范围锁定(Monitor)?

时间:2012-01-04 17:37:42

标签: c# multithreading ado.net concurrency

这可能听起来很愚蠢,但我想要

public class DbCache
{
    private static Dictionary<string, DbDataAdapter> _dataAdapters;
    private static DataSet _dataSet = new DataSet();

    public void LoadTable(string tableName)

    public void InsertData(string tableName, ...)

    public void GetData(string tableName, ...)

作为内部数据结构和方法。 Dictionary的字符串键是db-table的名称。问题是DataTable可以完全加载或一次加载一行,同时可以添加新行。 GetData调用DataAdapter.Fill,返回1或0行的SQL查询。所以DataTable一直在变化。我不想锁定整个事情,而是在表级别上执行。因此,如果一个线程调用DbCache.GetData(“Orders”,...)和一个线程DbCache.GetData(“Customers”,...),则不会有任何锁定。如果两个线程都想要操作同一个表,则会有Monitor,以便其他线程必须等待。

是否有可能:

    private static Dictionary<string, object> _locks;

然后:

    private void PopulateLocks()
    { 
        foreach (string tableName in _dataAdapters.Keys)
        {
            _locks.Add(tableName, new object());
        }
    } 

    public void GetData(string tableName, ...)
    {
         if (Monitor.TryEnter(_locks[tableName], 10000))
         {
              try
              {
                   ...
              }
              catch (Exception e)
              {
                   ...
              }
              finally
              {
                  Monitor.Exit(_locks[tableName], 10000);
              }
          }
     }

其他方法将使用相同的锁定方案,因此如果只有一个线程可以随时读取或写入DataTable(即使读取将“锁定”,因为如果找不到想要的行,则可能涉及从db获取更多行。

那么2个问题?会有用吗?它有意义吗?

谢谢&amp; BR - 马蒂

0 个答案:

没有答案