Ошибка базы данных 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?
Ответы
Ответ 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
затем запустите приложение.