Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程数据库插入_C#_Mysql_Multithreading - Fatal编程技术网

C# 多线程数据库插入

C# 多线程数据库插入,c#,mysql,multithreading,C#,Mysql,Multithreading,我有一个应用程序(C#),它正在向数据库(MySQL)插入数据。该程序在带有计时器的多线程上运行 我的问题是,将数据插入数据库的最佳方式是什么 应用程序示例: 计时器每秒钟都在滴答作响,我有数据想在每秒钟插入数据库,但我有一些数据想在后面插入,比如每半分钟。数据总是被放到不同的表中,但却是同一个数据库中 每次插入后,我都会打开和关闭数据库连接。在这种情况下,当我想打开一个已经打开的连接或使用一个已经被另一个线程关闭的连接时,我遇到了问题。为了解决这个问题,我在启动计时器时打开连接,在停止计时器时

我有一个应用程序(C#),它正在向数据库(MySQL)插入数据。该程序在带有计时器的多线程上运行

我的问题是,将数据插入数据库的最佳方式是什么

应用程序示例:

计时器每秒钟都在滴答作响,我有数据想在每秒钟插入数据库,但我有一些数据想在后面插入,比如每半分钟。数据总是被放到不同的表中,但却是同一个数据库中

每次插入后,我都会打开和关闭数据库连接。在这种情况下,当我想打开一个已经打开的连接或使用一个已经被另一个线程关闭的连接时,我遇到了问题。为了解决这个问题,我在启动计时器时打开连接,在停止计时器时关闭连接。它是这样工作的,但不太安全

使用此解决方案,我的数据库有时仍然会感到困惑。我只是用本地数据库尝试了一下,我不知道它是否会与远程数据库不同(老实说,它应该也适用于本地和远程数据库)

有一个想法是有一个额外的方法,即收集数据结束后,它上传后,每勾(或X勾)到数据库。我不确定这是否是一个更好的解决方案,但我现在并没有更好的想法。该解决方案的问题是,它可能会变得混乱(我想我需要一个全局列表,所有线程都可以访问该列表并在其中插入数据,当我上载/清除列表时,其中一个线程可能希望访问该列表,这可能会导致问题)

如果不够清楚,请告诉我。如有任何建议,将不胜感激

谢谢

我的数据库插入代码如下:


con.Open()
MySqlCommand cmd=新的MySqlCommand(command,con)
cmd.ExecuteNonQuery()
con.Close()

我想我也应该在这里插入一些伪代码,使我的问题更容易理解:


计时器
foreach(传感器)
{
如果传感器读数已完成
{
检查传感器的类型
运行正确的线程
}

示例线程:


线程
从传感器读取数据
将数据插入数据库

传感器的响应不同,但仍然可以相同。这就是为什么我在插入数据库时遇到问题的原因

我总是在每次插入后打开和关闭数据库连接[…]它是这样工作的,但不太安全

这当然是最好的方法。在
using(){}
块中使用连接,它将是安全的

使用此解决方案,我的数据库有时仍然会感到困惑

你必须更好地描述这一点

有一个想法是有一个额外的方法,即收集数据结束后,它上传后,每个滴答声


是的,您可以(应该)使用一个额外的线程将内容推送到Db。查找“生产者/消费者模式”

仅使用单一连接,
使用一个传递数据以进行插入的函数,该函数将执行插入工作

func(strQry){ 命令cmd=new…(strQry,conn); 命令执行…(); }

重复使用conn obj,但每次都要创建新的cmd obj


注释如果卡住…

如果您使用的是.NET 4.0,您可以使用任务并行库实现异步操作,如果您已经在使用.NET 4.5,您可以在其中使用异步和等待功能请解决此问题如果我错了,请纠正我,但异步线程是关于线程之间相互等待的,不是吗?如果它们是因此,这不是一个真正的选项。原因是因为我同时调用这些线程,因为我正在从传感器读取数据。读取所需的时间可能真的不同,但它们可能同时完成。线程的工作原理是从传感器读取数据(方式取决于传感器的类型)然后在数据库中插入。我不能真正等待线程,因为一个线程可能需要一分钟,而另一个线程可能需要2秒。它们不同,但仍然可以相同。这就是我遇到问题的原因-尝试更好地解释。是否存在PK冲突?@Henk Holterman我在创建自己的主键时没有PK冲突。我在执行以下操作时出错:I在读取开始时打开了与数据库的连接。然后我开始在数据库中插入数据,(我不是100%确定,但我认为)当应用程序的线程试图在同一时间(同一时间/不同的表)将数据插入数据库时,我遇到了错误.1,我的意思是,当我在每个线程中打开/关闭时,它不起作用。我有一种插入方法,类似于:
con.Open();
MySqlCommand cmd=new MySqlCommand(command,con);
cmd.ExecuteNonQuery();
con.Close();
我可能会在几乎相同的时间调用此方法。在这种情况下,我可能会尝试打开一个已打开的连接,或者在执行查询之前关闭连接。2,线程可能会同时尝试向数据库插入数据。如果我保持数据库连接和线程的打开状态,则它将崩溃。3,所以我应该在主线程上做一些事情,上传其他线程收集的数据?编辑并改进问题,注释中的代码不可读。