Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL数据连接未关闭/池_Mysql_Vb.net_Odbc_Database Connection_Mysql Connect - Fatal编程技术网

MySQL数据连接未关闭/池

MySQL数据连接未关闭/池,mysql,vb.net,odbc,database-connection,mysql-connect,Mysql,Vb.net,Odbc,Database Connection,Mysql Connect,我正在进行完全重新开发的网站和销售系统的工作,并且很快就遇到了Max_连接问题 我发布了这个问题: 最近,但已经尝试了一些其他的东西,仍然是空白,但有更多的细节提供 我建立了一个相当复杂的销售流程,在创建发票时,我似乎每次都要运行7个“流程”。我已经计算了在创建发票的过程中使用数据连接的次数,根据一些条件值,使用次数为7-9次,因此实际上数据连接根本没有关闭 为了加快编码速度,我制作了两个处理数据库连接的函数,因此我将在下面发布这些函数 首先,我的连接字符串是: "DRIVER={MySQL O

我正在进行完全重新开发的网站和销售系统的工作,并且很快就遇到了Max_连接问题

我发布了这个问题: 最近,但已经尝试了一些其他的东西,仍然是空白,但有更多的细节提供

我建立了一个相当复杂的销售流程,在创建发票时,我似乎每次都要运行7个“流程”。我已经计算了在创建发票的过程中使用数据连接的次数,根据一些条件值,使用次数为7-9次,因此实际上数据连接根本没有关闭

为了加快编码速度,我制作了两个处理数据库连接的函数,因此我将在下面发布这些函数

首先,我的连接字符串是:

"DRIVER={MySQL ODBC 3.51 Driver}; SERVER=mysql.dc-servers.com; DATABASE=jamieha_admin; UID=USERID; PASSWORD=pWD; OPTION=3;pooled=true;Max Pool Size=100" 
我用来打开和关闭数据库以及处理数据库的函数如下:

Function connectionString(sql As String, closeConnection As String) As OdbcConnection
    Dim DBConnection As String = ConfigurationManager.ConnectionStrings("dbConnNew").ConnectionString
     'this is getting the connection string from web.config file.
    Dim oConnection As OdbcConnection = New OdbcConnection(DBConnection) 'call data connection
    connectionString = New OdbcConnection(DBConnection)
   If closeConnection <> "close" Then _
       connectionString.Open() ' open data connection
End Function
此函数在执行以下操作时创建可用的数据对象:

Dim stockLevel As OdbcCommand = openDatabase("SQL STATEMENT HERE")
Dim objDataReader As OdbcDataReader =      stockLevel.ExecuteReader(CommandBehavior.CloseConnection)
    '=== DO STUFF WITH objDataReader ==='
objDataReader.Close()
在阅读了试图确保数据连接正确关闭等内容后,我读到添加(CommandBehavior.CloseConnection)应确保不再使用时连接关闭,但这似乎没有发生,因此我创建了一个单独的“CloseConnection”函数,该函数如下所示:

Function closeConn()
    If connectionString("", "", "close") IsNot Nothing AndAlso connectionString("", "close").State = ConnectionState.Open Then
        connectionString("", "close").Close()
        connectionString("", "close").Dispose()
    End If
End Function
每次使用openDatabase函数后都会调用它,在我为insert/update和delete创建的函数中也会调用它,如下所示:

Function insertData(InsertSql As String)
    Dim dataInsert = openDatabase(InsertSql, "new")
    dataInsert.ExecuteNonQuery()
    closeConn()
End Function
Dim connection As OdbcConnection = GetConnection()
Dim stockLevel As OdbcCommand = CreateCommand(InsertSql, connection)

Using connection
    connection.Open()
    Dim result As Integer = stockLevel.ExecuteNonQuery()
End Using
我不确定使用所有这些函数是让我的生活变得更轻松还是更困难,但我试图减少每个需要数据访问的文件中的代码,但我不相信它确实如此

但是,它清楚地表明了我在何时何地打开和关闭数据库(或者至少尝试打开)

不过,这些进程并没有关闭。如果我连续3到4次快速运行我的销售流程,而这7个流程仍然处于活动状态并被添加到中,我就会遇到最大连接问题

不完全了解数据库连接是如何工作的,我恐怕对此感到困惑,因此不得不问您。。。再来一次

谁能告诉我:

a) 我的连接字符串正确吗?MySQL有更好的连接吗

b) 使用此方法创建ODBCConnection对象,是否可以在这样的函数中关闭它


c) 为什么(CommandBehavior.CloseConnection)没有关闭连接(这个问题是在我尝试手动关闭连接之前出现的)

不幸的是,您遇到的问题来自于您的设计和对连接引用的错误处理

但别担心。修复并不困难。:-)

在VB.Net中,您始终需要以以下模式访问数据:

  • 创建一个连接
  • 创建使用连接的命令(包括添加任何参数值)
  • 打开连接
  • 执行命令
  • 关闭连接
  • 这种方法也有一些变化,例如在关闭连接之前在行上循环,但通常情况下是这样工作的。为了确保连接已关闭,VB.Net提供了Try/Finally块使用语句。您需要使用其中一个来确保连接已关闭

    我将以正确的方式重写您的方法,向您展示我的意思

    首先,将连接创建代码包装到函数中

    Function GetConnection() As OdbcConnection
    
        Dim DBConnection As String = ConfigurationManager.ConnectionStrings("dbConnNew").ConnectionString
    
        GetConnection = New OdbcConnection(DBConnection)
    
    End Function
    
    其次,编写一个函数来创建您的命令。(openDatabase是错误的名称,因此我将其更改为CreateCommand)

    现在,当您希望在数据库中执行查询或语句时,可以遵循以下模式:

    Dim connection As OdbcConnection = GetConnection()
    Dim stockLevel As OdbcCommand = CreateCommand("SQL STATEMENT HERE", connection)
    Try
        connection.Open()
        Dim objDataReader As OdbcDataReader = stockLevel.ExecuteReader(CommandBehavior.CloseConnection)
    Finally
        connection.Dispose()
    End Try
    
    使用Try/Finally块意味着连接将始终正确关闭,即使异常导致代码在预期之前返回

    另一种速记方法是Using语句(它实际上执行与Finally块中的Dispose完全相同的操作):

    如果您想将InsertData函数包装到命令中,可以这样做:

    Function insertData(InsertSql As String)
        Dim dataInsert = openDatabase(InsertSql, "new")
        dataInsert.ExecuteNonQuery()
        closeConn()
    End Function
    
    Dim connection As OdbcConnection = GetConnection()
    Dim stockLevel As OdbcCommand = CreateCommand(InsertSql, connection)
    
    Using connection
        connection.Open()
        Dim result As Integer = stockLevel.ExecuteNonQuery()
    End Using
    
    我怀疑,当你第一次尝试这个方法时,你没有关闭你的连接,而是让连接保持打开状态。我还假设(根据您所写的),您添加了closeConn方法来解决这个问题。不幸的是,每次调用
    connectionString
    实际上都是在创建和打开一个新连接,然后调用
    Close
    Dispose
    on。初始连接从未关闭


    希望能有所帮助。

    不幸的是,您遇到的问题来自于您的设计和对连接引用的错误处理

    但别担心。修复并不困难。:-)

    在VB.Net中,您始终需要以以下模式访问数据:

  • 创建一个连接
  • 创建使用连接的命令(包括添加任何参数值)
  • 打开连接
  • 执行命令
  • 关闭连接
  • 这种方法也有一些变化,例如在关闭连接之前在行上循环,但通常情况下是这样工作的。为了确保连接已关闭,VB.Net提供了Try/Finally块使用语句。您需要使用其中一个来确保连接已关闭

    我将以正确的方式重写您的方法,向您展示我的意思

    首先,将连接创建代码包装到函数中

    Function GetConnection() As OdbcConnection
    
        Dim DBConnection As String = ConfigurationManager.ConnectionStrings("dbConnNew").ConnectionString
    
        GetConnection = New OdbcConnection(DBConnection)
    
    End Function
    
    其次,编写一个函数来创建您的命令。(openDatabase是错误的名称,因此我将其更改为CreateCommand)

    现在,当您希望在数据库中执行查询或语句时,可以遵循以下模式:

    Dim connection As OdbcConnection = GetConnection()
    Dim stockLevel As OdbcCommand = CreateCommand("SQL STATEMENT HERE", connection)
    Try
        connection.Open()
        Dim objDataReader As OdbcDataReader = stockLevel.ExecuteReader(CommandBehavior.CloseConnection)
    Finally
        connection.Dispose()
    End Try
    
    使用Try/Finally块意味着连接将始终正确关闭,即使异常导致t