1

MS Access から最新の DBMS への移行を進めていますが、解決策や説明が見つからない問題に遭遇しました。

通常、OleDBConnection を開くと、プール内の最後の接続が閉じてから 1 分間ハングするロック ファイルが生成されます。このファイルを調べると、ロック プロセスなどに関する情報が少し得られます。通常 (コードの他のすべての部分で)、これは、接続が何回開閉されても、ロック ファイルにエントリを 1 つだけ生成します。同じプロセス、素晴らしい。

connection.open()ごとにこのロックファイルに新しいエントリを作成するように見えるまったく同じ接続文字列を使用して、いくつかの新しい機能を開発しました。各メソッドの finally ブロックですべてのリソースが閉じられていることを確認しました。さらに悪いことに、ページをリロードすると、開いている接続/ロックのハード リミットである 255 に達するまで、追加のセットが生成されます。

この領域と他の多くの領域で見られる唯一の違いは、finally ブロックに到達する前にサブオブジェクトをロードすることです。次のパターンは、約 3 レベル下まで続きます。テンプレートを読み込んでデータ入力フォームを作成しているので、効率についてはあまり心配していません。

ldb/laccdb ファイルに同一のエントリが蓄積されていることに遭遇した人はいますか? ありがとう

Provider=Microsoft.ACE.OLEDB.12.0;Data Source='...\db.accdb';Persist Security Info=False;OLE DB Services=-1;
...
Public Overrides Function load(ByVal DB_ID As Integer) As Boolean
        Dim connection As OleDbConnection
        connection = New OleDbConnection(connStr)
        Dim reader As OleDbDataReader = Nothing
        Try
            Dim loadCMD As New OleDbCommand(String.Format("SELECT * FROM {0} WHERE ID = @db_ID", tableName), connection)
            loadCMD.Parameters.AddWithValue("@db_ID", DB_ID)
            connection.Open()
            reader = loadCMD.ExecuteReader()
            If reader.Read() Then
                ID = GetNullSafeValue(reader(Schema.FormSections.ID), GetType(Integer), failure)
                FormID = GetNullSafeValue(reader(Schema.FormSections.FormID), GetType(Integer), failure)
                SectionTitle = GetNullSafeValue(reader(Schema.FormSections.SectionTitle), GetType(String))
                Expanded = GetNullSafeValue(reader(Schema.FormSections.Expanded), GetType(Boolean))
                ServiceURL = GetNullSafeValue(reader(Schema.FormSections.ServiceURL), GetType(String))
                SectionOrder = GetNullSafeValue(reader(Schema.FormSections.SectionOrder), GetType(Integer), failure)
                Rows = FormRow.loadAllForSection(ID, config)
                Return True
            End If
        Catch ex As Exception
            ExceptionHandler(ex, config)
        Finally
            If reader IsNot Nothing Then
                reader.Close()
            End If
            connection.Close()
        End Try
        Return False
    End Function
...
Public Shared Function loadAllForSection(ByVal db_SectionID As Integer, ByVal cfg As ReportManagerConfiguration) As List(Of FormRow)
    Dim retList As New List(Of FormRow)
    Dim connection As OleDbConnection
    connection = New OleDbConnection(cfg.RM_LabConfig.connString)
    Dim reader As OleDbDataReader = Nothing
    Try
        Dim loadAll As New OleDbCommand(String.Format("SELECT ID FROM {0} WHERE SectionID = @db_sID ORDER BY RowNumber ASC", cfg.RM_LabConfig.FormRowsTable), connection)
        loadAll.Parameters.AddWithValue("@db_sID", db_SectionID)
        connection.Open()
        reader = loadAll.ExecuteReader()
        While reader.Read
            Dim thisRow As New FormRow(cfg)
            thisRow.load(GetNullSafeValue(reader(Schema.FormRows.ID), GetType(Integer), failure))
            If thisRow.ID <> failure Then
                retList.Add(thisRow)
            End If
        End While
    Catch ex As Exception
        ExceptionHandler(ex, cfg)
    Finally
        If reader IsNot Nothing Then
            reader.Close()
        End If
        connection.Close()
    End Try
    Return retList
End Function
4

2 に答える 2

0

実験から、ロックの構築は、外部呼び出しが接続を解放する前に、他の関数呼び出し内に新しい接続を作成することによって引き起こされたと判断できました。

解決策は、下位レベルに下がる前に接続が確実に閉じられるように書き直すことでした。

これが説明していない唯一のことは、クエリを再実行するとリストがさらに作成される理由です。接続は最終的に閉じられたので、次回はこれらのスロットを使用することを期待していました.

于 2013-05-16T18:02:09.797 に答える