Ошибка базы данных H2: Возможно, база данных уже используется: «заблокирован другим процессом» - PullRequest
41 голосов
/ 17 ноября 2011

Я пытаюсь использовать базу данных H2 из приложения Java.

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

Connection con = DriverManager.getConnection("jdbc:h2:~/dbname", "username", "password");

Однако я получаю следующую ошибку:

Исключение в потоке "main" org.h2.jdbc.JdbcSQLException: База данных, возможно, уже используется: "заблокирована другим процессом". Возможные решения: закрыть все остальные соединения; использовать режим сервера [90020-161]

Я пытался удалить файл dbname.lock.db, но он автоматически создается заново.

Как разблокировать базу данных, чтобы использовать ее из моей программы на Java?

Ответы [ 9 ]

43 голосов
/ 17 ноября 2011

H2 все еще работает (я могу гарантировать это).Вам необходимо использовать TCP-соединение для нескольких пользователей, например ->

<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/C:\Database\Data\production;"/>

ИЛИ

DriverManager.getConnection("jdbc:h2:tcp://localhost/server~/dbname","username","password");

Это также означает, что вам необходимо запустить сервер в режиме TCP.Честно говоря, это довольно просто в документации.

Принудительно завершить процесс (javaw.exe для Windows) и убедиться, что любое приложение, которое могло его запустить, было закрыто.У вас активная блокировка.

12 голосов
/ 15 марта 2015

Я использую h2db с тестовым приложением T24 tafj, у меня была та же проблема, но мне удалось ее решить, определив приложение, которое работает на h2 (запущено, когда я пытался установить соединение с базой данных).

ps aux|grep java

выдаст вывод как:

sysadmin 22755  3.2  0.1 5189724 64008 pts/3   Sl   08:28   0:00 /usr/java/default/bin/java -server -Xmx2048M -XX:MaxPermSize=256M -cp h2-1.3.175.jar:/r14tafj/TAFJ/dbscripts/h2/TAFJFunctions.jar org.h2.tools.Server -tcp -tcpAllowOthers -baseDir /r14tafj/t24/data

, теперь убейте его с помощью идентификатора процесса:

kill -9 22755

и, наконец, удалите файл блокировки:

rm -f dbname.lock.db
6 голосов
/ 17 ноября 2014

Вы также можете перейти на вкладку «Предпочтения» на консоли H2 и закрыть все активные сеансы, нажав кнопку выключения.

5 голосов
/ 15 декабря 2017

У меня была такая же проблема.в Intellj, когда я хочу использовать базу данных h2 , когда моя программа работала, я получал ту же ошибку.Для решения этой проблемы я изменил URL соединения с

spring.datasource.url=jdbc:h2:file:~/ipinbarbot

на:

spring.datasource.url=jdbc:h2:~/ipinbarbot;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

И тогда моя проблема ушла.Теперь я могу подключиться к базе данных "ipinbarbot", когда моя программа.Если вы используете Hibernate, также не забудьте:

spring.jpa.hibernate.ddl-auto = update

goodluck

4 голосов
/ 12 мая 2018

Я получил подсказку от Самана Салехи выше.Мой пример использования: подготовка REST-приложения для балансировки нагрузки на стороне клиента (запуск двух экземпляров JVM REST).Здесь мое MVC-приложение будет вызывать это REST-приложение с ActiveMQ-сервером для данных.У меня возникла проблема, когда я запустил два экземпляра приложения REST в Eclipse и пытался запустить оба экземпляра одновременно со следующей конфигурацией

spring.datasource.url=jdbc:h2:file:./Database;
spring.jpa.properties.hibernate.hbm2ddl.auto=update

После добавления DB_CLOSE_ON_EXIT = FALSE; AUTO_SERVER = TRUE

spring.datasource.url=jdbc:h2:file:./Database;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

Оба экземпляра запущены и отображаются на информационной панели Eureka.

Не закрывайте базу данных при выходе из виртуальной машины: jdbc: h2:; DB_CLOSE_ON_EXIT = FALSE

Доступ к нескольким процессамта же база данных без необходимости запуска сервера вручную; AUTO_SERVER = TRUE

Дополнительная информация: http://www.h2database.com/html/features.html

4 голосов
/ 14 июня 2017

Простой шаг: зайдите в диспетчер задач и убейте процесс Java

тогда начните свою заявку

3 голосов
/ 12 марта 2018

Вы также можете удалить файл из базы данных h2, и проблема исчезнет.

jdbc: h2: ~ / dbname означает, что файл базы данных h2 с именем db name будет создан в домашнем каталоге пользователя (~ / означает домашний каталог пользователя, надеюсь, вы работаете в Linux).

На моем локальном компьютере он присутствует в: /home/jack/dbname.mv.db. Я не знаю, почему файл имеет имя dbname.mv.db вместо dbname. Может быть, это настройки h2 по умолчанию. Я удаляю этот файл:

rm ~/dbname.mv.db 

ИЛИ:

cd ~/ 
rm dbname.mv.db 

База данных dbname будет удалена со всеми данными. После новой базы данных init все будет хорошо.

1 голос
/ 16 декабря 2016

Столкнулся с аналогичной проблемой, для меня решение состояло в том, чтобы запустить fuser -k 'filename.db' для файла, с которым была связана блокировка.

Надеюсь, это поможет!

1 голос
/ 17 августа 2016

Я столкнулся с похожими проблемами при работе с ORMLite из веб-приложения. Я изначально застрял в синтаксисе, чтобы использовать режим сервера в URL. Ответы выше помогли с этим. Тогда у меня была похожая ошибка пользователя / пароля, которую было легче выяснить. Мне не нужно было ничего закрывать или стирать файлы. Сработал следующий код:

protected ConnectionSource getConnectionSource() throws SQLException {
    String databaseUrl = "jdbc:h2:tcp://localhost/~/test";
    return new JdbcConnectionSource(databaseUrl,"sa","sa");
}

Чтобы использовать H2 в режиме сервера на wildfly, я изменил URL-адрес соединения в standalone.xml

<datasource jndi-name="java:jboss/datasources/ExampleDS" pool- name="ExampleDS" enabled="true" use-java-context="true">
     <connection-url>jdbc:h2:tcp://localhost/~/test</connection-url>
               …
</datasource>
...