asp.net奇怪的异常每隔三分钟左右

时间:2012-03-14 21:04:15

标签: asp.net mysql vb.net visual-studio-2010

我正在尝试创建一个非常简单的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;每一次。

1 个答案:

答案 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以确保其有效。