2015-03-21 4 views
0

я использую HSQLDB 2.3.2 и у меня есть следующие вопросы:усечение занимает слишком много времени HSQLDB

  1. Моя базы данных в кэше таблицы с 10 000 000 записей, без каких-либо ограничений и индексов. Его размер составляет ~ 900 мб. Я выключаю режим автосохранения, и когда я пытаюсь выполнить «Truncate table tableName», выполнение зависает, но только dbName.backup растет. И вот почему:

TRACE ENGINE :? - copyShadow [размер, время] 2246252 9721
TRACE ДВИГАТЕЛЬ :? - setFileModified флаг
TRACE ENGINE :? - сохранение кеша строк [количество, время] итого 24801,9921 операция 24801,9921 txts 96
TRACE ENGINE :? - copyShadow [размер, время] 4426920 7732
TRACE ДВИГАТЕЛЬ :? - кэш save rows [count, time] итоговые данные 49609,17775 операция 24808,7854 txts 96
TRACE ENGINE :? - copyShadow [размер, время]

занимает около 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 не работает. Он содержит следующий текст:

    2.3.2 #HSQL Database Engine

    #Thu 19 Мар 8:42:10 EAT 2015

    версию = 2.3.2
    модифицированный = нет

Я попытался добавить hsqldb.applog=1, но ничего не произошло.
dbName.app.log появляется в случае, если вы меняете строку SET DATABASE EVENT LOG LEVEL 1 в dbName.script
После работы с базой данных из моего приложения dbName.properties перезаписано: «измененные» изменения в «да» и любые строки ниже удалены. Что я делаю неправильно?

ответ

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, чтобы установить базу данных файлы readonly. Любые другие изменения будут проигнорированы и удалены.

Файл .backup предназначен для внутреннего использования механизма базы данных, и вы не можете прекратить его использование.

+0

Thx для ответа! Ваше заявление прекрасно работает! Btw Я добавлю ограничения позже, мне не нужно прямо сейчас – viRUS

Смежные вопросы