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); } } }
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 { } }
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); } } }
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); } } }
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); } } }
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 { } }
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); } } }
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); } } }
/// <summary> /// 处理程序 /// </summary> /// <param name="state"></param> private void Handler(object state) { logger.LogInformation("执行定时器验证从库服务器的状态"); SlavePools.TimerHeartBeatCheck(); }