0

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

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

应用示例:

计时器每秒滴答一次,我有数据要每秒插入到数据库中,但我有一些数据要插入到后面,比如每半分钟。数据总是去不同的表,但相同的数据库。

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

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

有一个想法是有一个额外的方法来收集它在每个滴答之后(或 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

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

4

2 回答 2

2

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

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

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

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

有一个想法是有一个额外的方法来收集它在每次滴答后上传的数据

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

于 2013-01-24T09:34:53.740 回答
0

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

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

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

如果卡住了请评论...

于 2013-01-24T09:38:53.997 回答