//Select文を実行してその結果をCachedResultsオブジェクトで取得する public CachedResults ExecSelectForCache(DbConn aDbConn , string sql , IEnumerable <string> usedTables) { //キャッシュが利用できない場合、トランザクションを開始する try { //トランザクションを開始する aDbConn.BeginTran(); } catch (Exception ex) { //Error1状態に遷移して例外を再送出する aDbConn.GoToError1AndThrow(ex); throw; } try { // //ExecSelectForCache()内ではキャッシュの更新はしていないので、排他制御をしない. // //MarkovResultsCacheクラス内でExecSelectForCache()の抽出結果をキャッシュに格納しているので、 //MarkovResultsCacheクラス内でロックする. // //SELECT文を発行する CachedResults aResults = aDbConn.CreateCachedResults(sql); //次の状態に遷移する aDbConn.GoToNextState(Transaction.GetInstance()); //抽出結果を返す return(aResults); } catch (Exception ex) { //Error1状態に遷移して例外を再送出する aDbConn.GoToError1AndThrow(ex, true); //Warning対策 throw; } }
public void Add(string selectSql, CachedResults aResults) { try { //Writerロックを取得する _rwLock.AcquireWriterLock(_timeout); _cache.Add(selectSql, aResults); } finally { //Writerロックを開放する _rwLock.ReleaseWriterLock(); } }
private void AddImp(string selectSql, IEnumerable <string> usedTables, CachedResults aResults) { //キャッシュが既に在れば、キャッシュは追加しない if (_cache.ContainsKey(selectSql)) { return; } //キャッシュを追加する CacheInfo newCache = new CacheInfo(selectSql, usedTables, aResults); _cache.Add(selectSql, newCache); //使用テーブルとSELECT文の対応辞書を更新する foreach (string usedTable in usedTables) { if (!_usedTableDic.ContainsKey(usedTable)) { _usedTableDic.Add(usedTable, new List <string>()); } _usedTableDic[usedTable].Add(selectSql); } //最終アクセス順リストに要素を追加する _lruList.AddLast(newCache); //キャッシュサイズを超えた場合は、最終アクセスが最も過去のキャッシュを削除する if (_lruList.Count > _maxCacheSlot) { CacheInfo oldestCache = _lruList.First.Value; _cache.Remove(oldestCache.SelectSql); _lruList.RemoveFirst(); foreach (string usedTable in oldestCache.UsedTables) { //_usedTableDic.Remove(usedTable) //テーブル名に紐付く全てのSELECT文が無くなれば、 //_usedTableDicからそのテーブル名を削除する if (_usedTableDic.ContainsKey(usedTable) && _usedTableDic[usedTable].Remove(oldestCache.SelectSql) && _usedTableDic[usedTable].Count == 0) { _usedTableDic.Remove(usedTable); } } } }
public IResults AddAndFind(string selectSql, IEnumerable <string> usedTables, CachedResults aResults) { _predictCount += 1; this.AsyncMemorizeAndPredict(selectSql, usedTables); return(_resultsCache.AddAndFind(selectSql, usedTables, aResults)); }
public void Add(string selectSql, IEnumerable <string> usedTables, CachedResults aResults) { this.AsyncMemorizeAndPredict(selectSql, usedTables); _resultsCache.Add(selectSql, usedTables, aResults); }
public CachedResultsProxy(CachedResults aCachedResults) { _aCachedResults = aCachedResults; _maxRows = _aCachedResults.Rows.Count; _rowPos = -1; }
public IResults AddAndFind(string selectSql, IEnumerable <string> usedTables, CachedResults aResults) { //AddAndFind()は追加したaResultsを返すことを保証する //NullResultsCacheは受け取ったaResultsをProxyでラップする必要はないはず //Proxyでラップしないので、Dispose()されれば破棄される //Return New CachedResultsProxy(aResults) return(aResults); }
public void Add(string selectSql, IEnumerable <string> usedTables, CachedResults aResults) { }
public IResults AddAndFind(string selectSql, IEnumerable <string> usedTables, CachedResults aResults) { lock (_lock) { this.AddImp(selectSql, usedTables, aResults); return(this.FindImp(selectSql)); } }
public void Add(string selectSql, IEnumerable <string> usedTables, CachedResults aResults) { lock (_lock) { this.AddImp(selectSql, usedTables, aResults); } }
public CacheInfo(string aSelectSql, IEnumerable <string> aUsedTables, CachedResults aCache) { SelectSql = aSelectSql; UsedTables = aUsedTables; Cache = aCache; }