/// <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)); }