C#多线程(并行)通过锁访问静态MySQL Connection {get; set;}

时间:2012-04-03 15:16:00

标签: c# locking

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

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语句或public void MySQLInsertUpdate中。我的下一个问题是,除了每个线程的锁定/附加连接之外还有更好的方法吗?

我确实知道这是静态的,但我正在改变静态状态

1 个答案:

答案 0 :(得分:2)

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

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

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

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