Parallel.Foreach SQL-запросов иногда приводит к подключению
Мне нужно ускорить выполнение 12 запросов в моем приложении. Я переключился с обычного foreach на Parallel.ForEach. Но иногда я получаю сообщение об ошибке "ExecuteReader требует открытого и доступного соединениятекущее состояние соединяется. " Насколько я понимаю, так как многие из 12 запросов используют один и тот же InitialCatalog, в действительности нет нового соединения для 12, и в этом может быть проблема? Как я могу это исправить? "SQL» это список типа "Sql»- класс - это просто строковое имя, строковое соединение и список запросов. Вот код:
///
/// Connects to SQL, performs all queries and stores results in a list of DataTables
///
/// List of data tables for each query in the config file
public List GetAllData()
{
Stopwatch sw = new Stopwatch();
sw.Start();
List data = new List();
List sql=new List();
Sql one = new Sql();
one.connection = "Data Source=XXX-SQL1;Initial Catalog=XXXDB;Integrated Security=True";
one.name = "Col1";
one.queries.Add("SELECT Name FROM [Reports]");
one.queries.Add("SELECT Other FROM [Reports2]");
sql.Add(one);
Sql two = new Sql();
two.connection = "Data Source=XXX-SQL1;Initial Catalog=XXXDB;Integrated Security=True";
two.name = "Col2";
two.queries.Add("SELECT AlternateName FROM [Reports1]");
sql.Add(two);
Sql three = new Sql();
three.connection = "Data Source=YYY-SQL2;Initial Catalog=YYYDB;Integrated Security=True";
three.name = "Col3";
three.queries.Add("SELECT Frequency FROM Times");
sql.Add(three);
try
{
// ParallelOptions options = new ParallelOptions();
//options.MaxDegreeOfParallelism = 3;
// Parallel.ForEach(sql, options, s =>
Parallel.ForEach(sql, s =>
//foreach (Sql s in sql)
{
foreach (string q in s.queries)
{
using (connection = new SqlConnection(s.connection))
{
connection.Open();
DataTable dt = new DataTable();
dt.TableName = s.name;
command = new SqlCommand(q, connection);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = command;
adapter.Fill(dt);
//adapter.Dispose();
lock (data)
{
data.Add(dt);
}
}
}
}
);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "GetAllData error");
}
sw.Stop();
MessageBox.Show(sw.Elapsed.ToString());
return data;
}
Вот'Sql класс, который я сделал, что тымне нужно:
///
/// Class defines a SQL connection and its respective queries
///
public class Sql
{
///
/// Name of the connection/query
///
public string name { get; set; }
///
/// SQL Connection string
///
public string connection { get; set; }
///
/// List of SQL queries for a connection
///
public List queries = new List();
}