我需要加快在应用程序中执行12个查询的速度。我从常规的foreach切换到Parallel.ForEach。但是有时我会收到一条错误消息,提示“
ExecuteReader需要打开且可用的连接。连接的当前状态为连接中”。据我了解,由于12个查询中的许多查询都使用相同的InitialCatalog,因此12个查询中并没有真正的新连接,这可能是问题所在吗?我怎样才能解决这个问题?“
sql”是“ Sql”类型的列表-一个类只是一个字符串名称,字符串connectiona和一个查询列表。这是代码:
/// <summary>
/// Connects to SQL, performs all queries and stores results in a list of DataTables
/// </summary>
/// <returns>List of data tables for each query in the config file</returns>
public List<DataTable> GetAllData()
{
Stopwatch sw = new Stopwatch();
sw.Start();
List<DataTable> data = new List<DataTable>();
List<Sql> sql=new List<Sql>();
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类:
/// <summary>
/// Class defines a SQL connection and its respective queries
/// </summary>
public class Sql
{
/// <summary>
/// Name of the connection/query
/// </summary>
public string name { get; set; }
/// <summary>
/// SQL Connection string
/// </summary>
public string connection { get; set; }
/// <summary>
/// List of SQL queries for a connection
/// </summary>
public List<string> queries = new List<string>();
}
我将重构您的业务逻辑(连接到数据库)。
public class SqlOperation
{
public SqlOperation()
{
Queries = new List<string>();
}
public string TableName { get; set; }
public string ConnectionString { get; set; }
public List<string> Queries { get; set; }
}
public static List<DataTable> GetAllData(IEnumerable<SqlOperation> sql)
{
var taskArray =
sql.SelectMany(s =>
s.Queries
.Select(query =>
Task.Run(() => //Task.Factory.StartNew for .NET 4.0
ExecuteQuery(s.ConnectionString, s.TableName, query))))
.ToArray();
try
{
Task.WaitAll(taskArray);
}
catch(AggregateException e)
{
MessageBox.Show(e.ToString(), "GetAllData error");
}
return taskArray.Where(t => !t.IsFaulted).Select(t => t.Result).ToList();
}
public static DataTable ExecuteQuery(string connectionString, string tableName, string query)
{
DataTable dataTable = null;
using (var connection = new SqlConnection(connectionString))
{
dataTable = new DataTable();
dataTable.TableName = tableName;
using(var command = new SqlCommand(query, connection))
{
connection.Open();
using(var adapter = new SqlDataAdapter())
{
adapter.SelectCommand = command;
adapter.Fill(dataTable);
}
}
}
return dataTable;
}
在使用Spring和Wiremock进行集成测试时,我遇到了一个非常奇怪的情况:突然间歇性地开始失败。以下错误片段: 上下文如下:我添加了一个新的测试,该测试使用wiremock来存根响应: 对这个存根endpoint的调用如下: 奇怪的是: < li >相同的测试在我的本地计算机上运行没有任何问题-如果单独运行的话 < li >在我的机器上运行所有测试时,有时相同的测试会失败,有时不会 < li
我正在使用Androidncoder生成一个带有AAC音频的H264视频,通过RTMP网络发送,并使用MediaMuxer本地存储在MP4文件中。 广播在RTMP上运行良好,但在本地保存时,生成的视频有时还可以,有时只是带有声音的黑色帧(或者只是带有一些信息块的第一部分帧),有时它先播放音频,然后以随机FPS速度播放视频。 这是我的Muxer包装器类和MPEG4Writer SDK类显示的输出:
问题内容: 我正在编写一个PL / SQL过程,该过程需要动态生成一些查询,其中之一涉及使用来自查询的结果作为参数来创建临时表。 它可以正确编译,但是即使使用非常简单的查询,例如: IT抛出。如果我手动运行创建的查询,它将正确运行。在这一点上,我能够确定是什么导致了问题。 问题答案: 尝试丢掉“;” 从您立即执行的字符串内部。
我有一条sql ,不知道为什么会导致索引失效 当我注释掉 select 后面的 pc.name 字段就可以使用索引。 不知道为什么,有没有大佬给我解惑一下。 测试环境中dev_device_log表中只有几百条数据的时候可以走索引,但是我从生产环境随意导出了几万条数据后就无法使用索引了。 不太理解为什么select 后面的字段会影响到索引情况 表结构: 我导出了一份几万条脱敏后的数据,但是不知道怎
我正在尝试使用、和(不使用)实现实时相机应用程序 所以,我发现这篇教程 http://altitudelabs.com/blog/real-time-filter/ 它是用Objective-C编写的,所以我在Swift4.0中重写了那个代码,xcode9 它看起来工作很好,但有时(很少),它崩溃了以下错误。调用的方法时 EXC_BAD_ACCESS(代码=1,地址+0x************)
问题内容: 示例代码: 在代码中,我已经执行了一些无效的读取和无效的写入,但是这个小程序可以正常工作,并且不会创建。 但是一旦进入我的大库,每当我进行1个字节的无效读取或无效写入时,它总是在创建核心转储。 题: 为什么有时我会通过无效的读/写操作获得核心转储,而有时却没有获得核心转储? 问题答案: 您想要做的基本上是缓冲区溢出&在您的代码示例中,更具体地说是堆溢出。您有时只看到崩溃的原因取决于您正