回顾一些遗留代码,有一个常用的表,很少更新。
为了节省不得不经常访问数据库以获取每次相同的数据,似乎开发人员正在尝试缓存数据。代码如下所示:
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,并且想知道在重构代码之前有充分的理由这样做。
答案 0 :(得分:-1)
不应缓存DataReader。您应该在DataSet或DataTable中获取数据,然后使用:
Cache["Data"] = DataTable;
永远不要缓存DataReader对象。由于DataReader对象包含与数据库的开放连接,因此缓存对象会延长连接的生命周期,从而影响数据库的其他用户。此外,由于数据读取器是仅向前的数据流,因此在客户端读取信息之后,无法再次访问该信息。缓存它将是徒劳的。
缓存DataReader对象会严重影响应用程序的可伸缩性。您可以保持连接打开并最终缓存所有可用连接,从而使数据库无法使用,直到关闭连接。无论您使用何种缓存技术,都不要缓存DataReader对象。
答案 1 :(得分:-1)
由于DataReader使用连接的体系结构。它在通过每个记录循环时保持数据库连接。因此数据库连接将保持很长时间。
因此,缓存DataReader确实没有任何好处。
当需要缓存时,我们使用数据集,因为它在断开连接的架构中工作。
甚至SqlParameter也缓存在旧的Microsoft企业库DAL中。但同样,这只有更多的缺点。
好奇,你错过了连接打开到连接关闭之间的代码