Почему Spring Boot со встроенным H2 выдает ‘org.h2.message.Ошибка DbException?

#java #spring #spring-boot #h2

#java #spring #spring-boot #h2

Вопрос:

Я делаю простой учебник по Spring Boot amp; embedded H2 с Eclipse / STS на MacBook.

Он отлично работает, когда я использую H2 только в качестве памяти, мой application.properties файл выглядит так:

 spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
  

Но я хочу сохранить базу данных в файле (чтобы данные не терялись при завершении работы приложения).

Когда я вношу это изменение для записи DB на диск:

 spring.datasource.url=jdbc:h2:file:/data/demo
  

Я получаю эту ошибку при запуске:

 org.h2.message.DbException: Log file error: "/data/demo.trace.db", cause: "org.h2.message.DbException: Error while creating file ""/data"" [90062-200]" [90034-200]
  

Что я делаю не так?

Более подробная информация из трассировки стека:

 2020-11-09 12:33:24.246  INFO 15139 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
org.h2.message.DbException: Log file error: "/data/demo.trace.db", cause: "org.h2.message.DbException: Error while creating file ""/data"" [90062-200]" [90034-200]
org.h2.message.DbException: Log file error: "/data/demo.trace.db", cause: "org.h2.message.DbException: Error while creating file ""/data"" [90062-200]" [90034-200]
    at org.h2.message.DbException.get(DbException.java:194)
    at org.h2.message.TraceSystem.logWritingError(TraceSystem.java:294)

[...]

Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Log file error: "/data/demo.trace.db", cause: "org.h2.message.DbException: Error while creating file ""/data"" [90062-200]" [90034-200]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:505)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
    ... 92 more
Caused by: org.h2.message.DbException: Error while creating file "/data" [90062-200]
    at org.h2.message.DbException.get(DbException.java:205)
    at org.h2.message.DbException.get(DbException.java:181)
    at org.h2.store.fs.FilePathDisk.createDirectory(FilePathDisk.java:290)
    at org.h2.store.fs.FileUtils.createDirectory(FileUtils.java:43)
    at org.h2.store.fs.FileUtils.createDirectories(FileUtils.java:315)
    at org.h2.message.TraceSystem.openWriter(TraceSystem.java:305)
    ... 89 more
Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Error while creating file "/data" [90062-200]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:505)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
    ... 95 more
  

Комментарии:

1. На первый взгляд, похоже на некоторую проблему с разрешениями для записи файла на диск.

2. Вы абсолютно уверены, что хотите записать /data/demo , а не, например ./data/demo , (обратите внимание на . ) или просто data/demo ? Первый попытается выполнить запись в корневой каталог, для которого вашему приложению почти наверняка не хватает необходимых разрешений на запись.

3. Спасибо @DmitriyPopov — ваша идея с разрешениями заставила меня внимательнее присмотреться к каталогам и разрешениям, и оказалось, что проблема заключалась в том, что мне нужно было «./data / demo» с «.».

4. Спасибо @user991710 — вы были правы, проблема заключалась в том, что мне нужно было «./data / demo» с «.» Приветствия.

Ответ №1:

Решение было мне нужно . вот так ./data/demo :

 spring.datasource.url=jdbc:h2:file:./data/demo
  

Комментарии:

1. Просто к сведению: ./ означает, что каталог или файл после этого относятся к текущему рабочему каталогу приложения. Для встроенной базы данных (в качестве которой обычно используется H2, по крайней мере, в Spring) это должно быть нормально. Для выделенной базы данных у вас будет полная строка JDBC, которая является адресом СУБД, которая прослушивает входящие соединения.