让WCF控制SQL SERVER 负载均衡

zetee 2011-10-18 10:38:09
1,数据库压力过大,分担数据库压力,就必须让数据库同步,数据库同步在SQL server来说 没有真正意义上的同步,只有 【复制】 【发布】 来让数据库同步,不过是一个延时同步,但也够了,晚1分钟同步还是可以接受的,
2,一个应用服务器(WCF 的宿主是IIS),要让2个或多个数据库,分担一定量的客户,让 多个SQL SERVER 负载均衡




实现原理:1,根据IP不同,分配不同的连接字符串。如下XML
<?xml version="1.0" encoding="utf-8" ?>
<s>
<DataSource>
<ConnectionString>server=192.168.1.111\sql2008;database=DB_237;uid=sa;password=sa;</ConnectionString>
<DbType>Main</DbType> <!--数据库类型,主(Main) 还是从(订阅 Sub)-->
<Weight>60</Weight><!--权值,(分担量 60/总)%-->
</DataSource>
<DataSource>
<ConnectionString>server=192.168.1.112\sql2008;database=DB_237;uid=sa;password=sa;</ConnectionString>
<DbType>Sub</DbType>
<Weight>40</Weight>
</DataSource>
</s>

2,由于是用IIS 做宿主,所以很容易做到 IP 的获取,用到IHttpModule

internal class DBLoadBalanceModule : IHttpModule
{
#region IHttpModule 成员

public void Dispose()
{
//throw new NotImplementedException();
}

public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
/// <summary>
/// 开始请求页面,
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
if (DBLoadBalanceRouter.Instance.IsValidEnterPoint)
{
DBLoadBalanceRouter.Instance.ClientStartAccess();
}

}


3,DBLoadBalanceRouter 的工作就是分配,包括监视数据源是否可用,对与IP 连接过长时间的,要执行清除等
4,数据库访问需要共用的类,如企业库等,创建一个特性

[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Method,
Inherited = true)]
public class DBLoadBalanceAttribute : System.Attribute
{
/// <summary>
/// 默认
/// </summary>
public DBLoadBalanceAttribute()
{
LoadBalanceDbType = LoadBalanceDbType.Best;
}
/// <summary>
/// 数据库类型
/// </summary>
/// <param name="dbType"></param>
public DBLoadBalanceAttribute(LoadBalanceDbType dbType)
{
LoadBalanceDbType = dbType;
}
/// <summary>
/// 数据库类型
/// </summary>
public LoadBalanceDbType LoadBalanceDbType { get; set; }
/// <summary>
/// 是否运用负载均衡
/// </summary>
public bool IsDBLoadBalance
{
get {
try
{
return Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["DBLoadBalance"].Trim());
}
catch (Exception)
{

return false;
}
}
}

}

/// <summary>
/// 数据库类型 主,从,自选最优
/// </summary>
public enum LoadBalanceDbType
{
/// <summary>
/// 主
/// </summary>
Main,
/// <summary>
/// 从
/// </summary>
Sub,
/// <summary>
/// 自选最优
/// </summary>
Best
}


只要应用了该特性,就可以让该方法在数据库操作时,实现数据源的最优选择了

4,实现方法是,在底层访问时,加入如下代码

if (!DBLoadBalanceRouter.Instance.IsValidEnterPoint)
return;
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
if (st.FrameCount > 1)
{
for (int i = 1; i < st.FrameCount; i++)
{
System.Reflection.MethodBase mb = st.GetFrame(i).GetMethod();
Type [] interfaceType=mb.DeclaringType.GetInterfaces();//接口
if (interfaceType.Length > 0)
{
for (int j = 0; j < interfaceType.Length; j++)
{
System.Reflection.MethodBase mbInterface=interfaceType[j].GetMethod(mb.Name);
if (mbInterface != null)
{
object[] objList = mbInterface.GetCustomAttributes(false);
if (objList != null && objList.Length > 0)
{
foreach (var item in objList)
{
DBLoadBalanceAttribute dba = item as DBLoadBalanceAttribute;
if (dba != null && dba.IsDBLoadBalance)
{
string connString = "";
switch (dba.LoadBalanceDbType)
{
case LoadBalanceDbType.Main:
connString = DBLoadBalanceRouter.Instance.GetMainConnectionString();
break;
default:
connString = DBLoadBalanceRouter.Instance.GetBestConnectionString();
break;
}
this.SetConnectionString(connString);
return;
}
}
}
}
}
}
}



}





需要交流,和需要代码的童鞋们,可以联系我,给我留言
...全文
312 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
SqlServer2008 2011-10-18
  • 打赏
  • 举报
回复
学习,谢谢lz发份代码给我:
272675462@qq.com

宝_爸 2011-10-18
  • 打赏
  • 举报
回复
没做过类似的事情,但是感觉sql server应该提供load banlancing功能吧。
zetee 2011-10-18
  • 打赏
  • 举报
回复
看来对数据库负载均衡。没什么人关心
朕赐你肥皂 2011-10-18
  • 打赏
  • 举报
回复
不错,标记一下,看看
zjq8888882009 2011-10-18
  • 打赏
  • 举报
回复
抢个沙发!
zetee 2011-10-18
  • 打赏
  • 举报
回复
SQL SERVER 没有负载均衡(有的话,告诉我),数据同步(发布-分发-订阅)也是一个延时后的同步,不是实时同步, 所以有点郁闷的
如此 2011-10-18
  • 打赏
  • 举报
回复

//标记上,感觉迟早会用到的!
whitebo 2011-10-18
  • 打赏
  • 举报
回复
谢谢楼主,给我也发份,学习一下.14103649@qq.com

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧