我的目标是在读取Datareader返回的结果时获得更好的性能。请考虑以下示例以更好地理解问题。
我们已经说过从datareader返回的10个结果集。当我们遍历这些记录来填充我们的对象时,所花费的总时间大约是3秒。现在我被问到如何在1秒内完成这些操作。
这可以通过在datareader中同时处理读取操作来实现吗?如果是,我们怎么做呢?
IDataAccessMapper _dataAccessMapper;
var query = new StringBuilder();
query.Append("SELECT * FROM Step01");
query.Append("SELECT * FROM Step02");
query.Append("SELECT * FROM Step03");
......
query.Append("SELECT * FROM Step10");
var selCommand = dbContracts.GetTextCommand(query.ToString());
var dataReader = selCommand.AsReader();
while (dataReader.Read()){
//Do something
}
var step1Details = new Collection<Step1Details>
if (dataReader.NextResult()){
_dataAccessMapper.MapRecords<Step1Details>(dataReader, step1Details);
}
var step2Details = new Collection<Step2Details>
if (dataReader.NextResult()){
_dataAccessMapper.MapRecords<Step2Details>(dataReader, step2Details);
}
....
....
var step10Details = new Collection<Step10Details>
if (dataReader.NextResult()){
_dataAccessMapper.MapRecords<Step10Details>(dataReader, step10Details);
}
....
答案 0 :(得分:0)
DataReader不保证是线程安全的,虽然我认为这个问题来自Connection类,它不是线程安全的。你可以做的是运行单独的线程(使用自己的Connection)来执行各个select语句并同时处理数据。这也将确保每个线程使用自己的DataReader。
请注意,可以选择使用SQL Server中的相同Connection执行多线程,称为MARS(多活动记录集)。但我认为这不是一个很好的方法,可以实现你想要达到的目标。