Это может звучать глупо, но я думал, что
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 - Матти