多线程数据库插入

时间:2013-01-24 09:28:09

标签: c# mysql multithreading

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

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

申请示例:

计时器每秒打勾,我有数据,我想在每秒插入数据库,但我有一些我想插入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

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

2 个答案:

答案 0 :(得分:2)

  

我每次插入后都会打开并关闭数据库连接[...]它正在以这种方式运行但不那么安全。

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

  

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

你必须更好地描述它。

  

有一个想法是有一个额外的方法收集每次打勾后上传的数据

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

答案 1 :(得分:0)

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

  

FUNC(strQry){   命令cmd = new ...(strQry,conn);   cmd.execute ...();   }

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

评论是否卡住......