Code highlighting produced by Actipro CodeHighlighter (freeware)>DbSnapInfo dbSnapInfo = GetLoadBalanceScheduling.GetConnectDbSnap(); /// 获取使用的数据库(或快照)链接串 /// </summary> /// <param name="commandText">存储过程名或都SQL命令文本</param> /// <returns></returns> public static string GetRealConnectionString(string commandText) { if (DbSnapConfigs.GetConfig() != null && DbSnapConfigs.GetConfig().AppDbSnap) { commandText = commandText.Trim().ToLower(); if (commandText.StartsWith("select") || ((commandText.StartsWith(BaseConfigs.GetTablePrefix) && UserSnapDatabase(commandText)))) { DbSnapInfo dbSnapInfo = GetLoadBalanceScheduling.GetConnectDbSnap(); if (DbSnapConfigs.GetConfig().RecordeLog && snapLogList.Capacity > snapLogList.Count) snapLogList.Add(string.Format("{{'SouceID' : {0}, 'DbconnectString' : '{1}', 'CommandText' : '{2}', 'PostDateTime' : '{3}'}},", dbSnapInfo.SouceID, dbSnapInfo.DbconnectString, commandText.Replace("'",""), Discuz.Common.Utils.GetDateTime())); return dbSnapInfo.DbconnectString; } } return ConnectionString; } 有关相应配置节点和负载均衡算法会在后面提到,这里为了坚持文章内容的持续性暂且跳过,下面接着阅读一下上面调用的‘UserSnapDatabase’方法: 代码 Code highlighting produced by Actipro CodeHighlighter (freeware)>/// <summary> /// 是否使用快照数据库 /// </summary> /// <param name="commandText">查问</param> /// <returns></returns> private static bool UserSnapDatabase(string commandText) { // 如果上次刷新cookie距离小于5分钟, 则不刷新数据库最后运动时光 if (commandText.StartsWith(BaseConfigs.GetTablePrefix + "create")) { Utils.WriteCookie("JumpAfterWrite", Environment.TickCount.ToString()); return false; } else if (!String.IsNullOrEmpty(Utils.GetCookie("JumpAfterWrite")) && (Environment.TickCount - TypeConverter.StrToInt(Utils.GetCookie("JumpAfterWrite"), Environment.TickCount)) < DbSnapConfigs.GetConfig().WriteWaitTime * 1000) return false; else if (!commandText.StartsWith(BaseConfigs.GetTablePrefix + "get")) return false; return true; } -->
代码 Code highlighting produced by Actipro CodeHighlighter (freeware)><?xml version="1.0"?> <DbSnapAppConfig xmlns:xsi=" <AppDbSnap>true</AppDbSnap> <WriteWaitTime>1</WriteWaitTime> <LoadBalanceScheduling>RoundRobinScheduling</LoadBalanceScheduling> --WeightedRoundRobinScheduling <RecordeLog>false</RecordeLog> <DbSnapInfoList> <DbSnapInfo> <SouceID>1</SouceID> <Enable>true</Enable> <DbconnectString>Data Source=DAIZHJ\DNT_DAIZHJ;User ID=sa;Password=123123;Initial Catalog=dnt_snap;Pooling=true</DbconnectString>  最大的网络公司; <Weight>4</Weight> </DbSnapInfo> <DbSnapInfo> <SouceID>2</SouceID> <Enable>true</Enable> <DbconnectString>Data Source=DAIZHJ-PC\2222;User ID=sa;Password=123;Initial Catalog=tabletest;Pooling=true</DbconnectString> <Weight>3</Weight> </DbSnapInfo> </DbSnapInfoList> </DbSnapAppConfig> 当然,在GetRealConnectionString()方法中,还有一行代码很重要,就是下面这一行: Code highlighting produced by Actipro CodeHighlighter (freeware)>(Environment.TickCount - TypeConverter.StrToInt(Utils.GetCookie("JumpAfterWrite"), Environment.TickCount)) < DbSnapConfigs.GetConfig().WriteWaitTime * 1000) 目前在Discuz!NT这个产品中,数据库作为数据长久化工具,一定在并发访问频繁且负载压力较大的情况下成 为体系性能的‘瓶颈’。即便使用本地缓存等方式来解决频繁访问数据库的问题,但仍然会有大批的并发要求要访问动态数据,固然 SQL2005及2008以上版本中性能一直晋升,查询打算跟存储进程运行得越来越高效,但终极还是 要面临‘瓶颈’这一问 题。当然这也是很多大型网站不断研讨摸索各式各样的计划来有效下降数据访问负荷的原 因, 其中的‘读写分离’方案就是一种被普遍采取的方案。 上面的方式将会对传入的sql语句进行剖析,找出其中是CUD操作仍是SELECT操作,来差别是读还是写操作。而snapLogList列表则是之前所配置的‘事务宣布订阅’模式下的相干‘从数据库’(Slave Database)链接串的列表,例如(dbsnap.config文件的DbSnapInfoList节点): 代码 Code highlighting produced by Actipro CodeHighlighter (freeware)>/// <summary>/// 负载均衡调度接口 /// </summary> private static ILoadBalanceScheduling m_loadBalanceSche; /// <summary> /// 初始化负载平衡调度接口实例 /// </summary> private static ILoadBalanceScheduling GetLoadBalanceScheduling { get { if (m_loadBalanceSche == null) { try { m_loadBalanceSche = (ILoadBalanceScheduling)Activator.CreateInstance(Type.GetType(string.Format("Discuz.EntLib.{0}, Discuz.EntLib", DbSnapConfigs.GetConfig().LoadBalanceScheduling), false, true)); } catch { throw new Exception("请检讨config/dbsnap.config中配置是否准确"); } } return m_loadBalanceSche; } } 该办法的作用很简略,就是当数据库有CUD操作时,通过写cookie的方法向客户端写一个键值‘JumpAfterWrite’,这个键值很主要,就是供给一个标签(flag)来唆使:‘当前用户履行cud操作时,页面跳转到其它页面而主数据库还没来得及将数据推送到从数据库’这一情形而造成的‘数据不同步’问题。 |