我正在创建一个JAVA桌面应用程序(RCP插件),我使用MS Access作为我的应用程序的数据库。
我将数据库文件保存在某个共享位置,但每当我试图从不同的机器打开它时,它都会抛出异常,说数据库已经被其他人锁定了。请告诉我如何解决这个问题。
是否有办法在不同的机器之间使用JDBC连接共享MS Access数据库文件?
No。这就像把你的车给几个人,他们都想同时驾驶它:由于很多原因,它不会工作。
解决方案:
-
使用MySQL或H2等真实的数据库
创建一个与Access数据库对话的Java服务器。
注意:当您使用方法#2时,您不能在"其他程序"中使用JDBC。您必须编写自己的协议
如果您的应用程序实际上使用JDBC-ODBC桥(如您问题上的JDBC-ODBC标签所建议的)和Microsoft Access ODBC驱动程序,那么yes,适度数量的并发用户应该能够使用您的Java应用程序在共享Access数据库上工作。
您的问题中描述的行为的最常见原因是文件夹的权限不足,Access数据库文件(。Accdb或.mdb)驻留。Access使用"锁文件"(。Laccdb或.ldb)来管理多个并发用户,因此所有用户必须对文件夹具有"更改"权限,以便他们可以创建和/或更新锁文件。
例如,如果您的共享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"权限。
我相信你可以在MS Access中为多用户选项做一些设置。请按照以下步骤操作。打开MS Access(2016),导航到文件>选项>客户端设置>滚动到高级:-
默认打开模式:共享;默认记录锁定:无锁;