6

我有一个 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 个锁定功能?如果有怎么办?如果有其他方法,请告诉我

谢谢!

好的,按照建议,我合并了问题

代码现已更新以反映锁定,请参见下文。

static readonly object _object = new object();

公共静态数据表DTTable(字符串mysqlQuery,字符串queryName)
        {
            锁定(_object)
            {
                数据表 DTTableTable = new DataTable();
                尝试
                {
                    使用 (MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, MySQLProcessing.MySQLStatic.Connection))
                    {
                        使用 (DataTable DataDTTablesDT = new DataTable())
                        {
                            DataDTTables.SelectCommand.CommandTimeout = 240000;
                            DataDTTables.Fill(DataDTTablesDT);
                            DTTableTable = 数据DTTablesDT;
                            数据DTTables.Dispose();
                        }
                    }

                }
                捕捉(例外前)
                {

                    GenericLogging("MySQLquery 失败:" + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", queryName, mysqlQuery);

                }
                返回 DTTableTable;
            }
        }

这是唯一调用DataReader的代码,如果有锁怎么会有两个打开的数据读取器?

4

2 回答 2

2

问题是 ADO.NET 数据提供程序通常不允许每个连接一次打开多个数据读取器。SQL Server 有多个活动结果集 (MARS)的概念,但据我所知 MySQL 还不支持它。

您可能需要指定一个不同的连接,而不是MySQLProcessing.MySQLStatic.Connection. 没有什么可以阻止您使用多个连接。这里的问题是连接是昂贵的资源,因此您应该谨慎使用它们。

于 2012-04-10T00:31:48.030 回答
0

您同时使用相同的连接。

你有几个线程?因为似乎 2 个线程使用同一个连接同时进行调用。

于 2012-04-10T00:35:37.987 回答