270 lines
9.0 KiB
C#
270 lines
9.0 KiB
C#
|
|
using CYQ.Data.Tool;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Configuration;
|
|||
|
|
using System.Threading;
|
|||
|
|
|
|||
|
|
namespace CYQ.Data.SQL
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 管理数据库(N个库)
|
|||
|
|
/// </summary>
|
|||
|
|
internal partial class DBSchema
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 首次初始化的数据库。
|
|||
|
|
/// </summary>
|
|||
|
|
private static MDictionary<string, DBInfo> _DBScheams = new MDictionary<string, DBInfo>();
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取所有表架构(如果未缓存完成,会重新读取完整后才进行返回(有阻塞可能)
|
|||
|
|
/// </summary>
|
|||
|
|
public static MDictionary<string, DBInfo> DBScheams
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
if (!IsInitDBCompleted)
|
|||
|
|
{
|
|||
|
|
InitDBSchemasAgain();
|
|||
|
|
}
|
|||
|
|
return _DBScheams;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取(并缓存)数据库的“表、视图、存储过程”名称列表。
|
|||
|
|
/// </summary>
|
|||
|
|
public static DBInfo GetSchema(string conn)
|
|||
|
|
{
|
|||
|
|
ConnBean cb = ConnBean.Create(conn);
|
|||
|
|
if (cb != null)
|
|||
|
|
{
|
|||
|
|
string hash = cb.GetHashKey();
|
|||
|
|
if (!_DBScheams.ContainsKey(hash))
|
|||
|
|
{
|
|||
|
|
DBInfo dbSchema = null;
|
|||
|
|
lock (cb)
|
|||
|
|
{
|
|||
|
|
if (!_DBScheams.ContainsKey(hash))
|
|||
|
|
{
|
|||
|
|
dbSchema = GetSchemaDic(cb.ConnName, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (dbSchema != null && !_DBScheams.ContainsKey(hash))
|
|||
|
|
{
|
|||
|
|
_DBScheams.Add(hash, dbSchema);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
if (_DBScheams.ContainsKey(hash))
|
|||
|
|
{
|
|||
|
|
return _DBScheams[hash];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
private static DBInfo GetSchemaDic(string conn, bool isIgnoreCache)
|
|||
|
|
{
|
|||
|
|
DBInfo info = new DBInfo();
|
|||
|
|
using (DalBase dal = DalCreate.CreateDal(conn))
|
|||
|
|
{
|
|||
|
|
info.ConnName = dal.ConnObj.Master.ConnName;
|
|||
|
|
info.ConnString = dal.ConnObj.Master.ConnStringOrg;
|
|||
|
|
info.DataBaseName = dal.DataBaseName;
|
|||
|
|
info.DataBaseType = dal.DataBaseType;
|
|||
|
|
|
|||
|
|
Dictionary<string, string> tables = dal.GetTables(isIgnoreCache);
|
|||
|
|
if (tables != null && tables.Count > 0)
|
|||
|
|
{
|
|||
|
|
MDictionary<string, TableInfo> dic = new MDictionary<string, TableInfo>();
|
|||
|
|
foreach (KeyValuePair<string, string> item in tables)
|
|||
|
|
{
|
|||
|
|
string hash = TableInfo.GetHashKey(item.Key);
|
|||
|
|
if (!dic.ContainsKey(hash))
|
|||
|
|
{
|
|||
|
|
dic.Add(hash, new TableInfo(item.Key, "U", item.Value, info));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
info.Tables = dic;
|
|||
|
|
}
|
|||
|
|
if (isIgnoreCache)//延迟加载。
|
|||
|
|
{
|
|||
|
|
info.isGetVersion = true;
|
|||
|
|
info.DataBaseVersion = dal.Version;
|
|||
|
|
Dictionary<string, string> views = dal.GetViews(isIgnoreCache);
|
|||
|
|
if (views != null && views.Count > 0)
|
|||
|
|
{
|
|||
|
|
MDictionary<string, TableInfo> dic = new MDictionary<string, TableInfo>();
|
|||
|
|
foreach (KeyValuePair<string, string> item in views)
|
|||
|
|
{
|
|||
|
|
string hash = TableInfo.GetHashKey(item.Key);
|
|||
|
|
if (!dic.ContainsKey(hash))
|
|||
|
|
{
|
|||
|
|
dic.Add(hash, new TableInfo(item.Key, "V", item.Value, info));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
info.isGetViews = true;
|
|||
|
|
info.Views = dic;
|
|||
|
|
}
|
|||
|
|
Dictionary<string, string> procs = dal.GetProcs(isIgnoreCache);
|
|||
|
|
if (procs != null && procs.Count > 0)
|
|||
|
|
{
|
|||
|
|
MDictionary<string, TableInfo> dic = new MDictionary<string, TableInfo>();
|
|||
|
|
foreach (KeyValuePair<string, string> item in procs)
|
|||
|
|
{
|
|||
|
|
string hash = TableInfo.GetHashKey(item.Key);
|
|||
|
|
if (!dic.ContainsKey(hash))
|
|||
|
|
{
|
|||
|
|
dic.Add(hash, new TableInfo(item.Key, "P", item.Value, info));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
info.isGetProcs = true;
|
|||
|
|
info.Procs = dic;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return info;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 移除数据库缓存
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="key"></param>
|
|||
|
|
public static void Remove(string key)
|
|||
|
|
{
|
|||
|
|
_DBScheams.Remove(key);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 清空所有数据库缓存
|
|||
|
|
/// </summary>
|
|||
|
|
public static void Clear()
|
|||
|
|
{
|
|||
|
|
_DBScheams.Clear();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 初始化。
|
|||
|
|
/// </summary>
|
|||
|
|
internal partial class DBSchema
|
|||
|
|
{
|
|||
|
|
internal static bool IsInitDBCompleted
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _InitFlag <= 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
private static int _InitFlag = 1;
|
|||
|
|
/// <summary>
|
|||
|
|
/// 初始化 基础表结构,只运行1次
|
|||
|
|
/// </summary>
|
|||
|
|
public static void InitDBSchemasOnStart()
|
|||
|
|
{
|
|||
|
|
List<string> connNames = new List<string>();
|
|||
|
|
foreach (ConnectionStringSettings item in ConfigurationManager.ConnectionStrings)
|
|||
|
|
{
|
|||
|
|
if (!string.IsNullOrEmpty(item.Name) && item.Name.ToLower().EndsWith("conn"))
|
|||
|
|
{
|
|||
|
|
connNames.Add(item.Name);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
_InitFlag = connNames.Count;
|
|||
|
|
if (connNames.Count > 0)
|
|||
|
|
{
|
|||
|
|
foreach (string item in connNames)
|
|||
|
|
{
|
|||
|
|
Thread thread = new Thread(new ParameterizedThreadStart(InitDBSchemaByThreadWork));
|
|||
|
|
thread.Start(item);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static void InitDBSchemaByThreadWork(object conn)
|
|||
|
|
{
|
|||
|
|
ConnBean cb = ConnBean.Create(conn.ToString());
|
|||
|
|
if (cb == null) { return; }
|
|||
|
|
string key = cb.GetHashKey();
|
|||
|
|
DBInfo info = GetSchemaDic(cb.ConnName, true);
|
|||
|
|
if (!_DBScheams.ContainsKey(key))
|
|||
|
|
{
|
|||
|
|
_DBScheams.Add(key, info);
|
|||
|
|
}
|
|||
|
|
_InitFlag--;
|
|||
|
|
Thread.Sleep(100);//等待其它线程处理完。
|
|||
|
|
var tables = info.Tables;
|
|||
|
|
//初始化表结构
|
|||
|
|
if (tables != null && tables.Count > 0)
|
|||
|
|
{
|
|||
|
|
var keys = tables.GetKeys();
|
|||
|
|
foreach (var tableKey in keys)
|
|||
|
|
{
|
|||
|
|
if (tables.ContainsKey(tableKey))
|
|||
|
|
{
|
|||
|
|
var table = tables[tableKey];
|
|||
|
|
if (table != null)
|
|||
|
|
{
|
|||
|
|
table.Reflesh();
|
|||
|
|
Thread.Sleep(1);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var views = info.Views;
|
|||
|
|
if (views != null && views.Count > 0)
|
|||
|
|
{
|
|||
|
|
var keys = views.GetKeys();
|
|||
|
|
foreach (var viewKey in keys)
|
|||
|
|
{
|
|||
|
|
if (views.ContainsKey(viewKey))
|
|||
|
|
{
|
|||
|
|
var view = views[viewKey];
|
|||
|
|
if (view != null)
|
|||
|
|
{
|
|||
|
|
view.Reflesh();
|
|||
|
|
Thread.Sleep(1);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static readonly object oo = new object();
|
|||
|
|
public static void InitDBSchemasAgain()
|
|||
|
|
{
|
|||
|
|
if (!IsInitDBCompleted)
|
|||
|
|
{
|
|||
|
|
List<string> connNames = new List<string>();
|
|||
|
|
foreach (ConnectionStringSettings item in ConfigurationManager.ConnectionStrings)
|
|||
|
|
{
|
|||
|
|
if (!string.IsNullOrEmpty(item.Name) && item.Name.ToLower().EndsWith("conn"))
|
|||
|
|
{
|
|||
|
|
connNames.Add(item.Name);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (connNames.Count > 0)
|
|||
|
|
{
|
|||
|
|
lock (oo)
|
|||
|
|
{
|
|||
|
|
foreach (string item in connNames)
|
|||
|
|
{
|
|||
|
|
if (IsInitDBCompleted)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
GetSchema(item);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
_InitFlag = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|