Beispiel #1
0
 public Executer(IDistributedCache cache, string masterConnectionString, string[] slaveConnectionStrings, ILogger log)
 {
     Log        = log;
     MasterPool = new SqlConnectionPool("主库", masterConnectionString, null, null);
     Cache      = cache;
     if (slaveConnectionStrings != null)
     {
         foreach (var slaveConnectionString in slaveConnectionStrings)
         {
             var slavePool = new SqlConnectionPool($"从库{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
             SlavePools.Add(slavePool);
         }
     }
     if (cache != null)
     {
         var key1 = $"testCacheSupportMultiRemove{Guid.NewGuid().ToString("N")}";
         var key2 = $"testCacheSupportMultiRemove{Guid.NewGuid().ToString("N")}";
         cache.Set(key1, new byte[] { 65 });
         cache.Set(key2, new byte[] { 65 });
         try { cache.Remove($"{key1}|{key2}"); } catch { }                 // redis-cluster 不允许执行 multi keys 命令
         CacheSupportMultiRemove = cache.Get(key1) == null && cache.Get(key2) == null;
         if (CacheSupportMultiRemove == false)
         {
             log.LogWarning("PSqlHelper Warning: 低性能, IDistributedCache 没实现批量删除缓存 Cache.Remove(\"key1|key2\").");
             CacheRemove(key1, key2);
         }
     }
 }
Beispiel #2
0
        public void Dispose()
        {
            if (_isdisposed)
            {
                return;
            }
            try {
                Transaction2[] trans = null;
                lock (_trans_lock)
                    trans = _trans.Values.ToArray();
                foreach (Transaction2 tran in trans)
                {
                    CommitTransaction(false, tran);
                }
            } catch { }

            ObjectPool <DbConnection>[] pools = null;
            for (var a = 0; a < 10; a++)
            {
                try {
                    pools = SlavePools.ToArray();
                    SlavePools.Clear();
                    break;
                } catch {
                }
            }
            if (pools != null)
            {
                foreach (var pool in pools)
                {
                    try { pool.Dispose(); } catch { }
                }
            }
            try { MasterPool.Dispose(); } catch { }
        }
Beispiel #3
0
		public PostgreSQLAdo(CommonUtils util, ICache cache, ILogger log, string masterConnectionString, string[] slaveConnectionStrings) : base(cache, log, DataType.PostgreSQL) {
			base._util = util;
			if (!string.IsNullOrEmpty(masterConnectionString))
				MasterPool = new PostgreSQLConnectionPool("主库", masterConnectionString, null, null);
			if (slaveConnectionStrings != null) {
				foreach (var slaveConnectionString in slaveConnectionStrings) {
					var slavePool = new PostgreSQLConnectionPool($"从库{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
					SlavePools.Add(slavePool);
				}
			}
		}
Beispiel #4
0
 public OracleAdo(CommonUtils util, ICache cache, ILogger log, string masterConnectionString, string[] slaveConnectionStrings) : base(cache, log)
 {
     this._util = util;
     MasterPool = new OracleConnectionPool("主库", masterConnectionString, null, null);
     if (slaveConnectionStrings != null)
     {
         foreach (var slaveConnectionString in slaveConnectionStrings)
         {
             var slavePool = new OracleConnectionPool($"从库{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
             SlavePools.Add(slavePool);
         }
     }
 }
Beispiel #5
0
 public OracleAdo(CommonUtils util, string masterConnectionString, string[] slaveConnectionStrings) : base(DataType.Oracle)
 {
     base._util = util;
     if (!string.IsNullOrEmpty(masterConnectionString))
     {
         MasterPool = new OracleConnectionPool("主库", masterConnectionString, null, null);
     }
     if (slaveConnectionStrings != null)
     {
         foreach (var slaveConnectionString in slaveConnectionStrings)
         {
             var slavePool = new OracleConnectionPool($"从库{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
             SlavePools.Add(slavePool);
         }
     }
 }
Beispiel #6
0
        public void Dispose()
        {
            if (ResolveTransaction != null)
            {
                return;
            }
            if (Interlocked.Increment(ref _disposeCounter) != 1)
            {
                return;
            }
            try
            {
                var trans = _trans?.Values.ToArray();
                if (trans != null)
                {
                    foreach (var tran in trans)
                    {
                        CommitTransaction(false, tran, null, "Dispose自动提交");
                    }
                }
            }
            catch { }

            IObjectPool <DbConnection>[] pools = null;
            for (var a = 0; a < 10; a++)
            {
                try
                {
                    pools = SlavePools?.ToArray();
                    SlavePools?.Clear();
                    break;
                }
                catch
                {
                }
            }
            if (pools != null)
            {
                foreach (var pool in pools)
                {
                    try { pool?.Dispose(); } catch { }
                }
            }
            try { MasterPool?.Dispose(); } catch { }
        }
Beispiel #7
0
 public OdbcOracleAdo(CommonUtils util, string masterConnectionString, string[] slaveConnectionStrings, Func<DbConnection> connectionFactory) : base(DataType.OdbcOracle)
 {
     base._util = util;
     if (connectionFactory != null)
     {
         MasterPool = new FreeSql.Internal.CommonProvider.DbConnectionPool(DataType.OdbcOracle, connectionFactory);
         return;
     }
     if (!string.IsNullOrEmpty(masterConnectionString))
         MasterPool = new OdbcOracleConnectionPool("主库", masterConnectionString, null, null);
     if (slaveConnectionStrings != null)
     {
         foreach (var slaveConnectionString in slaveConnectionStrings)
         {
             var slavePool = new OdbcOracleConnectionPool($"从库{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
             SlavePools.Add(slavePool);
         }
     }
 }
Beispiel #8
0
 public PostgreSQLAdo(CommonUtils util, string masterConnectionString, string[] slaveConnectionStrings, Func <DbConnection> connectionFactory) : base(DataType.PostgreSQL, masterConnectionString, slaveConnectionStrings)
 {
     base._util = util;
     if (connectionFactory != null)
     {
         MasterPool = new FreeSql.Internal.CommonProvider.DbConnectionPool(DataType.PostgreSQL, connectionFactory);
         return;
     }
     if (!string.IsNullOrEmpty(masterConnectionString))
     {
         MasterPool = new PostgreSQLConnectionPool(CoreStrings.S_MasterDatabase, masterConnectionString, null, null);
     }
     if (slaveConnectionStrings != null)
     {
         foreach (var slaveConnectionString in slaveConnectionStrings)
         {
             var slavePool = new PostgreSQLConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
             SlavePools.Add(slavePool);
         }
     }
 }
Beispiel #9
0
 /// <summary>
 /// 处理程序
 /// </summary>
 /// <param name="state"></param>
 private void Handler(object state)
 {
     logger.LogInformation("执行定时器验证从库服务器的状态");
     SlavePools.TimerHeartBeatCheck();
 }