使用 DriverManager.getConnection 和 UCanAccess 时的内存消耗
Memory consumption when using DriverManager.getConnection with UCanAccess
我将 JDBC 与 UCanAccess 一起使用,以便通过直接文件路径创建到 MS Access 文件的连接,以将特定 table 存储到 JSON 对象中。但是,我的代码行
conn = DriverManager.getConnection(s1+inFilePath, user, pass);
其中 conn 是未初始化的 Connection 对象,创建连接会导致某种内存泄漏,最终导致超过 GC 开销限制。
有什么办法可以解决这个问题吗?我尝试更改堆大小但没有结果。
这不是内存泄漏。作为正常操作的一部分,UCanAccess 正在消耗内存。
UCanAccess使用Access数据库的一个HSQLDB"mirror"支持SQL操作,默认在内存中创建镜像数据库。因此,如果您连接到一个包含 table 的 Access 数据库,其中包含 30 MB 的数据,那么 UCanAccess 将使用大约 30 MB 的内存来存储镜像数据库。
将;memory=false
附加到连接URL 将告诉UCanAccess 在磁盘而不是内存中创建HSQLDB 镜像数据库。这将显着减少内存需求,但建立连接(即创建镜像数据库)也需要更长的时间。
UCanAccess 还 "mirrors" 它在指定数据库中找到的所有 table。因此,如果您只对在名为 "main.accdb" 的数据库中使用一个特定的 table 感兴趣,那么您可以
- 创建一个新的 Access 数据库,例如 "link.accdb"
- 在 "link.accdb" 中创建链接 Table,指向 "main.accdb" 中的实际 table,然后
- 使用UCanAccess打开"link.accdb"。
使用上述程序,UCanAccess 只镜像了table.
还有其他几个选项可以控制 UCanAccess 的镜像行为;有关详细信息,请参阅 UCanAccess website。
我将 JDBC 与 UCanAccess 一起使用,以便通过直接文件路径创建到 MS Access 文件的连接,以将特定 table 存储到 JSON 对象中。但是,我的代码行
conn = DriverManager.getConnection(s1+inFilePath, user, pass);
其中 conn 是未初始化的 Connection 对象,创建连接会导致某种内存泄漏,最终导致超过 GC 开销限制。
有什么办法可以解决这个问题吗?我尝试更改堆大小但没有结果。
这不是内存泄漏。作为正常操作的一部分,UCanAccess 正在消耗内存。
UCanAccess使用Access数据库的一个HSQLDB"mirror"支持SQL操作,默认在内存中创建镜像数据库。因此,如果您连接到一个包含 table 的 Access 数据库,其中包含 30 MB 的数据,那么 UCanAccess 将使用大约 30 MB 的内存来存储镜像数据库。
将;memory=false
附加到连接URL 将告诉UCanAccess 在磁盘而不是内存中创建HSQLDB 镜像数据库。这将显着减少内存需求,但建立连接(即创建镜像数据库)也需要更长的时间。
UCanAccess 还 "mirrors" 它在指定数据库中找到的所有 table。因此,如果您只对在名为 "main.accdb" 的数据库中使用一个特定的 table 感兴趣,那么您可以
- 创建一个新的 Access 数据库,例如 "link.accdb"
- 在 "link.accdb" 中创建链接 Table,指向 "main.accdb" 中的实际 table,然后
- 使用UCanAccess打开"link.accdb"。
使用上述程序,UCanAccess 只镜像了table.
还有其他几个选项可以控制 UCanAccess 的镜像行为;有关详细信息,请参阅 UCanAccess website。