我有一个程序可以处理一个庞大的数据库,它有大约4,8k个记录..我正在将数据填充到两个2d数组中,比较它,然后以新表的形式将结果插入数据库..
我还有两套数据库,较小的一个只有40条记录,最大的一条有4,8k记录..当我测试较小的数据库时,程序运行正确
但是当我使用最大的那个时,发生了错误。
我已经尝试确定连接泄漏,但结果证明没有。
我已经使用dispose
或close
但第一条错误消息是臭名昭着的**超时期限。 。 。已达到最大池大小**
稍后我解除了错误消息后,弹出了另一条错误消息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()
答案 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小时)