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);
        }
예제 #2
0
        /// <summary>
        /// 从所有从数据库中返回一个
        /// </summary>
        /// <param name="slaves">所有从数据库</param>
        /// <returns></returns>
        public SlaveDatabaseOptions Select(SlaveDatabaseOptions[] slaves)
        {
            SlaveDatabaseOptions slave = Random.NextItem(slaves);

            _logger.LogDebug($"随机选取了“{slave.Name}”的从数据库");
            return(slave);
        }
예제 #3
0
        /// <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);
            }
        }
예제 #4
0
        /// <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);
            }
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
 public SlaveDatabaseOptionsWrap(SlaveDatabaseOptions slave)
 {
     Weight = slave.Weight;
 }