Как реализовать блокировку области таблицы (Монитор) для кэша или в памяти класса БД? - PullRequest
0 голосов
/ 04 января 2012

Это может звучать глупо, но я думал, что

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, ...)

- как внутренние структуры данных и методы.Строковый ключ словаря - это имя таблицы базы данных.Дело в том, что DataTable может быть загружен целиком или по одной строке за раз, и в то же время могут быть добавлены новые строки.GetData вызывает DataAdapter.Fill с SQL-запросом, возвращающим 1 или 0 строк.Поэтому DataTable все время меняется.Я не хочу блокировать все это, но делаю это на уровне стола.Таким образом, если один поток вызывает DbCache.GetData («Заказы», ​​...) и один поток DbCache.GetData («Клиенты», ...), блокировки не будет.Если оба потока хотят манипулировать одной и той же таблицей, то будет 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);
              }
          }
     }

Другие методы будут использовать ту же схему блокировки, поэтому, если только 1 поток может читать или записывать DataTable в любое время (даже чтение будет «за пределами блокировки», поскольку может потребоваться получить больше строк из БД, если требуемая строка не быланайдено.

Итак, 2 вопроса? Будет ли это работать? Имеет ли это какой-то смысл?

Спасибо & BR - Матти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...