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