2

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

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

  1. 是否ldb用于跟踪多个连接的文件
  2. 调用 an 会db.close()关闭所有连接还是仅关闭一个实例。
  3. 上述方法是否会有任何同步问题。
4

3 回答 3

2

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

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

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

当您说“同步问题”时,不确定您的意思。

于 2012-11-15T19:26:01.920 回答
1

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

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

您可以在我不久前给出的这个答案中阅读更多内容。

在性能和可靠性方面,您可以从 Access 数据库中获得很多好处,前提是您牢记以下几点:

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

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

  • 定期压缩和修复数据库。让它成为夜间任务。
    这将确保优化数据库,并删除任何陈旧数据并正确关闭打开的锁。

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

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

于 2012-11-16T04:58:17.760 回答
1
  1. 是的,需要多个用户以共享模式打开数据库。似乎它代表“锁定数据库”。在 MSDN 中查看更多信息:Access 2000 中的 .ldb 文件简介
  2. Close()仅关闭一个连接,其他连接不受影响。
  3. 是的,如果您尝试写入其他用户已锁定的记录,这是可能的。但是数据将保持一致,您只会收到有关写入冲突的错误。

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

于 2012-11-15T19:38:53.343 回答