Java Hsqldb-可能的prepare语句内存泄漏

Java Hsqldb-可能的prepare语句内存泄漏,java,jdbc,hsqldb,Java,Jdbc,Hsqldb,我正在使用hsqldb版本2.3.1或2.3.2(发现两者都有问题) 我有一些代码,我在其中对数据库进行了大量的插入,并且我尽可能地清理了所有的资源-但是我注意到调用execute on语句会导致内存永远不会消失-即使我关闭了准备好的语句、连接等等 下面是您可以在计算机上运行并验证的代码(在java默认堆大小上运行,OutOfMemory应该在5分钟内出现): Connection c=DriverManager.getConnection(“jdbc:hsqldb:mem:a”); Prepa

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

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

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

Connection c=DriverManager.getConnection(“jdbc:hsqldb:mem:a”);
PreparedStatement ps=c.prepareStatement(“设置数据库sql语法或true”);
ps.execute();
ps.close();
ps=c.prepareStatement(“创建表t(x varchar2(1000字符))”;
ps.execute();
ps.close();
c、 close();
String str=“abcdefghijklmnopqrstuvxyz”;
str=str+str+str+str+str//只是一条很长的线来加速结果
String x=String.format(“插入到t值('%s')”,str);
对于(int i=0;i请阅读此处关于关机的内容

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

如果数据库无法保留,则您永远无法插入,因为在创建数据库和表后,您关闭了连接,然后重新打开,该表应该会消失,不是吗

如果第一次使用以下方法打开数据库,则可以在最后一个连接关闭后强制关闭该数据库:

Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:a;shutdown=true");
但是现在您不能再插入了,因为在新的
getConnection
之后,您的表就不存在了

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

c.createStatement().execute("SHUTDOWN");
如果您处理的是更大的数据,您的第一个选择应该是使用基于磁盘的缓存表在文件系统中创建一个HSQL数据库。这样,它的内存占用不会像在内存中那样随着数据的增长而增长。

请阅读此处关于关机的内容

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

如果数据库无法保留,则您永远无法插入,因为在创建数据库和表后,您关闭了连接,然后重新打开,该表应该会消失,不是吗

如果第一次使用以下方法打开数据库,则可以在最后一个连接关闭后强制关闭该数据库:

Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:a;shutdown=true");
但是现在您不能再插入了,因为在新的
getConnection
之后,您的表就不存在了

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

c.createStatement().execute("SHUTDOWN");
如果您处理的是更大的数据,您的第一个选择应该是使用基于磁盘的缓存表在文件系统中创建一个HSQL数据库。这样,它的内存占用不会像在内存中那样随着数据的增长而增长。

请阅读此处关于关机的内容

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

如果数据库无法保留,则您永远无法插入,因为在创建数据库和表后,您关闭了连接,然后重新打开,该表应该会消失,不是吗

如果第一次使用以下方法打开数据库,则可以在最后一个连接关闭后强制关闭该数据库:

Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:a;shutdown=true");
但是现在您不能再插入了,因为在新的
getConnection
之后,您的表就不存在了

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

c.createStatement().execute("SHUTDOWN");
如果您处理的是更大的数据,您的第一个选择应该是使用基于磁盘的缓存表在文件系统中创建一个HSQL数据库。这样,它的内存占用不会像在内存中那样随着数据的增长而增长。

请阅读此处关于关机的内容

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

如果数据库无法保留,则您永远无法插入,因为在创建数据库和表后,您关闭了连接,然后重新打开,该表应该会消失,不是吗

如果第一次使用以下方法打开数据库,则可以在最后一个连接关闭后强制关闭该数据库:

Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:a;shutdown=true");
但是现在您不能再插入了,因为在新的
getConnection
之后,您的表就不存在了

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

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

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

您尝试回滚时不起作用,因为连接处于自动提交模式,并且插入已提交自动提交。在任何插入之前,它需要c.setAutoCommit(false)。由于连接处于自动提交模式,并且插入是自动提交的,因此回滚尝试无效。它需要c.setAutoCommit(false)在任何插入之前。您的回滚尝试无效,因为连接处于自动提交模式,并且插入是自动提交的。在任何插入之前都需要c.setAutoCommit(false)。您的回滚尝试无效,因为