我有一個頁面需要經常對大數據集運行查詢。爲了減輕數據庫的負擔,我設置了一個緩存,每5分鐘刷新一次。 邏輯是: 進行調用時,檢查緩存中是否有數據,如果是,請在緩存上運行queryu。如果沒有,則在我的存儲庫上運行查詢時,啓動從數據庫的所有行中獲取數據的任務,以獲取該調用所需的數據。取出所有行時,將其放入緩存中,以便在下次調用時訪問它。問題是我有時會得到一個:「Message =」已經有一個與此命令關聯的打開的DataReader,它必須先關閉。「我想這是因爲它同時向同一個存儲庫運行兩個查詢(一個用於所有行和一個用於查詢)。我有我的連接字符串支持MARS。從緩存提取數據(如果可用),如果不提取數據庫
我的代碼
public IQueryable<TrackDto> TrackDtos([FromUri] int[] Ids)
{
if (HttpContext.Current.Cache["Tracks"] != null && ((IQueryable<TrackDto>)HttpContext.Current.Cache["Tracks"]).Any())
{
var trackDtos = Ids.Length > 0
? ((IQueryable<TrackDto>)HttpContext.Current.Cache["Tracks"]).Where(trackDto => Ids.Contains(trackDto.Id).AsQueryable()
: ((IQueryable<TrackDto>)HttpContext.Current.Cache["Tracks"]).AsQueryable();
return trackDtos;
}
else
{
UpdateTrackDtoCache(DateTime.Today);
var trackDtos = Ids.Length > 0
? WebRepository.TrackDtos.Where(trackDto => trackDto.Date == DateTime.Today && Ids.Contains(trackDto.Id)).AsQueryable()
: WebRepository.TrackDtos.Where(trackDto => trackDto.Date == DateTime.Today).AsQueryable().AsQueryable();
return trackDtos;
}
}
private IQueryable<TrackDto> MapTrackDtosFromDb(DateTime date)
{
return WebRepository.TrackDtos.Where(tdto => tdto.Date == date.Date);
}
private void UpdateTrackDtoCache(DateTime date)
{
if (CacheIsUpdating)
return;
CacheIsUpdating = true;
var task = Task.Factory.StartNew(
state =>
{
var context = (HttpContext)state;
context.Cache.Insert("Tracks", MapTrackDtosFromDb(date), null, Cache.NoAbsoluteExpiration,
new TimeSpan(0, 5, 0));
CacheIsUpdating = false;
},
HttpContext.Current);
}