gpt4 book ai didi

java - Hsqldb - 可能的准备语句内存泄漏

转载 作者:行者123 更新时间:2023-12-01 23:06:39 27 4
gpt4 key购买 nike

我正在使用 hsqldb 版本 2.3.1 或 2.3.2(两者均发现问题)。

我有一些代码,其中我对数据库执行了大量插入,并且我清理了所有可能的资源 - 但我注意到调用执行语句会导致内存永远不会消失 - 即使我关闭准备好的语句、连接等...

下面是您可以在计算机上运行并验证的代码(在 Java 默认堆大小上运行,OutOfMemory 应在 5 分钟内出现):

Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:a");
PreparedStatement ps = c.prepareStatement("set database sql syntax ora true");
ps.execute();
ps.close();

ps = c.prepareStatement("create table t (x varchar2(1000 char))");
ps.execute();
ps.close();
c.close();
String str = "abcdefghijklmnopqrstuvwxyz";
str = str + str + str + str + str; //just a long string to rapid the outcome
String x = String.format("insert into t values('%s')",str);
for(int i=0;i<1000*1000*1000;i++){
c = DriverManager.getConnection("jdbc:hsqldb:mem:a");
ps = c.prepareStatement(x);
ps.executeUpdate(); //if I remove this line, there is no memory leak
ps.clearParameters();//I really try to clean every possible thing
ps.clearWarnings();//really try
ps.cancel();//cancel it even
ps.close();//close it of course
ps = null;//nullify to hint the GC
c.rollback(); //Rollback so that memory isn't even used inside the hsqldb
c.close();//close the connection even

if(i%100000 == 0){//Every once in a while a report about heap condition
System.gc();//perform gc
System.out.println(Runtime.getRuntime().freeMemory()/1024/1024);//in MB
}
}

如果运行代码,定期打印将打印可用的空闲内存 - 它将逐渐减少,直到 OutOfMemory。

正如你所看到的,我尝试了关闭、回滚、无效等 - 似乎没有任何效果。

使用 JvisualVM 看起来大部分内存都是 byte[]。

如果我是对的并且这是一个错误,我正在寻找解决方法。有什么建议么?我做错了什么吗?

谢谢

最佳答案

在这里阅读http://hsqldb.org/doc/guide/dbproperties-chapt.html关于关机。

如果未指定,即使您关闭与内存数据库中的 HSQL 的最后一个连接,数据库本身也不会被破坏并保留在内存中。每次在该数据库中插入新行时都会添加新行,并且该数据库会增长。

如果数据库不会保留,那么您永远无法插入,因为在创建数据库和表t之后,您关闭连接,然后重新打开后,表应该消失,不应该它。

如果您第一次打开数据库,则可以在关闭最后一个连接后强制关闭数据库:

Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:a;shutdown=true");

但是现在您无法再插入,因为在新的 getConnection 之后您的表不存在。

关闭数据库并释放所有内存的另一种可能性是 HSQL 的 SQL 命令 SHUTDOWN:

c.createStatement().execute("SHUTDOWN");

如果您正在处理更大的数据,您的第一个选择应该是在文件系统中使用基于磁盘的 CACHED 表创建 HSQL 数据库。那么它的内存占用就不会像在内存中那样随着数据的增长而增长。

关于java - Hsqldb - 可能的准备语句内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22648797/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com