我在VB .Net中使用MySQL连接器来执行一批SQL插件。这通常是5k语句的顺序,大约需要30分钟来处理。不幸的是,当这个进程正在运行并且我在系统上使用不同的应用程序时,在返回到.net应用程序时,它会挂起并显示“没有响应”。实际上,只要我单击应用程序中的任何其他位置(例如,移动到其他选项卡),一切都会锁定。
Dim transaction As MySqlTransaction = sqlConnection.BeginTransaction()
For Each sqlCmd In (sqlCmdsCollection)
sqlCommand = New MySqlCommand(sqlCmd, sqlConnection)
Try
sqlCommand.ExecuteNonQuery()
logTxtBox.AppendText(". ")
Catch ex As Exception
transaction.Rollback()
logTxtBox.AppendText(vbNewLine & "EXCEPTION: " & ex.Message & vbNewLine)
logTxtBox.AppendText(sqlCmd & vbNewLine)
logTxtBox.AppendText("INFO: No changes were made to the database!"& vbNewLine)
End Try
Next
transaction.Commit()
为什么会这样?
是否有更有效的方法来执行这些插入?
谢谢 -
乔纳森
答案 0 :(得分:5)
这是因为你在UI线程上调用这个长时间运行的操作,这意味着它正在阻塞,并且在运行时你无法使用UI。
对于短期运行操作,您可以创建一个处理工作并委托异步调用的委托,并使用Control.BeginInvoke确保更新UI线程上的UI。
任何超过几秒的时间,正如亚当指出的那样,你最好创建自己的线程并在那里处理你的工作。
话虽如此,5000个插入应该 NOT 运行30分钟。但这本身就是另一个问题。
答案 1 :(得分:0)
听起来好像通过使用另一个应用程序,你的系统正在从本地mysql实例和你的应用程序中窃取处理时间,最终导致mysql超时。
有几种方法可以“解决”这个问题:
答案 2 :(得分:0)
其他答案建议手动创建新主题。我想你可以使用SqlCommand.BeginExecuteNonQuery为你做这一切吗?它seems the MySQL driver supports BeginExecuteNonQuery。