示例#1
0
        /// <summary>
        /// 显示缓存中数据库访问数量
        /// </summary>
        /// <returns></returns>
        public void ShowDBAccCountInPool()
        {
            if (m_logDbAccPool != null)
            {
                SvLogger.Info(string.Format("### Main DBType=LogDB, AccCountInPool={0}.", m_logDbAccPool.GetDBCountInPool()));
            }

            if (m_secdDbAccPool != null)
            {
                SvLogger.Info(string.Format("### Main DBType=SecdDB, AccCountInPool={0}.", m_secdDbAccPool.GetDBCountInPool()));
            }

            for (int i = 0; i < m_gameDBMainConnFlagList.Count; ++i)
            {
                DbAccessPool dbPool = GetDBPool(m_gameDBMainConnFlagList[i]);
                if (dbPool != null)
                {
                    SvLogger.Info(string.Format("### Main DBType=GameDB, AccCountInPool={0}.", dbPool.GetDBCountInPool()));
                    List <int> childFlagList;
                    m_gameDBChildConnFlagDic.TryGetValue(m_gameDBMainConnFlagList[i], out childFlagList);
                    if (childFlagList != null)
                    {
                        for (int j = 0; j < childFlagList.Count; ++j)
                        {
                            dbPool = GetDBPool(childFlagList[j]);
                            if (dbPool != null)
                            {
                                SvLogger.Info(string.Format("###        Child DBFlag={0}, AccCountInPool={1}.", childFlagList[j], dbPool.GetDBCountInPool()));
                            }
                        }
                    }
                }
            }
        }
示例#2
0
        /// <summary>
        /// 销毁所有数据库连接
        /// </summary>
        public void DestroyAllDbConn()
        {
            Dictionary <int, DbAccessPool> dbAccessPoolDic = DbAccessPool.GetPoolList();
            List <int> connFlagList = new List <int>();

            foreach (DbAccessPool accessPool in dbAccessPoolDic.Values)
            {
                accessPool.Stop(true);
            }
        }
示例#3
0
        /// <summary>
        /// 销毁数据库连接
        /// </summary>
        /// <param name="connFlag">连接标记</param>
        public void DestroyDbConn(int connFlag)
        {
            DbAccessPool dapool = DbAccessPool.GetPool(connFlag);

            if (dapool != null)
            {
                dapool.Stop(true);
                DbAccessPool.RemovePool(connFlag);
            }
        }
示例#4
0
        /// <summary>
        /// 获取游戏数据主访问池列表
        /// </summary>
        /// <returns></returns>
        public List <DbAccessPool> GetGameDbMainPoolList()
        {
            List <DbAccessPool> dbPoolList = new List <DbAccessPool>();
            DbAccessPool        dbPool;

            foreach (int gameFlag in m_gameDBMainConnFlagList)
            {
                dbPool = DbAccessPool.GetPool(gameFlag);
                if (dbPool != null)
                {
                    dbPoolList.Add(dbPool);
                }
            }

            return(dbPoolList);
        }
示例#5
0
        public static void Exec(string sql, DbAccessItem.OnFinishAsync onFinish, object[] finishParams)
        {
            DbAccessPool pool = ServerCommon.DbAccess.Instance.GetDBMainPool(eDbConnFlag.Game);

            if (pool != null && pool.IsAvailable)
            {
                DbAccessItem dbi = new DbAccessItem(sql, onFinish, finishParams, true);
                pool.Push(dbi);
            }
            else
            {
                DbAccessItem dbi = new DbAccessItem(sql, onFinish, finishParams, true);
                dbi.Result = new ErrInfo(101, "DB Pool=Null Or Pool Is Not Available!"); //游戏数据库池不可访问
                onFinish(dbi);
            }
        }
示例#6
0
        /// <summary>
        /// 获取数据库主访问池
        /// </summary>
        /// <param name="dbConnFlag">数据库类型</param>
        /// <returns>数据库访问池</returns>
        public DbAccessPool GetDBMainPool(eDbConnFlag dbConnFlag, int searchFlag = 0)
        {
            switch (dbConnFlag)
            {
            case eDbConnFlag.Game:
                if (searchFlag == 0 && m_gameDBMainConnFlagList.Count > 0)
                {
                    return(DbAccessPool.GetPool(m_gameDBMainConnFlagList[0]));
                }
                foreach (int gameFlag in m_gameDBMainConnFlagList)
                {
                    if (gameFlag == searchFlag)
                    {
                        return(DbAccessPool.GetPool(searchFlag));
                    }
                }
                return(null);

            case eDbConnFlag.Log:
                return(m_logDbAccPool);

            case eDbConnFlag.Secd:
                return(m_secdDbAccPool);

            case eDbConnFlag.GM:
                return(m_gmDBAccPool);

            case eDbConnFlag.Platform:
                return(m_platformDBAccPool);

            case eDbConnFlag.Moniteor:
                return(m_moniteorDBAccPool);

            case eDbConnFlag.Entry:
                return(m_entryDBAccPool);

            case eDbConnFlag.GiftCode:
                return(m_giftCodeDBAccPool);
            }
            return(null);
        }
示例#7
0
        /// <summary>
        /// 服务逻辑更新
        /// </summary>
        public void Update()
        {
            try
            {
                #region 协议处理
                ClientProtocolDealManager.Instance.TransferRecvClientData(ref m_protocolList);
                if (m_protocolList.Count > 0)
                {
                    for (int i = 0; i < m_protocolList.Count; i++)
                    {
                        try
                        {
                            //ServerProtocolDealManager.Instance.ServerSend2ClientData(clientSessionID, protocolData);
                        }
                        catch (Exception ex)
                        {
                            SvLogger.Fatal(ex, string.Format("Param Proto Exception : {0}\r\nStackTrace : \r\n{1}", ex.Message, ex.StackTrace));
                        }
                    }
                    m_protocolList.Clear();
                }
                #endregion

                #region 数据库回调处理

                List <DbAccessPoolVistor> dapvistorlist = DbAccessPool.GetVistorList();
                for (int i = 0; i < dapvistorlist.Count; i++)
                {
                    DbAccessPoolVistor dapvistor = dapvistorlist[i];
                    int      callbackNum         = dapvistor.GetCallbackNum();
                    int      doBackNum           = 0;
                    int      vStartTick          = Environment.TickCount;
                    int      doStartTick;
                    DateTime doStartTime;
                    while (doBackNum < callbackNum)
                    {
                        doStartTick = Environment.TickCount;
                        doStartTime = HTBaseFunc.GetTime(0);
                        DbAccessItem dbi = dapvistor.PopupCallback();
                        if (dbi != null)
                        {
                            dbi.OnFinish(dbi);
                        }
                        ++doBackNum;
                        int doEndTick    = Environment.TickCount;
                        int doSpendTicks = (doEndTick >= doStartTick ? doEndTick - doStartTick : (int.MaxValue + doEndTick) + (int.MaxValue - doStartTick));
                        if (doSpendTicks >= 1000)
                        {
                            SvLogger.Warn("Update TimeOut : DbAccessPoolCallback {0}, SpendMs = {1}, SpName = {2}, StartTime = {3}.", dapvistor.Flag, doSpendTicks, ((dbi != null) ? dbi.SpName : ""), doStartTime.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                        }
                        int vSpendTicks = (doEndTick >= vStartTick ? doEndTick - vStartTick : doEndTick + (int.MaxValue - vStartTick));
                        if (vSpendTicks >= SvrCommCfg.Instance.DbAccessPoolCallbackDealInterval)
                        {
                            break;
                        }
                    }
                }

                #endregion

                #region 定时打印服务器监控信息

                m_svrCheckEndTicket   = Environment.TickCount;
                m_svrCheckSpendTicket = (m_svrCheckEndTicket >= m_svrCheckStartTicket ? m_svrCheckEndTicket - m_svrCheckStartTicket : (int.MaxValue + m_svrCheckEndTicket) + (int.MaxValue - m_svrCheckStartTicket));
                if (m_svrCheckSpendTicket >= 60000)
                {
                    m_svrCheckStartTicket = m_svrCheckEndTicket;
                    ServerCommon.DbAccess.Instance.ShowDBAccCountInPool();
                }

                #endregion

                #region 内存回收

                if (m_lastMemoryCheck.AddSeconds(30) < HTBaseFunc.GetTime(0))
                {
                    if (m_lastGcTime.AddSeconds(30) < HTBaseFunc.GetTime(0) && System.Diagnostics.Process.GetCurrentProcess().WorkingSet64 > 128 * 1024 * 1024)
                    {
                        GC.Collect();
                        m_lastGcTime = HTBaseFunc.GetTime(0);
                    }

                    m_lastMemoryCheck = HTBaseFunc.GetTime(0);
                }

                #endregion
            }
            catch (Exception ex)
            {
                SvLogger.Fatal(ex, string.Format("Main Logic Exception : {0}\r\nStackTrace : \r\n{1}", ex.Message, ex.StackTrace));
            }
        }
示例#8
0
        /// <summary>
        /// 初始化数据库连接
        /// </summary>
        /// <param name="dbConnFlag">连接名</param>
        /// <param name="serverType">数据库类型</param>
        /// <param name="serverIp">数据库服务器名</param>
        /// <param name="serverPort">数据库端口</param>
        /// <param name="databaseName">数据库名</param>
        /// <param name="userName">数据库用户名</param>
        /// <param name="userPass">数据库用户密码</param>
        /// <param name="childConnCount">子连接个数</param>
        /// <returns>返回错误信息</returns>
        public int InitilizeDbConn(eDbConnFlag dbConnFlag, string serverType, string serverIp, string serverPort, string databaseName, string userName, string userPass, int childConnCount)
        {
            int errCode = 0;

            //最终Connect Flag生成
            m_connFlagMakeLines[dbConnFlag] += 1;
            int lineIndex = Convert.ToInt32(m_connFlagMakeLines[dbConnFlag]);
            int connFlag  = Convert.ToInt32(dbConnFlag) | lineIndex;

            DbAccessPool dapool = DbAccessPool.GetPool(connFlag);

            if (dapool != null)
            {
                errCode = 1111;
                SvLogger.Error("Had Same DB Connections : ConnectType={0}, ConnectFlag={1}.", dbConnFlag, connFlag);
                return(errCode);
            }

            //获取SQL日志记录池
            DbAccessPool sqlogdapool = null;
            //if (dbConnFlag != eDbConnFlag.SqlLog)
            //    sqlogdapool = DbAccessPool.GetPool(EnumDbConnName.SqlLog.ToString());

            //建立数据库连接
            DbAccessPoolVistor vistor = new DbAccessPoolVistor(connFlag);

            dapool = new DbAccessPool(connFlag, SvLogger.GetLogger(), vistor, sqlogdapool);
            try
            {
                dapool.Start(serverType, serverIp, serverPort, databaseName, userName, userPass);
            }
            catch (Exception ex)
            {
                SvLogger.Fatal(ex, "{0}\n{1}.", ex.Message, ex.StackTrace);
                errCode = 1111;
                return(errCode);
            }
            int mainFlag = dapool.Flag;

            if (dbConnFlag == eDbConnFlag.Game)
            {
                m_gameDBMainConnFlagList.Add(dapool.Flag);
            }
            else if (dbConnFlag == eDbConnFlag.Log)
            {
                m_logDbAccPool = dapool;
            }
            else if (dbConnFlag == eDbConnFlag.Secd)
            {
                m_secdDbAccPool = dapool;
            }
            else if (dbConnFlag == eDbConnFlag.GM)
            {
                m_gmDBAccPool = dapool;
            }
            else if (dbConnFlag == eDbConnFlag.Platform)
            {
                m_platformDBAccPool = dapool;
            }
            else if (dbConnFlag == eDbConnFlag.Moniteor)
            {
                m_moniteorDBAccPool = dapool;
            }
            else if (dbConnFlag == eDbConnFlag.Entry)
            {
                m_entryDBAccPool = dapool;
            }
            else if (dbConnFlag == eDbConnFlag.GiftCode)
            {
                m_giftCodeDBAccPool = dapool;
            }

            //加入池
            DbAccessPool.AddPool(dapool);

            //Game数据库子连接建立
            if (dbConnFlag == eDbConnFlag.Game)
            {
                for (int i = 0; i < childConnCount; ++i)
                {
                    //最终Connect Flag生成
                    m_connFlagMakeLines[dbConnFlag] += 1;
                    lineIndex = Convert.ToInt32(m_connFlagMakeLines[dbConnFlag]);
                    connFlag  = Convert.ToInt32(dbConnFlag) | lineIndex;

                    dapool = DbAccessPool.GetPool(connFlag);
                    if (dapool != null)
                    {
                        errCode = 1111;
                        SvLogger.Error("Had Same DB Connections : ConnectType={0}, ConnectFlag={1}.", dbConnFlag, connFlag);
                        return(errCode);
                    }

                    //获取SQL日志记录池
                    sqlogdapool = null;
                    //if (dbConnFlag != eDbConnFlag.SqlLog)
                    //    sqlogdapool = DbAccessPool.GetPool(EnumDbConnName.SqlLog.ToString());

                    //建立数据库连接
                    vistor = new DbAccessPoolVistor(connFlag);
                    dapool = new DbAccessPool(connFlag, SvLogger.GetLogger(), vistor, sqlogdapool);
                    try
                    {
                        dapool.Start(serverType, serverIp, serverPort, databaseName, userName, userPass);
                    }
                    catch (Exception ex)
                    {
                        SvLogger.Fatal(ex, "{0}\n{1}.", ex.Message, ex.StackTrace);
                        errCode = 1111;
                        return(errCode);
                    }
                    List <int> childList;
                    if (m_gameDBChildConnFlagDic.TryGetValue(mainFlag, out childList) == false)
                    {
                        childList = new List <int>();
                        m_gameDBChildConnFlagDic.Add(mainFlag, childList);
                    }
                    childList.Add(dapool.Flag);

                    //加入池
                    DbAccessPool.AddPool(dapool);
                }
            }

            return(errCode);
        }
示例#9
0
 /// <summary>
 /// 获取数据库访问池
 /// </summary>
 /// <param name="searchFlag">访问池ID</param>
 /// <returns>访问池</returns>
 public DbAccessPool GetDBPool(int searchFlag)
 {
     return(DbAccessPool.GetPool(searchFlag));
 }