我正在尝试创建一个非常简单的aspx页面,它从mysql数据库中提取一些数据。 页面构建没有问题。 (aspx只包含默认表单,div只是打印一些数据)
Default.aspx.vb:
Imports System.Configuration
Imports System.Data
Imports MySql
Imports MySql.Data
Imports MySql.Data.MySqlClient
Partial Class _Default
Inherits System.Web.UI.Page
Private cnstr As String = ConfigurationManager.ConnectionStrings.Item("thisdb").ConnectionString
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Dim cn As New MySqlConnection(cnstr)
Dim cmd As New MySqlCommand("SELECT user_firstname,user_lastname FROM tb_users;", cn)
cmd.CommandType = CommandType.Text
Dim dt As DataTable
dt = GetDataTableMySQL(cmd)
If dt.Rows.Count > 0 Then
testdiv.InnerHtml = dt.Rows(0).Item("user_firstname")
testdiv.InnerHtml += "<br/>" & dt.Rows(0).Item("user_lastname")
End If
dt.Dispose()
cmd.Dispose()
cn.Dispose()
End Sub
Private Function GetDataTableMySQL(ByVal cmd As MySqlCommand) As DataTable
Dim da As New MySqlDataAdapter()
Dim dt As New DataTable()
Try
cmd.Connection.Open()
da.SelectCommand = cmd
da.Fill(dt)
Return dt
Catch ex As MySqlException
Throw ex
Catch ex As Exception
Throw New Exception(ex.Message)
Finally
cmd.Connection.Close()
da.Dispose()
End Try
End Function
End Class
的Web.config:
<?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.0">
<assemblies>
<add assembly="MySql.Data, Version=6.4.4.0, Culture=neutral, PublicKeyToken=C5687FC88969C44D"/>
</assemblies>
</compilation>
<customErrors mode="Off"/>
</system.web>
<connectionStrings>
<add name="thisdb" connectionString="Server=localhost;Database=mydatabase;Uid=mydbuser;Pwd=dbpasswd;CharSet=UTF8; "/>
</connectionStrings>
</configuration>
当我浏览页面网址时,它会完美运行。 如果我继续刷新页面,一切都没有问题。
现在出现了烦人的问题......
如果我让页面闲置大约3-4分钟,然后点击刷新,我总是会遇到以下异常:
字典中没有给定的密钥。
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息:System.Exception:给定的密钥不存在于 字典。
来源错误:
执行期间生成了未处理的异常 当前的网络请求。有关的来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。
堆栈追踪:
[例外:字典中没有给定的密钥。]
_Default.GetDataTableMySQL(MySqlCommand cmd)+236 _Default.Page_Load(Object sender,EventArgs e)+112 System.Web.UI.Control.OnLoad(EventArgs e)+91
System.Web.UI.Control.LoadRecursive()+74
System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint) 2207版本信息:Microsoft .NET Framework版本:4.0.30319; ASP.NET版本:4.0.30319.272
如果我再次点击刷新,页面再次运行正常......依此类推。
在网上搜索了几个小时后,唯一听起来就是这样 与我的问题有关,与mysql的Connector / Net:
有关Connector / Net文档说:
从MySQL Connector / Net 6.2开始,有一个后台作业每三个运行一次 分钟并从池中删除已空闲(未使用)超过三分钟的连接。 池清理释放客户端和服务器端的资源。这是因为 在客户端,每个连接使用一个套接字,并在服务器端每个 连接使用套接字和线程。
在此更改之前,从未从池中删除连接, 并且池始终包含打开连接的峰值数。 例如,一个最高为1000并发数据库的Web应用程序 连接将消耗1000个线程并打开1000个 服务器上的套接字,无需从连接池中释放这些资源。
注意,连接,无论多大,都不会 如果池中的连接数小于或等于该值,则关闭 由Min Pool Size连接字符串参数设置。
行。即使这是我的问题, 哪种连接方式正确 - >获取数据 - >断开连接?
有什么想法吗?这真让我疯狂!
更新 在@Andrews的建议之后,我改变了函数&#34; GetDataTableMySQL&#34;如下:
Private Function GetDataTableMySQL(ByVal cmd As MySqlCommand) As DataTable
Dim dt As New DataTable
Using da = New MySqlDataAdapter(cmd)
da.Fill(dt)
End Using
Return dt
End Function
(它没有解决问题,但我认为现在展示代码看起来很有用)
异常的堆栈跟踪,更改为以下内容:
[KeyNotFoundException:给定的密钥不存在于 字典。] System.Collections.Generic.Dictionary`2.get_Item(TKey 键)+9624829
MySql.Data.MySqlClient.CharSetMap.GetCharacterSet(DBVersion版本, String CharSetName)+23
MySql.Data.MySqlClient.CharSetMap.GetEncoding(DBVersion版本, String CharSetName)+47
MySql.Data.MySqlClient.Driver.Configure(MySqlConnection连接) +510 MySql.Data.MySqlClient.MySqlConnection.Open()+418 System.Data.Common.DbDataAdapter.FillInternal(DataSet数据集, DataTable [] datatables,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand命令,CommandBehavior行为)+123
System.Data.Common.DbDataAdapter.Fill(DataTable [] dataTables,Int32 startRecord,Int32 maxRecords,IDbCommand命令,CommandBehavior 行为)+166 System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)+115_Default.GetDataTableMySQL(MySqlCommand cmd)+86
_Default.Page_Load(Object sender,EventArgs e)+112 System.Web.UI.Control.OnLoad(EventArgs e)+91
System.Web.UI.Control.LoadRecursive()+74
System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint) 2207
更新2 阅读Connector/Net Connection String Options Reference后 我使用选项
测试了我的连接字符串 Pooling=false;
然后我测试了将池化选项更改为:
Pooling=no;
通过测试Pooling选项,页面永远不会有效! 我得到了例外&#34;字典中没有给定的密钥&#34;每一次。
答案 0 :(得分:1)
它可能无法解决问题,但对于DataAdapter.Fill,您无需自己打开和关闭连接。
另外,我怀疑在Try块中使用Return - 你可以做更像
的事情Private Function GetDataTableMySQL(ByVal cmd As MySqlCommand) As DataTable
Dim dt As DataTable = Nothing
Using da = New MySqlDataAdapter()
da.fill(dt)
End Using
Return dt
End Function
并检查返回值IsNot Nothing以确保其有效。