/// <summary>
        /// 优化主要包括的是支持顺序查询
        /// </summary>
        /// <param name="dataSourceName"></param>
        /// <param name="sqlUnits"></param>
        /// <param name="callback"></param>
        /// <returns></returns>
        private List <InputGroup <CommandExecuteUnit> > GetSqlExecuteGroups(string dataSourceName, List <SqlUnit> sqlUnits,
                                                                            ISqlExecutePrepareCallback callback)
        {
            ICollection <InputGroup <CommandExecuteUnit> > result = new LinkedList <InputGroup <CommandExecuteUnit> >();
            int desiredPartitionSize =
                Math.Max(
                    0 == sqlUnits.Count % _maxConnectionsSizePerQuery
                        ? sqlUnits.Count / _maxConnectionsSizePerQuery
                        : sqlUnits.Count / _maxConnectionsSizePerQuery + 1, 1);
            List <List <SqlUnit> > sqlUnitPartitions = sqlUnits
                                                       .Select((o, i) => new { Obj = o, index = i % desiredPartitionSize }).GroupBy(o => o.index)
                                                       .Select(o => o.Select(g => g.Obj).ToList()).ToList();
            ConnectionModeEnum connectionMode = _maxConnectionsSizePerQuery < sqlUnits.Count
                ? ConnectionModeEnum.CONNECTION_STRICTLY
                : ConnectionModeEnum.MEMORY_STRICTLY;
            List <DbConnection> connections =
                callback.GetConnections(connectionMode, dataSourceName, sqlUnitPartitions.Count);
            int count = 0;

            foreach (var item in sqlUnitPartitions)
            {
                result.Add(GetSqlExecuteGroup(connectionMode, connections[count++], dataSourceName, item, callback));
            }

            return(result.ToList());
        }
예제 #2
0
        public List <DbConnection> GetConnections(ConnectionModeEnum connectionMode, string dataSourceName, int connectionSize)
        {
            var dbConnections = _commandExecutor.Connection.GetConnections(connectionMode, dataSourceName, connectionSize);

            //dbConnections.ForEach(o=>o.Open());
            return(dbConnections);
        }
예제 #3
0
        private List <DbConnection> CreateConnections(string dataSourceName, ConnectionModeEnum connectionMode, IDataSource dataSource, int connectionSize)
        {
            if (1 == connectionSize)
            {
                if (dataSource.IsDefault())
                {
                    return(new List <DbConnection>()
                    {
                        GetDefaultDbConnection()
                    });
                }
                var connection = CreateConnection(dataSourceName, dataSource);
                ReplyTargetMethodInvoke(connection);
                return(new List <DbConnection>()
                {
                    connection
                });
            }

            if (ConnectionModeEnum.CONNECTION_STRICTLY == connectionMode)
            {
                return(CreateConnections(dataSourceName, dataSource, connectionSize));
            }

            lock (dataSource)
            {
                return(CreateConnections(dataSourceName, dataSource, connectionSize));
            }
        }
예제 #4
0
        private int DoExecuteNonQuery(string sql, DbCommand command, ConnectionModeEnum connectionMode)
        {
            // DbDataReader resultSet = command.ExecuteReader(sql);
            // command.CommandText = sql;
            var i = command.ExecuteNonQuery();

            return(i);
        }
예제 #5
0
        private IStreamDataReader GetQueryEnumerator(string sql, DbCommand command, ConnectionModeEnum connectionMode)
        {
            // DbDataReader resultSet = command.ExecuteReader(sql);
            // command.CommandText = sql;
            DbDataReader resultSet = command.ExecuteReader();

            DbDataReaders.Add(resultSet);
            if (ConnectionModeEnum.MEMORY_STRICTLY == connectionMode)
            {
                return(new StreamQueryDataReader(resultSet));
            }
            return(new MemoryQueryDataReader(resultSet));
        }
        private InputGroup <CommandExecuteUnit> GetSqlExecuteGroup(ConnectionModeEnum connectionMode,
                                                                   DbConnection connection,
                                                                   string dataSourceName, List <SqlUnit> sqlUnitGroup, ISqlExecutePrepareCallback callback)
        {
            List <CommandExecuteUnit> result = new List <CommandExecuteUnit>();

            foreach (var sqlUnit in sqlUnitGroup)
            {
                result.Add(callback.CreateCommandExecuteUnit(connection, new ExecutionUnit(dataSourceName, sqlUnit),
                                                             connectionMode));
            }

            return(new InputGroup <CommandExecuteUnit>(result));
        }
예제 #7
0
        public CommandExecuteUnit CreateCommandExecuteUnit(DbConnection connection, ExecutionUnit executionUnit,
                                                           ConnectionModeEnum connectionMode)
        {
            var shardingParameters = executionUnit.GetSqlUnit().GetParameterContext().GetDbParameters().Select(o => (ShardingParameter)o).ToList();
            var dbCommand          = connection.CreateCommand();

            //TODO取消手动执行改成replay
            dbCommand.CommandText = executionUnit.GetSqlUnit().GetSql();
            foreach (var shardingParameter in shardingParameters)
            {
                var dbParameter = dbCommand.CreateParameter();
                dbParameter.ParameterName = shardingParameter.ParameterName;
                dbParameter.Value         = shardingParameter.Value;
                dbCommand.Parameters.Add(dbParameter);
            }
            return(new CommandExecuteUnit(executionUnit, dbCommand, connectionMode));
        }
예제 #8
0
        public List <DbConnection> GetConnections(ConnectionModeEnum connectionMode, string dataSourceName, int connectionSize)
        {
            var dataSourceMap = GetDataSourceMap();

            if (!dataSourceMap.ContainsKey(dataSourceName))
            {
                throw new ShardingException($"missing the data source name: '{dataSourceName}'");
            }
            IDataSource dataSource = dataSourceMap[dataSourceName];

            //ICollection<DbConnection> connections;
            //lock (cachedConnections)
            //{
            //    connections = cachedConnections.GetValues(dataSourceName, true);
            //}
            //List<DbConnection> result;
            //if (connections.Count >= connectionSize)
            //{
            //    result = new List<DbConnection>(connections).GetRange(0, connectionSize);
            //}
            //else if (connections.Any())
            //{
            //    result = new List<DbConnection>(connections);
            //    List<DbConnection> newConnections = CreateConnections(dataSourceName, connectionMode, dataSource, connectionSize - connections.Count);
            //    result.AddRange(newConnections);
            //    lock (cachedConnections)
            //    {
            //        cachedConnections.AddRange(dataSourceName, newConnections);
            //    }
            //}
            //else
            //{
            //    result = new List<DbConnection>(CreateConnections(dataSourceName, connectionMode, dataSource, connectionSize));
            //    lock (cachedConnections)
            //    {
            //        cachedConnections.AddRange(dataSourceName, result);
            //    }
            //}
            _connections = new List <DbConnection>(CreateConnections(dataSourceName, connectionMode, dataSource, connectionSize));

            return(_connections);
        }
예제 #9
0
 public CommandExecuteUnit(ExecutionUnit executionUnit, DbCommand command, ConnectionModeEnum connectionMode)
 {
     ExecutionUnit  = executionUnit;
     Command        = command;
     ConnectionMode = connectionMode;
 }
예제 #10
0
 public DataSourceSqlExecutorUnit(ConnectionModeEnum connectionMode, List <SqlExecutorGroup <CommandExecuteUnit> > sqlExecutorGroups)
 {
     ConnectionMode    = connectionMode;
     SqlExecutorGroups = sqlExecutorGroups;
 }
예제 #11
0
        private static AbstractHttpStream OpenStream(
            string scheme, string host, int port,
            X509CertificateCollection clientCertificates,
            SslProtocols enabledSslProtocols,
            bool checkCertificateRevocation,
            ConnectionModeEnum reuseMode,
            RemoteCertificateValidationCallback remoteCertificateValidationCallback,
            bool enableIPv6)
        {
            if (reuseMode == ConnectionModeEnum.UpgradeHttp2 && scheme != Uri.UriSchemeHttp)
            {
                throw new ArgumentException(nameof(reuseMode));
            }

            if (reuseMode != ConnectionModeEnum.SingleRequest)
            {
                string key = scheme + "://" + host + ":" + port.ToString();
                RwLockedList <StreamInfo> streaminfo;
                if (m_StreamList.TryGetValue(key, out streaminfo))
                {
                    AbstractHttpStream stream = null;
                    lock (streaminfo)
                    {
                        if (streaminfo.Count > 0)
                        {
                            if ((streaminfo[0].ValidUntil - Environment.TickCount) > 0)
                            {
                                stream = streaminfo[0].Stream;
                            }
                            streaminfo.RemoveAt(0);
                        }
                    }
                    m_StreamList.RemoveIf(key, (RwLockedList <StreamInfo> info) => info.Count == 0);

                    if (stream != null)
                    {
                        if (reuseMode == ConnectionModeEnum.Close)
                        {
                            stream.IsReusable = false;
                        }

                        return(stream);
                    }
                }
            }

            if (scheme == Uri.UriSchemeHttp)
            {
                return(new HttpStream(ConnectToTcp(host, port, enableIPv6))
                {
                    IsReusable = reuseMode == ConnectionModeEnum.Keepalive
                });
            }
            else if (scheme == Uri.UriSchemeHttps)
            {
                return(ConnectToSslServer(host, port, clientCertificates, enabledSslProtocols, checkCertificateRevocation, reuseMode == ConnectionModeEnum.Keepalive, remoteCertificateValidationCallback, enableIPv6));
            }
            else
            {
                throw new NotSupportedException();
            }
        }
 public SqlExecutorGroup(ConnectionModeEnum connectionMode,List<T> groups)
 {
     ConnectionMode = connectionMode;
     Groups = groups;
 }