缓存IReader有什么好处?

时间:2017-05-02 13:05:00

标签: c# sql sql-server caching

回顾一些遗留代码,有一个常用的表,很少更新。

为了节省不得不经常访问数据库以获取每次相同的数据,似乎开发人员正在尝试缓存数据。代码如下所示:

    private static IDataReader _cachedCheckList;
    public override IDataReader GetDataReader()
    {
        if (_cachedCheckList == null)
        {
            using (var oneTimeRead = base.GetDataReader())
            {
                _cachedCheckList = new CachedDataReader(oneTimeRead);
            }
        }
        return _cachedCheckList ?? base.GetDataReader();
    }

然后在系统的其他地方使用它的函数遵循以下模式:

        IDataReader reader = new CheckList().GetDataReader();
        while (reader.Read())
        {
            [snip]
        }

通过将IReader加载到内存中,我认为这不会提高性能。

我试图了解开发人员对此代码的原因。缓存IReader有什么好处?

更新:CachedDataReader()方法基本上是:

SqlConnection connection = new SqlConnection(ConnectionString);
connection.Open();
var sqlCommand = new SqlCommand(commandText, connection)
command.CommandType = CommandType.StoredProcedure;
return command.ExecuteReader();

我之前没有看到有人缓存过DataReader,并且想知道在重构代码之前有充分的理由这样做。

2 个答案:

答案 0 :(得分:-1)

可能是 他们使用DataReader缓存有以下原因,它们如下: - DataReader只读取和转发。它从数据库中获取记录并存储在网络缓冲区中,并在每次请求时提供。 DataReader在查询执行时释放记录,不等待整个查询执行。因此,与数据集相比,它非常快。它仅在调用read方法时释放。

  

不应缓存DataReader。您应该在DataSet或DataTable中获取数据,然后使用:

Cache["Data"] = DataTable;
     

永远不要缓存DataReader对象。由于DataReader对象包含与数据库的开放连接,因此缓存对象会延长连接的生命周期,从而影响数据库的其他用户。此外,由于数据读取器是仅向前的数据流,因此在客户端读取信息之后,无法再次访问该信息。缓存它将是徒劳的。

     

缓存DataReader对象会严重影响应用程序的可伸缩性。您可以保持连接打开并最终缓存所有可用连接,从而使数据库无法使用,直到关闭连接。无论您使用何种缓存技术,都不要缓存DataReader对象。

以上引自https://forums.asp.net/post/3224692.aspx

答案 1 :(得分:-1)

由于DataReader使用连接的体系结构。它在通过每个记录循环时保持数据库连接。因此数据库连接将保持很长时间。

因此,缓存DataReader确实没有任何好处。

当需要缓存时,我们使用数据集,因为它在断开连接的架构中工作。

甚至SqlParameter也缓存在旧的Microsoft企业库DAL中。但同样,这只有更多的缺点。

好奇,你错过了连接打开到连接关闭之间的代码