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

Mysql 当.Net应用程序处理SQL语句时,无法使用系统,mysql,vb.net,Mysql,Vb.net,我在VB.Net中使用MySQL连接器来执行一批SQL插入。这通常是5k条语句的顺序,处理大约需要30分钟。不幸的是,当这个进程正在运行,并且我在系统上使用不同的应用程序时,返回到.net应用程序时,它会挂起并显示“无响应”。事实上,只要我单击应用程序中的任何其他位置(例如,移动到另一个选项卡),所有内容都会锁定 Dim transaction As MySqlTransaction = sqlConnection.BeginTransaction() For Each sqlCmd In (s

我在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()
为什么会这样

有没有更有效的方法来执行这些插入

谢谢-


Jonathan

听起来可能是因为使用了另一个应用程序,您的系统从本地mysql实例和您的应用程序中窃取了处理时间,最终导致mysql超时

有两种方法可以“修复”此问题:

  • 升级您的本地计算机,可能是具有足够ram的双核或四核
  • 将处理移到另一台机器上执行
  • 评估您的查询,以确定为什么5000个查询需要30分钟,这是一个非常长的时间
    听起来可能是因为使用了另一个应用程序,您的系统从本地mysql实例和您的应用程序中窃取了处理时间,最终导致mysql超时

    有两种方法可以“修复”此问题:

  • 升级您的本地计算机,可能是具有足够ram的双核或四核
  • 将处理移到另一台机器上执行
  • 评估您的查询,以确定为什么5000个查询需要30分钟,这是一个非常长的时间
    这是因为您正在UI线程上调用此长时间运行的操作,这意味着它正在阻塞,并且在运行时您无法使用UI

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

    只要超过几秒钟,正如Adam指出的,最好创建自己的线程并在那里处理工作


    话虽如此,运行5000次插入实际上不需要30分钟。但这本身就是另一个问题。

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

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

    只要超过几秒钟,正如Adam指出的,最好创建自己的线程并在那里处理工作


    话虽如此,运行5000次插入实际上不需要30分钟。但这本身就是另一个问题。

    其他答案建议手动创建新线程。我想你可以用它来帮你?其他答案建议手动创建一个新线程。我想你可以用它来帮你?它开始执行查询。

    任务管理器是否显示此时您的内存或CPU容量已用完?我认为您应该删除“当我尝试在系统上使用其他应用程序时”,因为我猜是应用程序中的UI阻塞,因为它正在同步运行。您应该可以完全切换到不同的应用程序(只是当您返回时,应用程序会显示“无响应”)。你问题中的这一点误导了下面的几张海报。任务管理器是否显示你当时的内存或CPU容量已用完?我认为你应该删除“当我尝试在系统上使用不同的应用程序时”,因为我猜是你的应用程序中的UI阻塞了,因为它正在同步运行。您应该可以完全切换到不同的应用程序(只是当您返回时,应用程序会显示“无响应”)。你问题中的这一点误导了下面的一些海报。不,不,不!不要使用异步委托调用(使用
    delegate.BeginInvoke
    )或任何其他使用
    线程池运行30分钟的程序。
    ThreadPool
    设计用于承载有限数量的短期进程,而不是具有半小时生命周期的进程。应为此使用新线程。BeginInvoke也使用线程池。对于长时间运行的任务,可以争论、激发和忘记就足够了。不,
    Control.BeginInvoke
    将委托放入在应用程序线程上处理的队列中;它不使用
    线程池
    (否则,您仍将使用UI线程以外的线程)。“用火遗忘”是无关紧要的;事实上,它正在使用
    线程池
    ,这是一个问题。Control.BeginInvoke指的是UI的更新,它应该在应用程序线程上运行。它没有引用长时间运行的操作的异步调用。@威尔:我不确定你的意思。您说过“您需要创建一个委托来处理工作并异步调用它”。这听起来像是建议对代理本身调用
    BeginInvoke
    ,它将使用
    ThreadPool
    。问题是使用
    ThreadPool
    线程运行30分钟。为此,应创建一个专用线程。-1。不,不,不!不要使用异步委托调用(使用
    delegate.BeginInvoke
    )或任何其他使用
    线程池运行30分钟的程序。
    ThreadPool
    设计用于承载有限数量的短期进程,而不是具有半小时生命周期的进程。应为此使用新线程。BeginInvoke也使用线程池。对于长时间运行的任务,人们可能会争论、开火并忘记足够的东西。不,