2012-01-09 6 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 

この関数以下のような何かを呼ばれたときションは、使用可能なデータ・オブジェクトを作成します。

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関数を使用するたびに呼び出され、を挿入/更新と削除のために作成した関数です。次のようになります。

これらの機能をすべて使いやすくするかどうかはわかりませんが、データが必要なファイルごとにコードを減らそうとしていましたが、確信が持てません。

しかし、それはそれをクリアし、私が開閉データベースを(あるいは少なくともしようとして)います

をしたプロセスは、しかし閉鎖されていません。 3つまたは4つの販売プロセスを迅速に連続して実行しても、これらの7つのプロセスがまだ稼動中で追加されている場合、max_connectionsの問題が発生します。

データベース接続の仕組みを完全には理解していないので、私はこれを忘れてしまい、あなたに尋ねなければなりません。もう一度!!

は、誰も私に伝えることができます:

a)は私の接続文字列が正しいです、MySQLのために利用可能なより良い接続がありますか?

b)ODBCConnectionオブジェクトを作成するこのメソッドを使用すると、このような関数内で閉じることができますか?

C)なぜ(CommandBehavior.CloseConnection)は接続を閉じていない(私は手動で接続を閉じる試みた前に、この問題が発生した)

+0

VB.NETタグ – Bueller

答えて

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に変更しました)。 try/finallyブロックは、接続が常に正しく閉鎖されることを意味使用

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 

:あなたは、クエリや、データベース内の文を実行したいとき

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

    CreateCommand = New OdbcCommand(sql, connection) 

End Function 

さて、あなたはこのパターンに従うことができますたとえExceptionによってコードが期待通りに返されなくても、

代替速記は(事実上最後のブロックで廃棄とまったく同じことを)Usingステートメントである:

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に電話をかけるたびに、実際に新しい接続を作成して開き、CloseまたはDisposeを呼び出します。最初の接続は決して閉じられません。

希望に役立ちます。

+0

が追加されました。私の最初の編集で接続のオープニングを追加するのを忘れました。今更新されました。 – Richard

+0

私のコンピュータではなく、私の電話では、それは私が達成しようとしていたものを正確に見ています!ありがとう、私はそれを後で試してみて、報告します! :) –

+0

OK、これまでのところ良い。いくつかの質問:まず、スクリプトの途中で何回かデータベースに接続する必要がある場合は、接続を使用して接続を開き、最後に 'を使用して終了 'するか、それを毎回開いて閉じる必須?第二に、 'end use'は常に接続を閉じますか? –

関連する問題