连接Access数据库时如何避免"Out Of Memory"错误?

How to avoid "Out Of Memory" error when connecting to Access database?

我有一个本地 MS Access 数据库,我正在尝试通过 Java 连接到它。我使用 UCanAccess 作为 JDBC 驱动程序,虽然数据库链接到网络驱动器上受密码保护的数据库,但我正在连接的数据库已经过身份验证,并且本身不受密码保护。我的类路径中有所有依赖项。连接时,我不断收到此错误:

java.lang.OutOfMemoryError: Java heap

我启动了 Java VisualVM,实际上,主线程正在耗尽所有 2GB 的已分配内存。当我试图从大型 MySQL 数据库中 select 大量记录时,我才遇到过这种情况。我在 Google 上找不到与连接时发生的这种情况相关的任何结果,因为我什至没有尝试查询数据库。

代码很简单:

Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
System.out.println("Initiating connection...");
conn = DriverManager.getConnection("jdbc:ucanaccess://C:/Databases/StoreSalesCurrent.accdb");
System.out.println("Connection established");
conn.close();

知道为什么仅仅尝试建立连接会导致如此大的内存消耗吗?

默认情况下,UCanAccess 在 JVM 生命周期中的第一个连接时将整个数据库加载到内存中。这被选为默认行为,因为典型的用例是针对较小的个人数据库,而不是 GB 大小的数据库。

它将使用适当的连接参数,例如设置 memory=false 和其他相关选项,但启动时间(JVM 生命周期中第一次连接的时间)可能会变长。有关详细信息,请参阅 UCanAccess website