2013-06-02 3 views
0

Я использую H2 1.3.172 на машине Windows, с помощью следующей строки подключения:Коррумпированные H2 Database

jdbc:h2:tcp://localhost/dev/*****;LOG=0;UNDO_LOG=0;DB_CLOSE_ON_EXIT=TRUE;IGNORECASE=TRUE;OPTIMIZE_REUSE_RESULTS=0;QUERY_TIMEOUT=180000;MAX_OPERATION_MEMORY=0;MAX_MEMORY_ROWS=30000;COMPRESS_LOB=NO;LOCK_MODE=0;MULTI_THREADED=0;CACHE_SIZE=1048576;TRACE_LEVEL_FILE=2; 

я получаю следующее исключение при попытке подключиться к существующей базе данных:

General error: "java.lang.NullPointerException" 

Сценарий:

  • у меня есть весьма сложный процесс вокруг базы данных H2.
  • Все работает нормально, без проблем.
  • Когда IIS достигает таймаута в режиме ожидания, делается попытка закрыть любые открытые соединения .
  • Неудача, как показано в журнале трассировки (последние несколько строк):

    06-02 15:32:33 jdbc[2]: 
    /*SQL #:1*/UPDATE UserTokens SET Timestamp_Expires = DATEADD('MINUTE', 20, Timestamp_Expires) WHERE Token = '1812493846'; 
    06-02 15:32:33 jdbc[2]: 
    /*SQL #:1*/SELECT QC_Result FROM QueryCache WHERE QC_Query = 'COMMAND::usp_Engine_Metrics_FindByName||PARAM::@name%%VarChar%%50%%Hands Played||'; 
    06-02 15:32:33 jdbc[2]: 
    /*SQL #:1*/SELECT RC_Result FROM ResultsCache WHERE RC_ID = '5/2/2013 12:00:00 AM_6/1/2013 11:59:59 PM__Hands Played|_Day_True____0'; 
    06-02 15:32:33 jdbc[2]: 
    /*SQL #:1*/UPDATE UserTokens SET Timestamp_Expires = DATEADD('MINUTE', 20, Timestamp_Expires) WHERE Token = '1812493846'; 
    06-02 15:32:33 jdbc[2]: 
    /*SQL #:1*/INSERT INTO UserState (US_ID, US_State) VALUES ('b72e861a3c04a5b1ab8282eb6605b9e0','{\"view\":\"dashboard\",\"dashboardID\":21,\"panelID\":-1,\"reportID\":-1,\"fromdate\":null,\"todate\":null,\"guid\":\"b72e861a3c04a5b1ab8282eb6605b9e0\",\"timestamp\":\"2013-06-02T12:32:33.183Z\"}'); 
    06-02 15:35:49 jdbc[2]: 
    /*SQL */COMMIT; 
    06-02 15:35:49 jdbc[2]: 
    /*SQL */ROLLBACK; 
    06-02 15:35:49 database: disconnecting session #2 
    06-02 15:35:49 database: closing C:/Program Files (x86)/H2/service/dev/JarvisDB 
    06-02 15:35:49 database: close 
    java.lang.ArrayIndexOutOfBoundsException: 2048 
    at org.h2.store.Data.writeValue(Data.java:406) 
    at org.h2.store.Data.writeValue(Data.java:640) 
    at org.h2.index.PageBtreeIndex.writeRow(PageBtreeIndex.java:396) 
    at org.h2.index.PageBtreeNode.writeData(PageBtreeNode.java:446) 
    at org.h2.index.PageBtreeNode.write(PageBtreeNode.java:420) 
    at org.h2.store.PageStore.writeBack(PageStore.java:1012) 
    at org.h2.store.PageStore.writeBack(PageStore.java:412) 
    at org.h2.store.PageStore.checkpoint(PageStore.java:430) 
    at org.h2.engine.Database.closeOpenFilesAndUnlock(Database.java:1211) 
    at org.h2.engine.Database.close(Database.java:1164) 
    at org.h2.engine.Database.removeSession(Database.java:1043) 
    at org.h2.engine.Session.close(Session.java:617) 
    at org.h2.server.TcpServerThread.closeSession(TcpServerThread.java:177) 
    at org.h2.server.TcpServerThread.process(TcpServerThread.java:272) 
    at org.h2.server.TcpServerThread.run(TcpServerThread.java:151) 
    at java.lang.Thread.run(Unknown Source) 
    06-02 15:35:49 database: closed 
    06-02 15:35:49 database: disconnected session #2 
    

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

Большое спасибо,

+0

почему 'C#' тега ??? –

+0

Вам необходимо связаться с проектом Apache DB, который делает Derby. У них есть список рассылки пользователей и трекер ошибок. Если вы можете сделать автономный тестовый пример этого исключения, я уверен, что они будут беспокоиться об этом. – bmargulies

+0

@bmargulies Этот вопрос касается базы данных H2, а не об Apache Derby. –

ответ

2

Вы использовали опасные варианты LOG=0 (disabling the transaction log), UNDO_LOG=0 (disabling the undo log), LOCK_MODE=0 (disabling database level locking). Если вы получите исключение со всеми этими опасными настройками, этого можно ожидать. Это documented as well in the FAQ.

Поэтому я предлагаю вместо этого использовать параметры по умолчанию. Я думаю, что следующие параметры должны быть более подходящими для вашего случая:

jdbc:h2:tcp://localhost/dev/*****; 
    IGNORECASE=TRUE; 
    QUERY_TIMEOUT=180000; 
    CACHE_SIZE=1048576 

Я хотел бы использовать параметры по умолчанию, если у вас есть очень веские причины не к:

jdbc:h2:tcp://localhost/dev/***** 
+0

У меня есть jdbc: h2:/home/markus/mydb; create = true; AUTO_SERVER = TRUE; AUTO_RECONNECT = TRUE; TRACE_MAX_FILE_SIZE = 3 и получить ту же ошибку. Конечно, я не могу отключить AUTO_SERVER, потому что это основной момент использования H2 для моего проекта. Это не проблема, если я использую версию H2 h2-1.3.172, только с последней версией. – dendini

+0

@ dendini вы можете отправить электронное письмо в группу H2 Google? –

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