我有一个将数据插入数据库(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
传感器的响应不同,但仍然可以相同。这就是我在插入数据库时遇到问题的原因。
答案 0 :(得分:2)
我每次插入后都会打开并关闭数据库连接[...]它正在以这种方式运行但不那么安全。
这当然是最好的方式。使用using () {}
块中的连接,这将是安全的。
使用此解决方案,我的数据库有时会感到困惑。
你必须更好地描述它。
有一个想法是有一个额外的方法收集每次打勾后上传的数据
是的,您可以(应该)使用额外的线程将内容推送到Db。查找“生产者/消费者模式”
答案 1 :(得分:0)
仅使用单一连接,
使用您传递数据进行插入的一个函数,该函数将执行插入工作。
像
FUNC(strQry){ 命令cmd = new ...(strQry,conn); cmd.execute ...(); }
重用conn obj,但每次都创建新的cmd obj ..
评论是否卡住......