将 DriverManager.getConnection 与 UCanAccess 一起使用时的内存消耗

mat*_*att 5 java database jdbc ucanaccess

我将 JDBC 与 UCanAccess 一起使用,以便通过直接文件路径创建到 MS Access 文件的连接,以将特定表存储到 JSON 对象中。但是,我的代码行

conn = DriverManager.getConnection(s1+inFilePath, user, pass);
Run Code Online (Sandbox Code Playgroud)

其中 conn 是一个未初始化的 Connection 对象,创建连接会导致某种内存泄漏,最终导致超出 GC 开销限制。

有没有办法解决这个问题?我尝试更改堆大小但没有结果。

Gor*_*son 4

这不是内存泄漏。作为正常操作的一部分,UCanAccess 正在消耗内存。

UCanAccess 使用 Access 数据库的 HSQLDB“镜像”来支持 SQL 操作,并且默认情况下在内存中创建镜像数据库。因此,如果您连接到具有包含 30 MB 数据的表的 Access 数据库,则 UCanAccess 将使用约 30 MB 的内存来存储镜像数据库。

附加;memory=false到连接 URL 将告诉 UCanAccess 在磁盘上而不是在内存中创建 HSQLDB 镜像数据库。这将显着减少内存需求,但建立连接(即创建镜像数据库)也会花费更长的时间。

UCanAccess 还“镜像”它在指定数据库中找到的所有表。因此,如果您只对使用名为“main.accdb”的数据库中的一个特定表感兴趣,那么您可以

  • 创建一个新的 Access 数据库,例如“link.accdb”
  • 在“link.accdb”中创建一个链接表,指向“main.accdb”中的实际表,然后
  • 使用 UCanAccess 打开“link.accdb”。

使用上述过程,UCanAccess 仅镜像一张表。

还有其他几个选项可以控制 UCanAccess 的镜像行为;有关详细信息,请参阅UCanAccess 网站