.Net应用程序处理SQL语句时无法使用系统

时间:2010-01-05 15:00:58

标签: mysql vb.net

我在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()

为什么会这样?

是否有更有效的方法来执行这些插入?

谢谢 -

乔纳森

3 个答案:

答案 0 :(得分:5)

这是因为你在UI线程上调用这个长时间运行的操作,这意味着它正在阻塞,并且在运行时你无法使用UI。

对于短期运行操作,您可以创建一个处理工作并委托异步调用的委托,并使用Control.BeginInvoke确保更新UI线程上的UI。

任何超过几秒的时间,正如亚当指出的那样,你最好创建自己的线程并在那里处理你的工作。

话虽如此,5000个插入应该 NOT 运行30分钟。但这本身就是另一个问题。

答案 1 :(得分:0)

听起来好像通过使用另一个应用程序,你的系统正在从本地mysql实例和你的应用程序中窃取处理时间,最终导致mysql超时。

有几种方法可以“解决”这个问题:

  1. 升级您的本地计算机,可能是具有足够RAM的双核或四核。
  2. 将处理移至另一台机器执行。
  3. 评估您的查询,以确定为什么其中5000个需要30分钟,这是一个非常长的时间。

答案 2 :(得分:0)

其他答案建议手动创建新主题。我想你可以使用SqlCommand.BeginExecuteNonQuery为你做这一切吗?它seems the MySQL driver supports BeginExecuteNonQuery。