【问题标题】:C# Multiple threads (Parallel) accessing static MySQL Connection {get;set;} with locksC# 多线程(并行)使用锁访问静态 MySQL 连接 {get;set;}
【发布时间】:2012-04-03 23:22:11
【问题描述】:

我有一个从 DataTable 运行 Parral.Foreach 的应用程序。在该 Parallel(3-10 并行)内,该类执行更新或选择语句。我有一个 MySQL 连接,{get;set;} 见下文。

public static MySqlConnection Connection { get; set; }
    public static MySqlConnection OpenCon(string ServerAddress,int PortAddress, string UserID, string Password,int ConnectionTimeOut)
    {
        MySqlConnection masterOpenCON = new MySqlConnection("server=" + ServerAddress + ";Port=" + PortAddress + ";UID=" + UserID + ";PASSWORD=" + Password + ";connectiontimeout="+ConnectionTimeOut+";");
        masterOpenCON.Open();
        return masterOpenCON;
    }

这是我的平行线

Parallel.ForEach(urlTable.AsEnumerable(), drow =>
        {
            WebSiteCrawlerClass WCC = new WebSiteCrawlerClass();
            if (drow.ItemArray[0].ToString().Contains("$"))
            {

                WCC.linkGrabberwDates(drow.ItemArray[0].ToString(), "www.as.com");
            }
        });

现在在 WCC.LinkGrabberwDates 中像这样执行一个 mysql 命令

string mysql_Update = "update trad_live" + StaticStringClass.tableID + " set price = '"+priceString+"',LastProcessDate = Now() where ListingID = 'AT"+ IDValue+"'";
                MySQLProcessing.MySQLProcessor.MySQLInsertUpdate(mysql_UpdateExistingr,"mysql_UpdateExisting");

这里是 MySQLInsertUpdate

 public static void MySQLInsertUpdate(string MySQLCommand,string mysqlcommand_name)
    {
        try
        {
            MySqlCommand MySQLCommandFunc = new MySqlCommand(MySQLCommand, Connection);
            MySQLCommandFunc.CommandTimeout = 240000;
            MySQLCommandFunc.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
        }
    }

我关心的两件事是性能和数据完整性。我知道添加锁会降低性能,但会提高数据完整性。

我不希望创建 10 多个与服务器的连接,所以我的问题是这样的。

在上面的代码中,每个 sql 语句或公共 void MySQLInsertUpdate 中,锁实际上应该放在哪里。我的下一个问题是,除了每个线程的锁定/附加连接之外,还有更好的方法吗?

我确实意识到这目前是静态的,但我正在更改静态状态

【问题讨论】:

    标签: c# locking


    【解决方案1】:

    IMO 并行访问单个静态连接并尝试自己管理锁似乎是一个糟糕的设计。

    为什么不使用内置的连接池?这将确保只有 X 个打开的连接(X 是您想要的任意数量)。因此,如果您只需要 1 个 DB 连接,则可以将连接池的最小和最大大小设置为 1。

    这还可以让您“扩大”配置中并发数据库查询的数量。

    我也没有在您的代码中看到任何事务处理,因此您的实现可能会根据您想要处理的方式而有所不同。如果 1 个并行发生故障,所有更新/插入会一起回滚吗?还是每个插入/更新都是自己的提交?

    【讨论】:

    • 每个都是它自己的提交,我理解你关于单个静态连接的观点,但如果觉得没有必要拥有超过 1 个连接。但是,我喜欢在下一个命令开始之前等待命令结束来锁定的想法。
    • 为什么我这里不用什么静态连接,我不希望它改变,而且我也只有一个使用一个连接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2011-01-24
    相关资源
    最近更新 更多