Ejemplo n.º 1
0
        private void LoadKey(string tablename, EntityTableMeta meta)
        {
            string indexfile      = GetKeyFile(tablename);
            var    indexmergeinfo = meta.IndexMergeInfos.Find(p => p.IndexName.Equals(meta.KeyName));

            if (indexmergeinfo == null)
            {
                indexmergeinfo           = new IndexMergeInfo();
                indexmergeinfo.IndexName = meta.KeyName;
                meta.IndexMergeInfos.Add(indexmergeinfo);
            }
            using (ObjTextReader idx = ObjTextReader.CreateReader(indexfile))
            {
                if (indexmergeinfo.IndexMergePos > 0)
                {
                    idx.SetPostion(indexmergeinfo.IndexMergePos);
                }
                var idc = keyindexdic[tablename];
                Dictionary <long, EntityTableIndexItem> al = null;
                foreach (var newindex in idx.ReadObjectsWating <EntityTableIndexItem>(1))
                {
                    if (!idc.TryGetValue(newindex.Key, out al))
                    {
                        lock (idc)
                        {
                            if (!idc.TryGetValue(newindex.Key, out al))
                            {
                                al = new Dictionary <long, EntityTableIndexItem>();
                                idc.TryAdd(newindex.Key, al);
                            }
                        }
                    }

                    if (newindex.Del)
                    {
                        al.Remove(newindex.Offset);
                    }
                    else
                    {
                        lock (al)
                        {
                            al.Add(newindex.Offset, newindex);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private EntityTableIndexItemBag LoadIndex(string tablename, string indexname, EntityTableMeta meta)
        {
            string key = string.Format("{0}##{1}", tablename, indexname);
            EntityTableIndexItemBag temp = null;

            if (indexdic.TryGetValue(key, out temp))
            {
                temp.LastUsed = DateTime.Now;
            }

            string indexfile = GetIndexFile(tablename, indexname);
            var    locker    = GetKeyLocker(tablename, "index_" + indexname);

            lock (locker)
            {
                if (indexdic.TryGetValue(key, out temp))
                {
                    temp.LastUsed = DateTime.Now;
                }
                else
                {
                    temp = new EntityTableIndexItemBag();
                }

                using (ObjTextReader idxreader = ObjTextReader.CreateReader(indexfile))
                {
                    if (temp.LastOffset > 0)
                    {
                        idxreader.SetPostion(temp.LastOffset);
                    }

                    Dictionary <long, EntityTableIndexItem> al = null;
                    foreach (var newindex in idxreader.ReadObjectsWating <EntityTableIndexItem>(1))
                    {
                        temp.LastOffset = idxreader.ReadedPostion();
                        if (!temp.Dics.TryGetValue(newindex.Key, out al))
                        {
                            al = new Dictionary <long, EntityTableIndexItem>();
                            temp.Dics.TryAdd(newindex.Key, al);
                        }

                        if (newindex.Del)
                        {
                            al.Remove(newindex.Offset);
                        }
                        else
                        {
                            al.Add(newindex.Offset, newindex);
                        }
                    }
                }

                if (temp.LastUsed == DateTime.MinValue)
                {
                    temp.LastUsed = DateTime.Now;
                    indexdic.TryAdd(key, temp);
                    LJC.FrameWork.Comm.Coroutine.CoroutineEngine.DefaultCoroutineEngine.Dispatcher(new IndexDestroy(indexdic, key));
                }
                else
                {
                    temp.LastUsed = DateTime.Now;
                }
            }

            return(temp);
        }
        private void LoadKey(string tablename, BigEntityTableMeta meta)
        {
            string indexfile      = GetKeyFile(tablename);
            var    indexmergeinfo = meta.IndexMergeInfos.Find(p => p.IndexName.Equals(meta.KeyName));

            if (indexmergeinfo == null)
            {
                indexmergeinfo           = new IndexMergeInfo();
                indexmergeinfo.IndexName = meta.KeyName;
                meta.IndexMergeInfos.Add(indexmergeinfo);
            }

            //计算加载因子
            indexmergeinfo.LoadFactor = (int)Math.Max(4, new FileInfo(indexfile).Length / MAX_KEYBUFFER);

            int i = 0;
            BigEntityTableIndexItem        lastreadindex = null;
            List <BigEntityTableIndexItem> list          = new List <BigEntityTableIndexItem>();
            long currentpos    = 0;
            long currrankindex = 0;

            byte[] buffer = new byte[1024 * 1024 * 10];
            using (ObjTextReader idx = ObjTextReader.CreateReader(indexfile))
            {
                Console.WriteLine("loadkey");
                foreach (var newindex in idx.ReadObjectsWating <BigEntityTableIndexItem>(1, p => currentpos = p, buffer))
                {
                    if (newindex.Del)
                    {
                        continue;
                    }
                    newindex.KeyOffset  = currentpos;
                    newindex.RangeIndex = currrankindex++;
                    newindex.SetIndex(meta.KeyIndexInfo);
                    if (newindex.KeyOffset >= indexmergeinfo.IndexMergePos)
                    {
                        //list.Add(newindex);
                        if (list.Count > 0)
                        {
                            if (list.Last().KeyOffset != lastreadindex.KeyOffset)
                            {
                                list.Add(lastreadindex);
                            }
                        }
                        break;
                    }

                    if (indexmergeinfo.LoadFactor == 1 || i % indexmergeinfo.LoadFactor == 0)
                    {
                        list.Add(newindex);
                    }
                    i++;
                    lastreadindex = newindex;
                }

                if (list.Count > 0 && list.Last().KeyOffset != lastreadindex.KeyOffset)
                {
                    list.Add(lastreadindex);
                }
            }
            indexmergeinfo.TotalCount = i;

            BigEntityTableIndexItem[] oldindexitems = null;
            keyindexdisklist.TryRemove(tablename, out oldindexitems);
            keyindexdisklist.TryAdd(tablename, list.ToArray());
            using (ObjTextReader idr = ObjTextReader.CreateReader(indexfile))
            {
                Console.WriteLine("loadkey2");

                if (indexmergeinfo.IndexMergePos > 0)
                {
                    idr.SetPostion(indexmergeinfo.IndexMergePos);
                }
                //Dictionary<string, BigEntityTableIndexItem> indexdic = new Dictionary<string, BigEntityTableIndexItem>();
                //keyindexlistdic[tablename];
                SortArrayList <BigEntityTableIndexItem> keymemlist = new SortArrayList <BigEntityTableIndexItem>();
                foreach (var newindex in idr.ReadObjectsWating <BigEntityTableIndexItem>(1, p => currentpos = p, buffer))
                {
                    newindex.KeyOffset = currentpos;
                    newindex.SetIndex(meta.KeyIndexInfo);
                    newindex.RangeIndex = -1;
                    if (!newindex.Del)
                    {
                        //indexdic.Add(newindex.Key, newindex);
                        keymemlist.Add(newindex);
                        i++;
                    }
                }

                var tablelocker = GetKeyLocker(tablename, string.Empty);
                tablelocker.EnterWriteLock();
                try
                {
                    foreach (var newindex in idr.ReadObjectsWating <BigEntityTableIndexItem>(1, p => currentpos = p, buffer))
                    {
                        newindex.KeyOffset = currentpos;
                        newindex.SetIndex(meta.KeyIndexInfo);
                        newindex.RangeIndex = -1;
                        if (!newindex.Del)
                        {
                            //indexdic.Add(newindex.Key, newindex);
                            keymemlist.Add(newindex);
                            i++;
                        }
                    }

                    if (idr.Length() - currentpos > 10240)
                    {
                        throw new Exception(tablename + "主键索引大量数据未读取");
                    }

                    //keyindexlistdic[tablename] = indexdic;
                    keyindexmemlist[tablename] = keymemlist;
                }
                finally
                {
                    tablelocker.ExitWriteLock();
                }
            }
        }
Ejemplo n.º 4
0
        private void ProcessQueue()
        {
            if (OnProcessQueue == null)
            {
                return;
            }
            lock (this)
            {
                if (IsRuning)
                {
                    return;
                }
                IsRuning = true;
            }

            T   last       = null;
            int errortimes = 0;

            try
            {
                //ProcessBadQueue(last);
                foreach (var t in _queueReader.ReadObjectsWating <T>())
                {
                    last = t;
                    if (OnProcessQueue(t))
                    {
                        errortimes            = 0;
                        _logger.LastPos       = _queueReader.ReadedPostion();
                        _logger.LastChageTime = DateTime.Now;

                        if (OnProcessQueueSuccessed != null)
                        {
                            OnProcessQueueSuccessed(t);
                        }
                    }
                    else
                    {
                        _queueReader.SetPostion(_logger.LastPos);
                        errortimes++;
                    }

                    if (errortimes > 0)
                    {
                        Thread.Sleep(1000 * errortimes);
                    }

                    if (errortimes > 5)
                    {
                        throw new Exception("尝试次数过多");
                    }
                }
            }
            catch (Newtonsoft.Json.JsonReaderException)
            {
                ProcessBadQueue(last);
            }
            catch (Newtonsoft.Json.JsonSerializationException)
            {
                ProcessBadQueue(last);
            }
            catch (EntityBuf.EntityBufException)
            {
                ProcessBadQueue(last);
            }
            catch (Exception ex)
            {
                if (!OnErrorResumeNext)
                {
                    _queueReader.SetPostion(_logger.LastPos);
                }
                if (OnProcessError != null)
                {
                    OnProcessError(last, ex);
                }
            }
            finally
            {
                IsRuning = false;
            }
        }