Estamos usando o HSQLDB numa aplicação aqui, mas recentemente essa aplicação passou para notebooks. O problema é que se o usuário estiver com o notebook e a bateria acabar, o sistema é desligado abruptamente e o banco fica corrompido. O problema ocorre também nos desktops, se o cabo de energia for puxado, ou se o sistema for resetado pelo botão de power.
Alguém sabe se é possível evitar o corrompimento desses dados (eu imagino que a resposta seja “não é possível”, mas não custa perguntar, heheeh )?
The current test.data file is corrupt, but with the old test.data (from the test.backup file and test.script) and the current test.log, the database is made up-to-date. The database engine takes these steps:
Procedure C.3. Database Repair
Restore the old test.data file from the backup (uncompress the test.backup and overwrite test.data).
Execute all commands in the test.script file.
Execute all commands in the test.log file. If due to corruption, an exception is thrown, the rest of the lines of command in the test.log file are ignored.
Close the database correctly (including a backup).
Adelar
Acho que não. Mesmo se tentar recuperar os dados ainda vai ter corrompidos depois do desligamento forçado. Achava que o log não era corrompido neste caso :?
ViniGodoy
RafaelViana:
Não uso o HSQLDB, mas achei algo que talvez possa te ajudar:
O guide foi o primeiro lugar que eu olhei. Mas, infelizmente, isso só constata que ele corrompe mesmo. =/
Eu imaginei que não teria nenhum jeito de contornar o problema. Parece ser uma falha da arquitetura dele.
E o bichinho corrompe fácil, fácil. O jeito é apelar para um “workaround” (para não dizer xunxo mesmo).
Adelar
Tanto que não é recomendado para produção… mas a gente usa
Alguma das configurações dele (in-memory e tal) deve ser melhor neste caso… mas nenhuma parece resolver o problema. Tivemos problema com ele também neste caso… mas como é servidor que fica ligado sempre e as informações podem ser facilmente recuperadas isso foi deixado de lado.
andreiribas
Aqui usamos o HSQLDB em uma aplicação embarcada que não pode falhar.
A solução que encontramos foi usar um workaround:
Temos um job que fica rodando a cada tanto tempo chamando o comando CHECKPOINT, e às vezes faz o defrag do log também.
Aqui não tivemos perda de performance, pois o BD é usado somente com a aplicação local.