Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 缓存IReader的好处是什么?_C#_Sql_Sql Server_Caching - Fatal编程技术网

C# 缓存IReader的好处是什么?

C# 缓存IReader的好处是什么?,c#,sql,sql-server,caching,C#,Sql,Sql Server,Caching,回顾一些遗留代码,有一个常用的表很少更新 为了避免每次都要不断地访问数据库以获取相同的数据,开发人员似乎在尝试缓存数据。代码如下所示: private static IDataReader _cachedCheckList; public override IDataReader GetDataReader() { if (_cachedCheckList == null) { using (var oneTimeR

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

为了避免每次都要不断地访问数据库以获取相同的数据,开发人员似乎在尝试缓存数据。代码如下所示:

    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缓存的原因如下:- DataReader只读和仅向前。它从数据库中获取记录并存储在网络缓冲区中,并在任何时候发出请求。DataReader在查询执行时释放记录,不等待整个查询执行。因此,与数据集相比,它的速度非常快。它仅在调用read方法时释放

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

Cache["Data"] = DataTable;
从不缓存DataReader对象。由于DataReader对象保持与数据库的开放连接,因此缓存该对象会延长连接的生存期,从而影响数据库的其他用户。此外,由于数据读取器是一个仅向前的数据流,因此在客户端读取信息后,无法再次访问该信息。缓存它将是徒劳的

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


上述引用取自

从IO读取数据的成本是从内存读取的成本的数倍。也就是说,好处完全取决于访问数据的频率。不利的一面是缓存的数据可能会过时。@juharr-正在缓存的是
DataReader
,而不是数据。OP询问为什么要缓存
数据读取器本身。@DigiFriend我们不知道缓存了什么,因为我们没有
CachedDataReader
的代码。缓存
DataReader
真的很蠢,所以我给了代码的创建者一个怀疑的机会。@juharr-OP似乎暗示了这就是发生的事情,这就是为什么他们首先要问这个问题。@DigiFriend我把IReader加载到内存中意味着它将数据读入内存,并不是说它只保留了对
DataReader
的引用。如果这样做了,就不需要另一个类,只需将
DataReader
插入一个全局变量。长话短说,除非OP向我们提供缺少的代码,否则我们不会知道。OP似乎理解什么是缓存以及为什么使用缓存。OP不清楚为什么要缓存
数据读取器
,因为它只是读取器,而不是数据。