多线程数据库插入

本文关键字:插入 数据库 多线程 | 更新日期: 2023-09-27 17:56:01

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

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

应用示例:

计时器每秒滴答作响,我有我想在每一秒插入到数据库中的数据,但我有一些我想插入 rearer,比如每半分钟一次。数据总是转到不同的表,但相同的数据库。

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

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

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

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

谢谢

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

con.Open();
MySqlCommand cmd = new MySqlCommand(command, con);
cmd.ExecuteNonQuery();
con.Close();

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

Timer
foreach(sensor)
{
if sensor reading finished
{
check the type of the sensor
run the right thread
}

示例线程:

Thread
Read out data from sensor
insert data to DB

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

多线程数据库插入

我总是在每次插入后打开和关闭数据库连接 [...]它以这种方式工作,但不是那么安全。

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

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

你将不得不更好地描述这一点。

有一个想法是有一个额外的方法,即收集数据,并在每次刻度后上传

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

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

喜欢

func(strQry){ 命令 cmd = 新 ...(strQry, conn); cmd.execute...(); }

重用 conn obj ,但每次都创建新的 cmd obj。

如果卡住,请评论...