111,097
社区成员




<?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>
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();
}
}
[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
}
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;
}
}
}
}
}
}
}
}
//标记上,感觉迟早会用到的!