Пример #1
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));
            }
        }
Пример #2
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);
        }