如何为 Java 桌面应用程序将 Access 数据库共享到不同的电脑?

How to share an Access database to different pc's for a Java desktop application?

我正在 JAVA(RCP 插件)中创建一个桌面应用程序,我正在使用 MS Access 作为我的应用程序的数据库。

我将数据库文件保存在某个共享位置,但每当我尝试从不同的机器打开它时,它都会抛出异常,指出数据库已被其他人锁定。 请让我知道如何解决这个问题。

有什么方法可以使用 JDBC 连接在不同机器之间共享 MS Access 数据库文件?

没有。这就像把你的车给几个人,而他们都想同时开它:它行不通,原因有很多。

解决方法:

  1. 使用像 MySQL 或 H2 这样的真实数据库。

  2. 创建一个与 Access 数据库通信的 Java 服务器。让所有其他程序与此服务器通信。

注意:当您使用方法 #2 时,您不能在 "other programs" 中使用 JDBC。您必须编写自己的协议。

如果您的应用程序确实使用了 JDBC-ODBC 桥(正如您问题中的 标记所建议的)和 Microsoft Access ODBC 驱动程序,那么 ,一定数量的并发用户应该能够使用您的 Java 应用程序在共享的 Access 数据库上工作。

您问题中描述的行为的最常见原因是对 Access 数据库文件(.accdb 或 .mdb)所在的 文件夹 的权限不足。 Access 使用 "lock file"(.laccdb 或 .ldb)来管理多个并发用户,因此所有用户都必须对 文件夹 具有 "change" 权限,以便他们可以创建 and/or 更新锁定文件。

例如,如果您的共享 Access 数据库驻留在映射到所有用户的 Z: 驱动器的服务器共享中,并且您的 Java 代码看起来像这样...

// (Note: Only for Java 7 or earlier.)
String url = "jdbc:odbc:" +
        "Driver={Microsoft Access Driver (*.mdb, *.accdb)};" +
        "DBQ=Z:/test/myTest.mdb;";
try (Connection conn = DriverManager.getConnection(url)) {
    // do useful stuff here
} catch (Exception e) {
    e.printStackTrace(System.err);
}

...那么您需要确保所有用户对"Z:\test"文件夹具有"change"权限。

更详细的解释见我的另一个回答here

我相信您可以对 MS Access 中的多用户选项进行一些设置。请按照以下步骤操作。打开 MS Access (2016),导航到文件 > 选项 > 客户端设置 > 滚动到高级:-

默认打开方式:共享; 默认记录锁定:无锁;