如何避免" Out of Memory"连接到Access数据库时出错?

时间:2015-11-27 16:45:29

标签: java ms-access jdbc ms-access-2007 ucanaccess

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

  

java.lang.OutOfMemoryError:Java堆

我启动了Java VisualVM,实际上,主线程占用了所有2GB的已分配内存。当我尝试从大型MySQL数据库中选择大量记录时,这种情况才发生在我身上。我无法在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();

任何想法为什么只是尝试建立连接会导致如此大的内存消耗?

1 个答案:

答案 0 :(得分:1)

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

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