对不起这个主流帖子。在对这个问题进行了长时间的挖掘之后,我还没有真正找到解决方案。很多原因可能引发这个问题。 所以我提出这篇文章要求一些理解。
我在操作数据库..将它们填充到数组,列表,比较,然后再将它们存储在数据库中。在所有这一过程中,我使用了许多查询,例如ExecuteScalar
和MysqlCommand
,导致在new mysqlcommand
中创建了大量module.vb
我正在使用vb.net和xampp mysql作为数据服务器.. 我有2个数据库:它们相同但大小不同..
问题:当我正在测试第二个数据库时(记录数量较小) 我的程序运行良好,没有延迟或超时期间错误
,但是当我改变的数据源与我的第一数据库(具有4900点的记录)时,timeout expired
弹出直接,导致我的VS 2005变得没有响应
根据我对谷歌的研究,我发现此错误的解释很少
vs 2005仍然有一个错误,那就是timeout expired
。解决方案是升级vs版本
由于尝试在同一服务器上打开相同的连接而引发错误。
此错误消息并不完全是它所说的。它告诉你连接已满,但实际上连接的插槽仍然可用
我使用太多mysqlcommand
变量i的module.vb
多达已经 50 mysqlcomand可变!!!
我个人意见:我无法应用第一个解决方案..如果我要将其升级到2010年或更高版本,我的程序将会出现很多错误
对于第二种解决方案:我真的不明白这是什么意思。我想这是因为我试图再次打开相同的连接(例如CMD_open1。的ExecuteReader),但相同的连接已经打开,并且尚未关闭
在我的节目我已经确保每次我使用CMD.execute读者或的ExecuteNonQuery或执行标量,我添加了CMD name.connection.dispose()
,正确关闭再打开一个新的连接
所以现在我的问题是
mysqlcommand
,即使我每次使用都关闭连接。那是对的吗?对此有什么正确的解释?这是我的module.vb
的ss包含很多mysqlcommand
个变量
答案 0 :(得分:0)
看起来你需要一些严肃的重构。
与数据库相关的对象 昂贵 。您实例化的越多,您在性能处罚方面的支付就越多。他们也 稀缺 。你最终会用完(早点而不是晚点)。你需要非常明智地使用它们,并确保在完成后适当地清理它们。
许多程序员将所有与数据库相关的对象放入(基本上)一个处理所有清理等的函数中:
Private Function RunQuery( ByVal procName As String ) As DataTable
Using l_connection = new MySqlConnection("connection info")
Using l_command = New MySqlCommand( procName )
l_command.CommandType = StoredProcedure
' ... etc ...
Return l_results
End Using
End Using
End Function
Using
块确保在每次调用后正确清理数据库对象(调用相应的Close
和Dispose
函数)。
但听起来你已经对可能存在的问题提出了一些很好的建议。你提供的清单几乎就是我推荐的清单。由您来测试和调试以确定哪一个导致问题。
此外,mainstream support for Visual Studio 2005 ended in 2011。如果你不能为升级你的工具来修复已知的错误而烦恼(因为它对你来说太多了),那么除了“碰到你不要抱怨”这个问题还有很多话要说。错误“。