我正在开发完全重新开发的网站和销售系统,并且以惊人的速度遇到了这个 Max_connections 问题。
我发布了这个问题: Closing/Pooling MySQL ODBC connections 最近,但后来尝试了其他一些事情,仍然是空白,但有更多细节可以提供......
我建立了一个非常复杂的销售流程,在创建发票时,我似乎每次都在运行 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
这个函数给了我一个 OdbcConnection 连接字符串对象,然后我可以使用它:
Function openDatabase(sql As String) As OdbcCommand
openDatabase = New OdbcCommand(sql, connectionString(sql, ""))
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 函数后调用,也在我为插入/更新和删除创建的函数中调用,如下所示:
Function insertData(InsertSql As String)
Dim dataInsert = openDatabase(InsertSql, "new")
dataInsert.ExecuteNonQuery()
closeConn()
End Function
我不确定是否使所有这些功能变得更轻松或更难,但我试图减少每个需要数据访问的文件中的代码,但我不相信它有。
但是,它清楚地表明了我在何时何地打开和关闭数据库(或至少尝试)
不过,这些流程并未关闭。如果我快速连续运行我的销售流程 3 或 4 次,而这 7 个流程仍处于活动状态并添加到其中,我会遇到 max_connections 问题。
不完全了解数据库连接的工作原理,恐怕我对此不知所措,因此不得不再次问你......!
谁能告诉我:
a) 我的连接字符串是否正确,MySQL 是否有更好的连接可用?
b)使用这种方法,创建一个 ODBCConnection 对象,是否可以在这样的函数中关闭它?
c)为什么(CommandBehavior.CloseConnection)没有关闭连接(在我尝试手动关闭连接之前出现了这个问题)