首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用锁访问静态MySQL连接{get;set;}的C#多线程(并行)

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

Stack Overflow用户
提问于 2012-04-03 23:16:00
回答 1查看 1.8K关注 0票数 0

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

代码语言:javascript
运行
复制
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;
    }

这是我的类比

代码语言:javascript
运行
复制
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命令,如下所示

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
 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中。我的下一个问题是,除了每个线程的锁/附加连接之外,还有更好的方法吗?

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

EN

回答 1

Stack Overflow用户

发布于 2012-04-03 23:21:35

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

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

这还可以让您在配置中“扩展”并发DB查询的数量。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9996296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档