连接字符串mysql中的vb net set timeout period

时间:2014-01-20 12:25:09

标签: mysql vb.net

我有一个程序可以处理一个庞大的数据库,它有大约4,8k个记录..我正在将数据填充到两个2d数组中,比较它,然后以新表的形式将结果插入数据库..

我还有两套数据库,较小的一个只有40条记录,最大的一条有4,8k记录..当我测试较小的数据库时,程序运行正确

但是当我使用最大的那个时,发生了错误。

我已经尝试确定连接泄漏,但结果证明没有。

我已经使用disposeclose

正确关闭了所有连接

但第一条错误消息是臭名昭着的**超时期限。 。 。已达到最大池大小**

稍后我解除了错误消息后,弹出了另一条错误消息the connection must be valid and open,虽然我已经重新检查了该问题

我正在使用vs 2005,我搜索谷歌这个错误是vs 2005中出现的错误,但我无法正常找到微软提供的解决方案

所以我想有办法解决这个问题,比如修改了连接功能。我应该在下面的代码中更改什么?

Imports MySql.Data.MySqlClient
Public Class koneksi
  Private Conn As MySqlConnection = Nothing
  Public Function konek() As MySqlConnection
     Dim ConnString As String
     ConnString = ";server=localhost;user=root;password=;database=skripsi2;"
     Try
         Conn = New MySqlConnection(ConnString)
         Conn.Open()

     Catch ex As Exception
        MessageBox.Show("Koneksi Error " + ex.Message)
     End Try
     Return Conn
  End Function

End Class

* 注意:我已经完成的工作是将连接超时设置为0/300。将池设置为true并将最大池大小设置为200

但所有这些尝试都是徒劳的......没有用......

所以你能告诉我如何解决这个问题吗?我已经用了一个星期的时间来处理我的脑子,仍然没有解决这个问题

我正在使用vb.net 2005和mysql作为数据库

'更新代码示例调用连接功能

            Dim resnode1 As String = "..."
            CMD_resnode = New MySqlCommand(resnode1, conn.konek)
            resnode = CMD_resnode.ExecuteReader()

            Dim getmaxrow2 As String = "..."
            CMD_maxrow2 = New MySqlCommand(getmaxrow2, conn.konek)
            maxrow2 = Convert.ToInt32(CMD_maxrow2.ExecuteScalar())
            CMD_maxrow2.Connection.Dispose()

            maxrow22 = maxrow2 - 1

            IF....THEN
            ....
            resnode.read()
            ....
            END IF

            CMD_resnode.connection.dispose()

3 个答案:

答案 0 :(得分:0)

根据这个stack-overflow thread 。使用 close()方法的好习惯。

        Dim resnode1 As String = "..."
        CMD_resnode = New MySqlCommand(resnode1, conn.konek)
        resnode = CMD_resnode.ExecuteReader()

        Dim getmaxrow2 As String = "..."
        CMD_maxrow2 = New MySqlCommand(getmaxrow2, conn.konek)
        maxrow2 = Convert.ToInt32(CMD_maxrow2.ExecuteScalar())
        CMD_maxrow2.Connection.Close()

        maxrow22 = maxrow2 - 1

        IF....THEN
        ....
        resnode.read()
        ....
        END IF

        CMD_resnode.connection.Close()

如果仍然遇到问题,请尝试在命令行上运行SQL查询并检查查询的执行时间。

答案 1 :(得分:0)

很难诊断出这类问题,但是,我可以在您的示例代码中看到连接创建和泄漏的常见模式,因为它们没有正确关闭并返回到连接池。每次调用conn.konek时,您的代码都会强制创建新连接,而您似乎忘记关闭并处置在调用中创建的实例。 直到游泳池耗尽并且您收到致命错误。

一种简单的方法是检查您调用conn.konek方法的代码并将其更改为此类

' Just one call to konek and keep the instance for using in the enclosed block '
Using con = conn.konek
    Dim resnode1 As String = "..."
    CMD_resnode = New MySqlCommand(resnode1, con)
    resnode = CMD_resnode.ExecuteReader()
    ....
    Dim getmaxrow2 As String = "..."
    CMD_maxrow2 = New MySqlCommand(getmaxrow2, con)
    maxrow2 = Convert.ToInt32(CMD_maxrow2.ExecuteScalar())
    maxrow22 = maxrow2 - 1

' Here the connection is closed and disposed.
End Using

通过这种方式,您只创建一个连接并将其封装在Using语句中,在End Using点,连接自动关闭并处理,如果using块内部的代码块引发异常。

如果您需要在执行其他命令时保持DataReader打开,那么您可以尝试

' Just one call to konek and keep the instance for using in the enclosed block '
Using con = conn.konek
    Dim resnode1 As String = "..."
    CMD_resnode = New MySqlCommand(resnode1, con)
    resnode = CMD_resnode.ExecuteReader()
    ....
    Using con1 = conn.konek
        Dim getmaxrow2 As String = "..."
        CMD_maxrow2 = New MySqlCommand(getmaxrow2, con1)
        maxrow2 = Convert.ToInt32(CMD_maxrow2.ExecuteScalar())
        maxrow22 = maxrow2 - 1
        ' Here the connection for the command is closed and disposed.

    End Using

' Here the connection for the datareader is closed and disposed.
End Using

答案 2 :(得分:0)

根据我的经验,超时错误几乎与连接无关。相反,它与数据适配器在执行之前创建的命令有关。如果要通过在字符串中传递sql查询来创建数据适配器,则适配器将创建自己的命令。您必须从适配器的SelectCommand属性中获取该命令对象,并设置其CommandTimeout。

尝试:

mydataAdaptor.SelectCommand.CommandTimeout = xxxx

xxxx是较长的时间间隔,例如60000(1小时)