/// <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())); } } } } } }
/// <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); } }
/// <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); } }
/// <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); }
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); } }
/// <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); }
/// <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)); } }
/// <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); }
/// <summary> /// 获取数据库访问池 /// </summary> /// <param name="searchFlag">访问池ID</param> /// <returns>访问池</returns> public DbAccessPool GetDBPool(int searchFlag) { return(DbAccessPool.GetPool(searchFlag)); }