Java 如何避免;“内存不足”;连接到Access数据库时出错?

Java 如何避免;“内存不足”;连接到Access数据库时出错?,java,ms-access,jdbc,ms-access-2007,ucanaccess,Java,Ms Access,Jdbc,Ms Access 2007,Ucanaccess,我有一个本地MS Access数据库,我正试图通过Java连接到它。我使用UCanAccess作为JDBC驱动程序,虽然数据库链接到网络驱动器上受密码保护的数据库,但我连接到的数据库已经过身份验证,本身没有密码保护。我的类路径中有所有依赖项。连接时,我不断遇到以下错误: java.lang.OutOfMemoryError:java堆 我启动了JavaVisualVM,实际上,主线程正在消耗所有2GB的分配内存。这只有在我试图从大型MySQL数据库中选择大量记录时才会发生。我在谷歌上找不到任何与

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

java.lang.OutOfMemoryError:java堆

我启动了JavaVisualVM,实际上,主线程正在消耗所有2GB的分配内存。这只有在我试图从大型MySQL数据库中选择大量记录时才会发生。我在谷歌上找不到任何与连接时发生的事件相关的结果,因为我甚至没有尝试查询数据库

代码很简单:

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生命周期中的第一次连接时将整个数据库加载到内存中。这被选为默认行为,因为典型的使用情况是针对较小的个人数据库,而不是千兆字节大小的数据库


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

我的女朋友也尝试了同样的方法,虽然她从未遇到过这个特定错误,但她无法让JDBC驱动程序与MS Access一起工作。她尝试的司机只是为了证明这是可能的,并不意味着要认真使用。另外,在Java8中,她使用的驱动程序不再作为桥所使用的特定方法工作,而是被删除。我不确定你的代码是否是这样。我的女朋友最终放弃了MS Access,开始使用postgresql数据库。@Taelsin-UCanAccess是一个纯Java解决方案,不使用JDBC-ODBC桥,因此在Java 8下运行良好。@TheDankOG-尝试添加
;memory=false
连接URL,看看是否有帮助。数据库不是2gb,大约是1.1gb,这就是为什么我为JVM分配2gb,以允许它加载整个数据库,并为查询执行提供一些开销空间。当我有机会的时候,我会试试memory=false标志。编辑:连接需要花费很长时间,但至少JVisualVM中的堆没有爆炸。您可能希望在memory=false之前使用skipIndex=true(它不会影响引用完整性约束)最小化内存占用。事实上,意外的内存占用可能是由于索引造成的,但是如果您可以使用memory=true,您将在查询执行中体验良好的性能。