Example #1
0
        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());
            }
        }
Example #3
0
 /// <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));
        }
Example #5
0
        /// <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);
        }
Example #6
0
        /// <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}");
        }