访问 .ldb 文件和多重连接。

Posted

技术标签:

【中文标题】访问 .ldb 文件和多重连接。【英文标题】:Access .ldb file & multiple connection. 【发布时间】:2012-11-15 19:05:07 【问题描述】:

我有一个 API 可以打开一个访问数据库进行读写。 API 在连接被构造时打开连接,在连接被破坏时关闭连接。当数据库打开时,.ldb 文件被创建,当它关闭时它被删除(或消失)。

有多个应用程序使用 API 来读取和写入访问数据库。我想知道:

    ldb 文件是否用于跟踪多个连接 调用db.close() 是否会关闭所有连接或仅关闭一个实例。 上述方法是否会出现任何同步问题。

【问题讨论】:

【参考方案1】:

db.Close() 关闭一个连接。关闭所有连接后,.ldb 会自动删除。

请记住,虽然 Jet 数据库(即 Access)确实支持多个同时用户,但它们并不是非常适合非常大的并发用户群;一方面,当出现网络问题时,它们很容易损坏。我现在实际上正在处理这个问题。如果涉及到这一点,您将需要使用数据库服务器。

也就是说,我已经多次以这种方式使用 Jet 数据库了。

不确定您所说的“同步问题”是什么意思。

【讨论】:

有时我发现删除 all 与 Access 数据库的连接的唯一方法是重新启动计算机。这得到了他们。 是的,如果您在释放访问连接时不十分小心,它很容易保持访问连接。使用 C# 互操作时尤其如此,您必须确保 Marshal.FinalReleaseComObject 并进行显式垃圾回收。【参考方案2】:
    是的,需要多个用户以共享模式打开数据库。似乎它代表“锁定数据库”。在 MSDN 中查看更多信息:Introduction to .ldb files in Access 2000。 Close() 仅关闭一个连接,其他连接不受影响。 是的,如果您尝试写入其他用户已锁定的记录,这是可能的。但是数据将保持一致,您只会收到有关写入冲突的错误。

实际上 MS Access 并不是多连接使用场景的最佳解决方案。 你可以看看SQL Server Compact,它是 MS SQL Server 的轻量版。它在进程内运行,支持多连接和多线程,大部分强大的 T-SQL 功能(不包括存储过程)等。

【讨论】:

【参考方案3】:

作为对其他好的答案的附加说明,我强烈建议在客户端应用程序的生命周期内保持与虚拟表的连接打开。

过于频繁地关闭连接并允许每次都创建/删除锁定文件是一个巨大的性能瓶颈,并且在某些快速访问数据库的情况下,实际上会导致查询和插入失败。

您可以在我刚才提供的this answer 中阅读更多内容。

在性能和可靠性方面,只要记住以下几点,您就可以从 Access 数据库中获得很多好处:

在客户端的生命周期内保持与虚拟表的连接打开(或者至少使用一些超时,如果您不想保持连接,则在 20 秒不活动后关闭连接一直打开)。

设计您的客户端应用程序以正确关闭所有连接(包括在我该做的时候的虚拟连接),无论发生什么(例如崩溃、用户关闭等)。 将锁留在原处并不好,因为这可能意味着客户端已将数据库置于未知状态,并且如果其他客户端继续留下陈旧的锁,则可能会增加损坏的可能性。

定期压缩和修复数据库。让它成为每晚的任务。 这将确保数据库得到优化,所有过时的数据都被删除并正确关闭打开的锁。

良好、稳定的网络连接对于基于文件的数据库的数据完整性至关重要:避免像瘟疫一样使用 WiFi。

有办法从数据库服务器本身踢出所有客户端。 例如,有一个表,其中包含客户端定期轮询的 MaintenanceLock 字段。如果设置了该字段,则客户端应在为用户提供保存其工作的机会后断开连接。 同样,当客户端应用程序启动时,请检查数据库中的此字段以允许或禁止客户端连接到它。 现在,您可以随时快速退出客户,而无需去找每个用户并要求他们关闭应用程序。当您在数据库上运行压缩和修复维护时,确保没有客户端在夜间打开仍然连接到数据库也非常有用。

【讨论】:

以上是关于访问 .ldb 文件和多重连接。的主要内容,如果未能解决你的问题,请参考以下文章

腾讯云服务器只要操作后台老是网络重连

BoneCP连接池重连机制分析

基础巩固——长连接 短连接心跳机制与断线重连

通过LDB_PROCESS函数使用逻辑数据库

windows10访问ubuntu samba共享文件夹报错:不允许一个用户使用一个以上用户与服务器多重连接(没解决)

Jboss数据库连接断开自动重连