截断需要花费太多时间hsqldb

时间:2015-03-21 08:48:10

标签: properties hsqldb truncate

我使用HSQLDB 2.3.2,我遇到了以下问题:

  1. 我的数据库缓存了包含10 000 000条记录的表,没有任何约束和索引。它的大小约为900mb。我关闭自动提交模式,当我尝试执行“Truncate table tableName”时,执行挂起但只有dbName.backup正在增长。这就是原因:
  2.   

    追踪引擎:? - copyShadow [size,time] 2246252 9721
    TRACE   发动机:? - setFileModified标志设置为TRACE ENGINE:? - 缓存保存   行[count,time]总计24801,9921运行24801,9921 txts 96
      追踪引擎:? - copyShadow [size,time] 4426920 7732
    TRACE   发动机:? - 缓存保存行[count,time]总计49609,17775操作   24808,7854 txts 96
    TRACE ENGINE:? - copyShadow [大小,时间]   6574796 9024

    大约需要1500-2000秒,最后我可以获得空表或异常,如下所示:

    Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,525.509 sec
    org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: null
    java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
        at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
        at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)
    Caused by: java.lang.OutOfMemoryError: Java heap space
    

    删除截断dbName.backup后。我不必在我的应用程序中使用任何备份,如何避免复制?

    1. dbName.properties不起作用。它包含以下文本:

        

      #HSQL数据库引擎2.3.2

           

      #Thu Mar 19 08:42:10 EAT 2015

           

      版本2.3.2 =
        改性=无

    2.      我尝试追加hsqldb.applog=1但没有任何反应。如果您更改dbName.script中的行SET DATABASE EVENT LOG LEVEL 1,则会出现.dbName.app.log   在使用我的应用程序中的数据库后,dbName.properties被覆盖:'modified'更改为'yes',并删除下面的任何行。我做错了什么?

1 个答案:

答案 0 :(得分:0)

  

我的数据库已缓存表,其中包含10 000 000条记录而没有任何记录   约束和索引。

拥有一个没有任何约束和索引的大表是完全错误的。此表上任何影响几行的SELECT,UPDATE或DELETE都必须搜索表中的所有行。

  

我尝试执行"截断表tableName"

上述语句允许您在提交之前回滚操作。回滚信息存储在内存中,当表非常大时,内存将耗尽。由于您确实要提交更改,请改用此语句:

TRUNCATE TABLE tableName AND COMMIT

指南中提到了这一点:http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement

您可以对.properties文件进行的唯一补充是只读设置数据库文件。任何其他更改都将被忽略并删除。

.backup文件供内部使用数据库引擎,您无法停止使用。