C#多线程(并行)使用锁访问静态MySQL连接{get;set;}

C#多线程(并行)使用锁访问静态MySQL连接{get;set;},c#,locking,C#,Locking,我有一个从数据表运行Parral.Foreach的应用程序。在该并行(3-10个并行)中,类执行update或select语句。我有一个MySQL连接,{get;set;}见下文 public static MySqlConnection Connection { get; set; } public static MySqlConnection OpenCon(string ServerAddress,int PortAddress, string UserID, string Pas

我有一个从数据表运行Parral.Foreach的应用程序。在该并行(3-10个并行)中,类执行update或select语句。我有一个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中,锁实际放置在哪里。我的下一个问题是,除了每个线程锁定/附加连接之外,还有更好的方法吗


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

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

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

这还可以让您“放大”配置中并发DB查询的数量


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

每个都是它自己的提交,我理解你关于单个静态连接的观点,但是如果你觉得没有必要有多个连接。但是,我喜欢锁定的想法,只是等待命令结束,然后再开始下一个连接。为什么我不知道静态连接是什么,我不想改变它,我也只想使用一个连接