2012-11-15 155 views
2

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

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

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

回答

2

db.Close()关闭一个连接。所有连接关闭后,.ldb会自动删除。请记住,尽管Jet数据库(即Access)支持多个同时在线的用户,但它们并不适合非常大的并发用户群;一方面,当网络问题时,它们很容易被破坏。我现在正在处理这个问题。如果涉及到这一点,您将需要使用数据库服务器。

也就是说,我已经多次使用过Jet数据库。

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

+1

有时,我发现删除所有连接到Access数据库的唯一方法是重新启动计算机。那就是他们。 – HelloW

+0

是的,如果你不是非常小心地释放它们,它很容易保持访问连接。使用C#interop尤其如此,您必须确保您使用Marshal.FinalReleaseComObject并进行显式垃圾回收。 – transistor1

1
  1. 是的,需要多个用户以共享模式打开数据库。它似乎代表“锁定数据库”。在MSDN中查看更多信息:Introduction to .ldb files in Access 2000
  2. Close()只关闭一个连接,其他连接不受影响。
  3. 是的,如果您尝试写入其他用户已锁定的记录,则可能会发生这种情况。但是,数据将保持一致,您只会收到有关写入冲突的错误。

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

1

作为另外的好的答案,我强烈建议保持与虚拟表的连接在客户端应用程序的生命周期中打开。

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

你可以阅读更多的this answer我给前一阵子了一下。

当涉及到性能和可靠性,可以得到相当多了Access数据库提供你把一些东西记:

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

  • 设计您的客户端应用程序以正确关闭所有连接(包括虚拟连接),无论发生什么情况(例如崩溃,用户关闭等)。
    锁定就绪并不好,因为这可能意味着客户端已将数据库置于未知状态,并且如果其他客户端继续丢弃旧锁,则可能会增加发生损坏的可能性。

  • 压缩并定期修复数据库。让它成为夜间任务。
    这将确保数据库已经过优化,并且任何过时的数据都会被删除,并且打开的锁定会正确关闭。

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

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