Подтвердить что ты не робот

Ошибка базы данных H2: база данных может быть уже использована: "Заблокировано другим процессом"

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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. Honesetly, это довольно прямолинейно в документации.

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

Ответ 2

Я использую 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

Ответ 3

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

Ответ 4

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

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

Чтобы использовать H2 в режиме сервера на wildfly, я Modifed connection-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>

Ответ 5

У меня была та же проблема. в 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

Гудлак

Ответ 6

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

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

Ответ 7

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

затем запустите приложение.