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