/// <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());
        }
        private ICollection <InputGroup <CommandExecuteUnit> > GetSynchronizedExecuteUnitGroups(
            ICollection <ExecutionUnit> executionUnits, ISqlExecutePrepareCallback callback)
        {
            IDictionary <string, List <SqlUnit> >          sqlUnitGroups = GetSqlUnitGroups(executionUnits);
            ICollection <InputGroup <CommandExecuteUnit> > result        = new LinkedList <InputGroup <CommandExecuteUnit> >();

            foreach (var sqlUnitGroup in sqlUnitGroups)
            {
                result.AddAll(GetSqlExecuteGroups(sqlUnitGroup.Key, sqlUnitGroup.Value, callback));
            }

            return(result);
        }
 /**
  * Get execute unit groups.
  *
  * @param executionUnits execution units
  * @param callback SQL execute prepare callback
  * @return statement execute unit groups
  * @throws SQLException SQL exception
  */
 public ICollection <InputGroup <CommandExecuteUnit> > GetExecuteUnitGroups(
     ICollection <ExecutionUnit> executionUnits, ISqlExecutePrepareCallback callback)
 {
     return(GetSynchronizedExecuteUnitGroups(executionUnits, callback));
 }
        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));
        }