#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, которая является адресом СУБД, которая прослушивает входящие соединения.