Ejemplo n.º 1
0
            //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;
                }
            }
Ejemplo n.º 2
0
        public void Add(string selectSql, CachedResults aResults)
        {
            try {
                //Writerロックを取得する
                _rwLock.AcquireWriterLock(_timeout);

                _cache.Add(selectSql, aResults);
            } finally {
                //Writerロックを開放する
                _rwLock.ReleaseWriterLock();
            }
        }
Ejemplo n.º 3
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        public IResults AddAndFind(string selectSql, IEnumerable <string> usedTables, CachedResults aResults)
        {
            _predictCount += 1;

            this.AsyncMemorizeAndPredict(selectSql, usedTables);

            return(_resultsCache.AddAndFind(selectSql, usedTables, aResults));
        }
Ejemplo n.º 5
0
        public void Add(string selectSql, IEnumerable <string> usedTables, CachedResults aResults)
        {
            this.AsyncMemorizeAndPredict(selectSql, usedTables);

            _resultsCache.Add(selectSql, usedTables, aResults);
        }
Ejemplo n.º 6
0
 public CachedResultsProxy(CachedResults aCachedResults)
 {
     _aCachedResults = aCachedResults;
     _maxRows        = _aCachedResults.Rows.Count;
     _rowPos         = -1;
 }
Ejemplo n.º 7
0
        public IResults AddAndFind(string selectSql, IEnumerable <string> usedTables, CachedResults aResults)
        {
            //AddAndFind()は追加したaResultsを返すことを保証する

            //NullResultsCacheは受け取ったaResultsをProxyでラップする必要はないはず
            //Proxyでラップしないので、Dispose()されれば破棄される
            //Return New CachedResultsProxy(aResults)

            return(aResults);
        }
Ejemplo n.º 8
0
 public void Add(string selectSql, IEnumerable <string> usedTables, CachedResults aResults)
 {
 }
Ejemplo n.º 9
0
 public IResults AddAndFind(string selectSql, IEnumerable <string> usedTables, CachedResults aResults)
 {
     lock (_lock) {
         this.AddImp(selectSql, usedTables, aResults);
         return(this.FindImp(selectSql));
     }
 }
Ejemplo n.º 10
0
 public void Add(string selectSql, IEnumerable <string> usedTables, CachedResults aResults)
 {
     lock (_lock) {
         this.AddImp(selectSql, usedTables, aResults);
     }
 }
Ejemplo n.º 11
0
 public CacheInfo(string aSelectSql, IEnumerable <string> aUsedTables, CachedResults aCache)
 {
     SelectSql  = aSelectSql;
     UsedTables = aUsedTables;
     Cache      = aCache;
 }