这可能听起来很愚蠢,但我想要
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 - 马蒂