MultiThreading错误:已经有一个与此Connection关联的打开DataReader,必须先关闭它
我有一个Parallel.Foreach循环
var options = new ParallelOptions(); options.MaxDegreeOfParallelism = 1; Parallel.ForEach(urlTable.AsEnumerable(),drow => { using (var WCC = new MasterCrawlerClass()) { WCC.MasterCrawlBegin(drow); } }
这个循环调用类并循环遍历我的所有DataRows,但是每个数据行都执行DataTable填充,或者对MySQL DB执行更新命令。 我对这两个代码的代码如下。
private static DataTable DTTable(string mysqlQuery, string queryName) { DataTable DTTableTable = new DataTable(); try { MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, MySQLProcessing.MySQLStatic.Connection); DataTable DataDTTablesDT = new DataTable(); DataDTTables.SelectCommand.CommandTimeout = 240000; DataDTTables.Fill(DataDTTablesDT); DTTableTable = DataDTTablesDT; } catch (Exception ex) { GenericLogging("Failed MySQLquery: " + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", queryName, mysqlQuery); } return DTTableTable; }
private static void MySQLInsertUpdate(string MySQLCommand, string mysqlcommand_name) { try { MySqlCommand MySQLCommandFunc = new MySqlCommand(MySQLCommand, MySQLProcessing.MySQLStatic.Connection); MySQLCommandFunc.CommandTimeout = 240000; MySQLCommandFunc.ExecuteNonQuery(); } catch (Exception ex) { GenericLogging("Failed MySQLquery: " + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", mysqlcommand_name, MySQLCommand); } }
事情是WCC包含10个左右的空洞,这些空洞中的每一个都至少访问一次MySQL函数。 因此,如果锁定是答案,是否可以为所有空隙创建1个锁定function? 如果是这样的话? 如果有其他方式,请告诉我
谢谢!
好的,我建议我巩固问题
代码现已更新以反映锁定,请参阅下文。
static readonly object _object = new object();
public static DataTable DTTable(string mysqlQuery,string queryName) { 锁定(_object) { DataTable DTTableTable = new DataTable(); 尝试 { 使用(MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery,MySQLProcessing.MySQLStatic.Connection)) { 使用(DataTable DataDTTablesDT = new DataTable()) { DataDTTables.SelectCommand.CommandTimeout = 240000; DataDTTables.Fill(DataDTTablesDT); DTTableTable = DataDTTablesDT; DataDTTables.Dispose(); } } } catch(Exception ex) { GenericLogging(“失败的MySQLquery:”+ ex.Message.ToString(),“MySQLProcessor”,“DTTable”,“”,“MysqlError”,“”,queryName,mysqlQuery); } 返回DTTableTable; } }
这是唯一调用DataReader的代码,如果有锁,怎么会有两个开放的数据读取器呢?
问题是ADO.NET数据提供者通常不允许每个连接一次使用多个开放数据读取器。 SQL Server具有多个活动结果集(MARS)的概念,但据我所知,MySQL还不支持它。
您可能需要指定除MySQLProcessing.MySQLStatic.Connection
之外的其他连接。 没有什么可以阻止您使用多个连接。 这里的问题是连接是昂贵的资源,所以你应该谨慎使用它们。
您正在同时使用相同的连接。
你有几个线程吗? 因为似乎2个线程使用相同的连接来同时进行调用。