2012-01-09 67 views
1

我正在完全重新開發的網站和銷售系統上工作,並且出人意料地迅速反對此Max_connections問題。MySQL DataConnections未關閉/合併

我張貼了這個問題: 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 

This func重刑創建一個可用的數據對象調用的時候做這樣的事情:

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 

我不知道是否使所有這些功能是使我的生活更容易還是困難,但我試圖減少每個在需要數據acceess文件中的代碼,但我不相信它。

然而,已經明確在那裏,當我打開和關閉數據庫(或至少嘗試)

的過程沒有被關閉,雖然。如果我快速連續運行我的銷售流程3到4次,並且這7個流程仍處於運行狀態並添加到該流程中,我就會遇到max_connections問題。

不完全理解數據庫連接是如何工作的,恐怕我對此感到不知所措,因此不得不再次問你......

誰能告訴我:

一)是我的連接字符串是正確的,是有關於MySQL提供更好的連接?

b)使用這種方法創建一個ODBCConnection對象,是否可以在像這樣的函數中關閉它?

C)爲什麼(CommandBehavior.CloseConnection)未關閉連接(這個問題出現之前,我試圖關閉手動連接的連接)

+0

添加了VB.NET標籤 – Bueller 2012-01-09 17:31:32

回答

6

不幸的是你有來自你的設計的問題,並引用的處理不當。

但是別擔心。這並不難解決。 :-)

在VB.Net你總是需要在下面的模式來訪問數據:

  1. 創建連接。
  2. 創建一個使用連接的命令(包括添加任何參數值)。
  3. 打開連接。
  4. 執行該命令。
  5. 關閉連接。

有這種變化,比如在關閉連接之前循環遍歷行,但通常這是它的工作原理。爲了確保連接關閉,VB.Net提供Try/Finally塊使用語句。您需要使用其中之一來確保連接已關閉。

我會告訴你我的意思是以正確的方式重寫你的方法。

首先,將你的連接創建代碼包裝成一個函數。

Function GetConnection() As OdbcConnection 

    Dim DBConnection As String = ConfigurationManager.ConnectionStrings("dbConnNew").ConnectionString 

    GetConnection = New OdbcConnection(DBConnection) 

End Function 

其次,寫一個函數來創建你的命令。 (openDatabase是錯誤的名稱,所以我將它更改爲CreateCommand)。

Function CreateCommand(sql As String, connection As OdbcConnection) As OdbcCommand 

    CreateCommand = New OdbcCommand(sql, connection) 

End Function 

現在,當你想執行一個查詢或數據庫的語句,你可以按照這個模式:

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塊意味着連接將永遠是正確關閉即使異常導致代碼在您期望之前返回。

另一種速記是用語句(有效地做同樣的事情的處置在最後塊):

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 

如果你想換你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 

我懷疑,你第一次嘗試這個,你沒有關閉他們的連接打開。我還假設(從你寫的)你加入了closeConn方法來排序。不幸的是,每當您撥打connectionString時,您實際上正在創建並打開一個新連接,然後您將其撥打CloseDispose。初始連接永遠不會關閉。

希望有所幫助。

+0

哎呀!忘了在第一次編輯時添加連接的開頭。現在更新。 – Richard 2012-01-09 21:38:04

+0

不是現在我的電腦,在我的手機上,但這看起來正是我* *試圖*實現!謝謝,我會稍後再試一試並回報! :) – 2012-01-09 22:27:38

+0

行,迄今爲止好。幾個問題:首先;當你需要在腳本過程中多次連接到數據庫時,你會在頂部使用連接打開連接,然後在末尾使用連接關閉,或者每次打開和關閉需要?其次,「結束使用」總是關閉連接? – 2012-01-10 10:19:23