public static IDbConnection GetConnection(string connectionString, IDbConnectionAdapter adapter) { if (adapter == null) { throw new ArgumentNullException(nameof(adapter)); } Transaction current = Transaction.Current; if (current == null) { return(null); } Dictionary <string, DbConnectionWrapper> dictionary = null; lock (transactionConnections) { if (!transactionConnections.TryGetValue(current, out dictionary)) { dictionary = new Dictionary <string, DbConnectionWrapper>(); transactionConnections.Add(current, dictionary); current.TransactionCompleted += OnTransactionCompleted; } } DbConnectionWrapper dbconnection = null; lock (dictionary) { if (!dictionary.TryGetValue(connectionString, out dbconnection)) { dictionary.Add(connectionString, dbconnection = new DbConnectionWrapper(adapter.Create(connectionString))); } return(dbconnection.GetConnection()); } }
/// <summary> 获取数据库连接 </summary> /// <param name="connectionString">数据库连接</param> /// <param name="adapter">数据库适配器</param> /// <param name="threadCache">是否启用线程缓存(不启用缓存时优先读取事务连接池)</param> /// <returns></returns> public IDbConnection GetConnection(string connectionString, IDbConnectionAdapter adapter, bool threadCache = true) { lock (LockObj) { if (!threadCache) { return(TransactionScopeConnections.GetConnection(connectionString, adapter) ?? adapter.Create(connectionString)); } var connectionKey = Thread.CurrentThread; if (!ConnectionCache.TryGetValue(connectionKey, out Dictionary <string, DbConnectionWrapper> connDict)) { connDict = new Dictionary <string, DbConnectionWrapper>(); if (!ConnectionCache.TryAdd(connectionKey, connDict)) { throw new Exceptions.DException($"{connectionString}数据库连接添加失败!"); } } if (connDict.TryGetValue(connectionString, out DbConnectionWrapper info)) { return(info.GetConnection()); } info = new DbConnectionWrapper(adapter.Create(connectionString), TimeSpan.FromMinutes(Math.Min(60, Math.Max(5, adapter.ConnectionHeartbeat)))); connDict.Add(connectionString, info); if (!_clearTimerRun) { _clearTimer.Start(); _clearTimerRun = true; } return(info.GetConnection()); } }
/// <summary> 添加适配器 </summary> /// <param name="adapter"></param> public static void AddAdapter(IDbConnectionAdapter adapter) { if (Adapters.ContainsKey(adapter.ProviderType)) { return; } Adapters.TryAdd(adapter.ProviderType, adapter); }
/// <summary> 添加适配器 </summary> /// <param name="adapter"></param> public static void AddAdapter(IDbConnectionAdapter adapter) { if (adapter == null || string.IsNullOrWhiteSpace(adapter.ProviderName)) { return; } var key = adapter.ProviderName.ToLower(); if (Adapters.ContainsKey(key)) { return; } Adapters.TryAdd(key, new Lazy <IDbConnectionAdapter>(() => adapter)); }
/// <summary> 添加适配器 </summary> /// <param name="adapter"></param> public static void AddAdapter(IDbConnectionAdapter adapter) { if (adapter == null) { throw new ArgumentNullException(nameof(adapter)); } if (string.IsNullOrWhiteSpace(adapter.ProviderName)) { throw new DException("数据库适配器名称不能为空!"); } var key = adapter.ProviderName.ToLower(); if (Adapters.ContainsKey(key)) { return; } Adapters.TryAdd(key, adapter); }
/// <summary> /// 获取数据仓促供应器 /// </summary> /// <param name="adapter"></param> /// <returns></returns> public static RepositoryProvider Create(IDbConnectionAdapter adapter) { if (adapter == null) { throw new ArgumentNullException(nameof(adapter)); } string key = adapter.ProviderName.ToLower(); if (Providers.TryGetValue(key, out RepositoryProvider provider)) { return(provider); } if (FactoryProviders.TryGetValue(key, out Func <IDbConnectionAdapter, RepositoryProvider> factory)) { return(Providers.GetOrAdd(key, _ => factory(adapter))); } throw new DException($"不支持的供应商:{adapter.ProviderName}"); }