using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Web;
namespace CYQ.Data
{
internal class ConnBean
{
///
/// 对应的ConnectionString的Name
///
internal string ConfigName = string.Empty;
///
/// 链接的状态是否正常。
///
internal bool IsOK = true;
///
/// 是否从库
///
internal bool IsSlave = false;
///
/// 链接错误时的异常消息。
///
internal string ErrorMsg = string.Empty;
private string _Conn = string.Empty;
///
/// 数据库链接
///
public string Conn
{
get { return _Conn; }
set { _Conn = value; }
}
private string _ProviderName;
///
/// 数据类型提供者
///
public string ProviderName
{
get { return _ProviderName; }
set { _ProviderName = value; }
}
private DalType _ConnDalType;
///
/// 数据库类型
///
public DalType ConnDalType
{
get { return _ConnDalType; }
set { _ConnDalType = value; }
}
public ConnBean Clone()
{
ConnBean cb = new ConnBean();
cb.Conn = this.Conn;
cb.ProviderName = this.ProviderName;
cb.ConnDalType = this.ConnDalType;
cb.ConfigName = this.ConfigName;
cb.IsOK = this.IsOK;
return cb;
}
//public string TryTestConn()
//{
// string err;
// return TryTestConn(out err);
//}
public string TryTestConn()
{
string version = string.Empty;
//err = string.Empty;
if (!string.IsNullOrEmpty(Conn))
{
DbBase helper = DalCreate.CreateDal(Conn);
try
{
helper.Con.Open();
version = helper.Con.ServerVersion;
if (string.IsNullOrEmpty(version)) { version = helper.dalType.ToString(); }
helper.Con.Close();
IsOK = true;
ErrorMsg = string.Empty;
}
catch (Exception er)
{
ErrorMsg = er.Message;
//err = er.Message;
IsOK = false;
}
finally
{
helper.Dispose();
}
}
else
{
IsOK = false;
}
return version;
}
}
internal class ConnObject
{
public ConnBean Master = new ConnBean();
public ConnBean BackUp;
public List Slave = new List();
internal void InterChange()
{
if (BackUp != null)
{
ConnBean middle = Master;
Master = BackUp;
BackUp = middle;
}
}
static int index = -1, times = 1;
public ConnBean GetSlave()
{
if (Slave.Count > 0)
{
if (index == -1)
{
index = new Random().Next(Slave.Count);
}
if (times % 3 == 0)
{
index++;
}
times++; if (times == 100000) { times = 1; }
if (index == Slave.Count)//2
{
index = 0;
}
ConnBean slaveBean = Slave[index];
if (slaveBean.IsOK)//链接正常,则返回。
{
return slaveBean;
}
else if (Slave.Count > 1)
{
//int i = index + 1;//尝试一下个,。
for (int i = index + 1; i < Slave.Count + 1; i++)
{
if (i == Slave.Count)
{
i = 0;
}
if (i == index) { break; }
if (Slave[i].IsOK)
{
return Slave[i];
}
}
}
//从全部挂了,返回主
if (Master != null && Master.IsOK)
{
return Master;
}
else if (BackUp != null && BackUp.IsOK)
{
return BackUp;
}
}
return null;
}
public void SetNotAllowSlave()
{
if (Slave.Count > 0)
{
string id = GetIdentity();//获取当前的标识
Cache.CacheManage.LocalInstance.Set(id, 1, AppConfig.DB.MasterSlaveTime / 60.0);
}
}
public bool IsAllowSlave()
{
if (Slave.Count == 0) { return false; }
string id = GetIdentity();//获取当前的标识
return !Cache.CacheManage.LocalInstance.Contains(id);
}
private string GetIdentity()
{
string id = string.Empty;
if (HttpContext.Current != null)
{
if (HttpContext.Current.Session != null)
{
id = HttpContext.Current.Session.SessionID;
}
else if (HttpContext.Current.Request["MasterSlaveID"] != null)
{
id = HttpContext.Current.Request["MasterSlaveID"];
}
if (string.IsNullOrEmpty(id))
{
HttpCookie cookie = HttpContext.Current.Request.Cookies["MasterSlaveID"];
if (cookie != null)
{
id = cookie.Value;
}
else
{
id = Guid.NewGuid().ToString().Replace("-", "");
cookie = new HttpCookie("MasterSlaveID", id);
cookie.Expires = DateTime.Now.AddMonths(1);
HttpContext.Current.Response.Cookies.Add(cookie);
}
}
}
if (string.IsNullOrEmpty(id))
{
id = DateTime.Now.Minute + Thread.CurrentThread.ManagedThreadId.ToString();
}
return "MasterSlave_" + id;
}
}
/*
///
/// 存储链接数据
///
internal class ConnEntity
{
private string _Conn = string.Empty;
public string Conn
{
get { return _Conn; }
set { _Conn = value; }
}
private string _ProviderName;
public string ProviderName
{
get { return _ProviderName; }
set { _ProviderName = value; }
}
private DalType _ConnDalType;
public DalType ConnDalType
{
get { return _ConnDalType; }
set { _ConnDalType = value; }
}
private string _ConnBak = string.Empty;
public string ConnBak
{
get { return _ConnBak; }
set { _ConnBak = value; }
}
private string _ProviderNameBak;
public string ProviderNameBak
{
get { return _ProviderNameBak; }
set { _ProviderNameBak = value; }
}
private DalType _ConnBakDalType;
public DalType ConnBakDalType
{
get { return _ConnBakDalType; }
set { _ConnBakDalType = value; }
}
///
/// 互换主从链接
///
///
public bool ExchangeConn()
{
if (!string.IsNullOrEmpty(_ConnBak))
{
string temp = _Conn;
_Conn = _ConnBak;
_ConnBak = temp;
temp = _ProviderName;
_ProviderName = _ProviderNameBak;
_ProviderNameBak = temp;
DalType tempDal = _ConnDalType;
_ConnDalType = _ConnBakDalType;
_ConnBakDalType = tempDal;
return true;
}
return false;
}
}
//internal class ConnFactory
//{
// private static Dictionary connDic = new Dictionary(StringComparer.OrdinalIgnoreCase);
// public ConnEntity Get(string connName)
// {
// if (!connDic.ContainsKey(connName))
// {
// foreach (ConnectionStringSettings item in ConfigurationManager.ConnectionStrings)
// {
// if (!connDic.ContainsKey(item.Name))
// {
// ConnEntity entity = new ConnEntity();
// entity.Conn = item.ConnectionString;
// entity.s
// connDic.Add(item.Name, entity);
// }
// }
// }
// if (connDic.ContainsKey(connName))
// {
// return connDic[connName];
// }
// return null;
// }
//}
*/
}