Jam*_*oll 1 mysql vb.net odbc database-connection mysql-connect
我正在开发完全重新开发的网站和销售系统,并且很快就遇到了这个Max_connections问题.
我发布了这个问题: 关闭/汇集MySQL ODBC连接 最近,但是已经尝试了一些其他的东西,仍然空白,但有更多细节提供...
我有一个非常复杂的销售流程,在创建发票时,我似乎每次都要运行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"
Run Code Online (Sandbox Code Playgroud)
我用来打开和关闭数据库的功能如下:
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
Run Code Online (Sandbox Code Playgroud)
这个函数给了我一个OdbcConnection连接字符串对象,然后我可以使用它:
Function openDatabase(sql As String) As OdbcCommand
openDatabase = New OdbcCommand(sql, connectionString(sql, ""))
End Function
Run Code Online (Sandbox Code Playgroud)
调用时,此函数会创建一个可用的数据对象:
Dim stockLevel As OdbcCommand = openDatabase("SQL STATEMENT HERE")
Dim objDataReader As OdbcDataReader = stockLevel.ExecuteReader(CommandBehavior.CloseConnection)
'=== DO STUFF WITH objDataReader ==='
objDataReader.Close()
Run Code Online (Sandbox Code Playgroud)
读过来试图确保数据连接正常关闭等等我读到添加(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
Run Code Online (Sandbox Code Playgroud)
这是在每次使用openDatabase函数之后调用的,也是在我为insert/update和delete创建的函数中调用的,如下所示:
Function insertData(InsertSql As String)
Dim dataInsert = openDatabase(InsertSql, "new")
dataInsert.ExecuteNonQuery()
closeConn()
End Function
Run Code Online (Sandbox Code Playgroud)
我不确定是否所有这些功能都让我的生活更轻松或更难,但我试图减少每个需要数据加入的文件中的代码,但我不相信它有.
但是,它已经明确了我何时何地打开和关闭数据库(或至少尝试)
但这些过程并未关闭.如果我快速连续3到4次销售我的销售流程,这7个流程仍然存在并添加到,我得到了max_connections问题.
没有完全理解数据库连接如何工作,我恐怕我对此感到茫然,因此不得不再问你......
谁能告诉我:
a)我的连接字符串是否正确,MySQL是否有更好的连接?
b)使用这种方法,创建一个ODBCConnection对象,是否可以在这样的函数中关闭它?
c)为什么(CommandBehavior.CloseConnection)没有关闭连接(在我尝试手动关闭连接之前出现此问题)
不幸的是,您遇到的问题来自于您的设计以及对连接的引用处理不当.
但别担心.修复并不困难.:-)
在VB.Net中,您始终需要以下列模式访问数据:
这有各种变化,例如在关闭连接之前循环遍历行,但通常这是它的工作方式.为了确保连接关闭,VB.Net提供了Try/Finally块和Using语句.您需要使用其中一个来确保连接已关闭.
我会以适当的方式重写你的方法,告诉你我的意思.
首先,将连接创建代码包装到一个函数中.
Function GetConnection() As OdbcConnection
Dim DBConnection As String = ConfigurationManager.ConnectionStrings("dbConnNew").ConnectionString
GetConnection = New OdbcConnection(DBConnection)
End Function
Run Code Online (Sandbox Code Playgroud)
其次,编写一个函数来创建命令.(openDatabase是错误的名称,因此我将其更改为CreateCommand).
Function CreateCommand(sql As String, connection As OdbcConnection) As OdbcCommand
CreateCommand = New OdbcCommand(sql, connection)
End Function
Run Code Online (Sandbox Code Playgroud)
现在,当您希望在数据库中执行查询或语句时,可以遵循以下模式:
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
Run Code Online (Sandbox Code Playgroud)
使用Try/Finally块意味着连接将始终正确关闭,即使Exception导致代码在您期望之前返回.
另一种简写是Using语句(它实际上与Finally块中的Dispose完全相同):
Dim connection As OdbcConnection = GetConnection()
Dim stockLevel As OdbcCommand = CreateCommand("SQL STATEMENT HERE", connection)
Using connection
connection.Open()
Dim objDataReader As OdbcDataReader = stockLevel.ExecuteReader(CommandBehavior.CloseConnection)
End Using
Run Code Online (Sandbox Code Playgroud)
如果你想在命令中包装你的InsertData函数,你可以这样做:
Dim connection As OdbcConnection = GetConnection()
Dim stockLevel As OdbcCommand = CreateCommand(InsertSql, connection)
Using connection
connection.Open()
Dim result As Integer = stockLevel.ExecuteNonQuery()
End Using
Run Code Online (Sandbox Code Playgroud)
我怀疑你第一次尝试这个时,你打开你的连接而没有关闭它们.我还假设(从你写的内容)你添加了closeConn方法来排序.不幸的是,每次打电话给connectionString你时,实际上都是创建并打开一个新的连接,然后你可以打电话Close或Dispose打开.初始连接永远不会关闭.
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
5704 次 |
| 最近记录: |