OleDB 锁复制 .NET MS Access

Posted

技术标签:

【中文标题】OleDB 锁复制 .NET MS Access【英文标题】:OleDB lock duplication .NET MS Access 【发布时间】:2013-05-15 19:55:52 【问题描述】:

我们正在从 MS Access 迁移到现代 DBMS,但与此同时,我遇到了一个我找不到解决方案或解释的问题。

通常,打开 OleDBConnection 会生成一个锁定文件,该文件会在池中的最后一个连接关闭后挂起 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

【问题讨论】:

【参考方案1】:

对此我不确定,但我正在尝试回答您的问题。

尝试在 Try 块中关闭连接并在 finally 块中检查连接是否已打开。如果已经打开,则关闭它。

【讨论】:

感谢回复,不过这个好像没有效果。【参考方案2】:

通过实验,我已经能够确定锁的累积是由于在外部调用释放连接之前在其他函数调用中创建新连接造成的。

解决方案是以确保连接在进入较低级别之前关闭的方式对其进行重写。

唯一没有解释的是为什么重新运行查询会进一步构建列表。连接最终关闭了,所以我预计它下次会使用这些插槽。

【讨论】:

以上是关于OleDB 锁复制 .NET MS Access的主要内容,如果未能解决你的问题,请参考以下文章

更新查询在带有 MS Access 的 VB.NET 中不起作用

使用 c# 和 oledb 查询更新 Ms-Access 2010 中的列值

VB.Net 2008 连接到 MS Access

无法通过 C# oledb 将记录插入 MS Access

使用 Oledb 对象插入 ms-access 查询获取无效查询异常

MS Access OleDB 不返回任何行