Как отключить все соединения JDBC на Glassfish и разблокировать базу данных H2?

Я использую сервер Glassfish 4.1 с базой данных H2 в tcp/многопользовательском режиме. Я пытаюсь программно обновить таблицы в одноэлементном компоненте. Я всегда получаю следующее исключение:

org.h2.jdbc.JdbcSQLException: Timeout trying to lock table "GLOBALS"; SQL statement: ALTER TABLE "PUBLIC".GLOBALS ADD STARTFLAG VARCHAR(512) [50200-176]

Я знаю, что таблица заблокирована, так как один из менеджеров сущностей, управляемых контейнером, похоже, имеет открытое соединение с этой таблицей. Но во время оператора alter table не было бы необходимости в каком-либо соединении...

Поэтому мне интересно, есть ли возможность закрыть все соединения jdbc с помощью JPA, управляемого контейнером?

Вот строка инициализации, которую я использую для запуска/подключения к базе данных H2:

jdbc:h2:tcp://localhost/~/datastore/database;AUTO_SERVER=TRUE;MVCC=TRUE 
  • Я уже пытался закрыть диспетчер сущностей, управляемый контейнером, и фабрику менеджеров сущностей (но я думаю, что это неправильный подход, поскольку он обрабатывается контейнером) до выполнения операторов обновления.

  • Я попытался отсоединить управляемые объекты до выполнения операторов обновления.

  • Я попытался добавить параметр MVCC=TRUE (параллелизм нескольких версий).

  • Также пытался установить FILE_LOCK=NO, но затем я получаю другое исключение, которое говорит мне, что эта комбинация параметров недействительна.

но пока безуспешно...

Любые идеи высоко ценятся - заранее спасибо!


person salocinx    schedule 08.01.2015    source источник
comment
Какая у вас строка подключения? Вы установили DB_CLOSE_ON_EXIT?   -  person Ali Arda Orhan    schedule 09.01.2015
comment
@Ali: Спасибо за ваш ответ. Нет, до сих пор этого не делал, но как это должно помочь в моей проблеме? Я расширил свой вопрос строкой подключения...   -  person salocinx    schedule 09.01.2015


Ответы (1)


Решение, которое приходит мне на ум, - отключить сервер и снова открыть соединение.

Если вы используете конфигурацию Java, вы можете использовать server.stop()

import org.h2.tools.Server;
...
// start the TCP Server
Server server = Server.createTcpServer(args).start();
...
// stop the TCP Server
server.stop();

Если вы создаете БД через свой URL. Вы можете создать bat-файл и вызывать его программно из своего приложения.

java org.h2.tools.Server -tcpShutdown tcp://localhost:9092

Дополнительную информацию можно найти на веб-сайте H2.

person Ali Arda Orhan    schedule 09.01.2015
comment
К сожалению, я использую jpa, управляемый контейнером, на сервере приложений Glassfish. Поэтому контейнер сам контролирует жизненный цикл соединений h2-сервера и jdbc. Все равно спасибо за идею. - person salocinx; 09.01.2015