public void SelectTest() { var logger = Substitute.For <ILogger <SequenceSlaveDatabaseSelector> >(); var factory = Substitute.For <ILoggerFactory>(); var provider = Substitute.For <IServiceProvider>(); provider.GetService <ILoggerFactory>().Returns(factory); factory.CreateLogger <SequenceSlaveDatabaseSelector>().Returns(logger); SequenceSlaveDatabaseSelector selector = new(provider); SlaveDatabaseOptions[] slaves = { new() { ConnectionString = "Conn01", Name = "SqlServer", Weight = 1 }, new() { ConnectionString = "Conn02", Name = "MySql", Weight = 2 }, new() { ConnectionString = "Conn03", Name = "Sqlite", Weight = 3 } }; SlaveDatabaseOptions slave = selector.Select(slaves); Assert.Equal("SqlServer", slave.Name); slave = selector.Select(slaves); Assert.Equal("MySql", slave.Name); slave = selector.Select(slaves); Assert.Equal("Sqlite", slave.Name); slave = selector.Select(slaves); Assert.Equal("SqlServer", slave.Name); }
/// <summary> /// 从所有从数据库中返回一个 /// </summary> /// <param name="slaves">所有从数据库</param> /// <returns></returns> public SlaveDatabaseOptions Select(SlaveDatabaseOptions[] slaves) { SlaveDatabaseOptions slave = Random.NextItem(slaves); _logger.LogDebug($"随机选取了“{slave.Name}”的从数据库"); return(slave); }
/// <summary> /// 从所有从数据库中返回一个 /// </summary> /// <param name="slaves">所有从数据库</param> /// <returns></returns> public SlaveDatabaseOptions Select(SlaveDatabaseOptions[] slaves) { lock (LockObj) { if (_queue.Count == 0) { _queue = GetIndexes(slaves); } int index = _queue.Dequeue(); SlaveDatabaseOptions slave = slaves[index]; _logger.LogDebug($"平滑权重选取了“{slave.Name}”的从数据库,权重:{slave.Weight}"); return(slave); } }
/// <summary> /// 从所有从数据库中返回一个 /// </summary> /// <param name="slaves">所有从数据库</param> /// <returns></returns> public SlaveDatabaseOptions Select(SlaveDatabaseOptions[] slaves) { lock (LockObj) { if (_sequenceIndex > slaves.Length - 1) { _sequenceIndex = 0; } SlaveDatabaseOptions slave = slaves[_sequenceIndex]; _logger.LogDebug($"顺序选取了“{slave.Name}”的从数据库,顺序号:{_sequenceIndex}"); _sequenceIndex++; return(slave); } }
/// <summary> /// 获取指定数据上下文类型的数据库连接字符串 /// </summary> /// <param name="dbContextType">数据上下文类型</param> /// <returns></returns> public virtual string GetConnectionString(Type dbContextType) { OsharpDbContextOptions dbContextOptions = _dbContexts.Values.FirstOrDefault(m => m.DbContextType == dbContextType); if (dbContextOptions == null) { throw new OsharpException($"数据上下文“{dbContextType}”的数据上下文配置信息不存在"); } bool isSlave = _masterSlavePolicy.IsToSlaveDatabase(dbContextOptions); if (!isSlave) { return(dbContextOptions.ConnectionString); } SlaveDatabaseOptions[] slaves = dbContextOptions.Slaves; ISlaveDatabaseSelector slaveDatabaseSelector = _slaveDatabaseSelectors.LastOrDefault(m => m.Name == dbContextOptions.SlaveSelectorName) ?? _slaveDatabaseSelectors.First(m => m.Name == "Weight"); SlaveDatabaseOptions slave = slaveDatabaseSelector.Select(slaves); return(slave.ConnectionString); }
public SlaveDatabaseOptionsWrap(SlaveDatabaseOptions slave) { Weight = slave.Weight; }