1

我有一个(静态)表,我需要非常频繁地访问它。因此我在运行时缓存它。

现在我使用 DataTable 来存储信息并使用 Select() 来检索它(过滤通常分布在 2 或 3 列上)。但这似乎非常(!)缓慢并且是主要瓶颈。

因此:缓存数据库表(在 .Net 2.0 中)的最佳方式是什么以及如何以最快的速度访问它?


[编辑 1]

DataTable cache = new DataTable();
cache.Columns.Add("id", typeof(int));
cache.Columns.Add("data_id", typeof(int));
cache.Columns.Add("data", typeof(string));
cache.Columns.Add("value", typeof(float));

例如:

DataRow[] result1 = cache.Select("id = 1 AND data_id = 2 AND data = 'some data'");
DataRow[] result2 = cache.Select("data = 'some other data'", "data desc");

[编辑 2]

考虑到@MichaelPerrenoud 的建议,我最终实现了一个字典。请记住,这种设计是针对我需要缓存的数据库表的结构。

Dictionary<string, Dictionary<NewObject, float>> cache;
class NewObject {int id; int data_id;}

这样,缓存将数据作为 [key] 并将新字典作为 [value]。后者将id + data-id作为 [key] ,将 value 作为 [ value ] 。

在访问数据时,此 Dictionary比 DataTable 快~%90 。

4

1 回答 1

1

所以我认为对你来说一个好的解决方案是这样的。我假设您在最初获得数据DataTable后拥有 。

免责声明:我尚未编译此代码 - 这是一个概念 - 您可能需要修复一些语法。

Dictionary<string, List<DataRow>> CacheData(DataTable t, params string[] fields)
{
    Dictionary<string, List<DataRow>> cache = new Dictionary<string, List<DataRow>>();
    StringBuilder key = new StringBuilder();

    foreach (DataRow r in t.Rows)
    {
        key.Clear();
        foreach (string f in fields)
        {
            if (key.Length > 0) { key.Append("_"); }
            key.Append(Convert.ToString(r[f]);
        }

        if (!cache.ContainsKey(key.ToString())) { cache.Add(key.ToString(), new List<DataRow>()); }
        cache[key.ToString()].Add(r);
    }
    return cache;
}

现在,您可以以任何您认为合适的方式存储这些字典,然后在需要时从中提取数据,例如,如果您需要处理第一个示例,它可能看起来像这样来创建缓存:

CacheData(table, "id", "data_id", "data");

然后要获取数据,您将构建一个像这样的字符串:

string key = "1_2_some data";

并从字典中拉出行列表,如下所示:

dictionary[key];

这将返回 aList<DataRow>供您使用。


但是,您只需要这样做一次,然后一遍又一遍地利用这些字典。

于 2013-03-19T16:46:40.630 回答