2013-12-17 20 views
0

我有一個頁面需要經常對大數據集運行查詢。爲了減輕數據庫的負擔,我設置了一個緩存,每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); 
    } 

回答

0

我相信你使用的是相同的活動連接運行DML或DDL SQL查詢。而MARS不允許這樣做,你可以執行多個select語句或者批量插入,但是如果你運行多個update,delete語句或者你的sql執行會引發這種錯誤,即使你運行一個更新sql查詢,同時運行一個select sta在同一個命令上你會得到這個錯誤。欲瞭解更多信息,請閱讀

http://msdn.microsoft.com/en-us/library/h32h3abf(v=vs.110).aspx