为什么带有嵌入式 H2 的 Spring Boot 会抛出“org.h2.message.DbException”错误?

Ava*_*lor 2 java spring h2 spring-boot

我正在 MacBook 上使用 Eclipse/STS 做一个简单的 Spring Boot 和嵌入式 H2 教程。

当我仅使用 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
Run Code Online (Sandbox Code Playgroud)

但是我想将数据库持久化到一个文件中(这样应用程序关闭时数据就不会丢失)。

当我进行此更改以将 DB 写入磁盘时:

spring.datasource.url=jdbc:h2:file:/data/demo
Run Code Online (Sandbox Code Playgroud)

我在启动时收到此错误:

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]
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

堆栈跟踪中的更多详细信息:

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
Run Code Online (Sandbox Code Playgroud)

Ava*_*lor 5

解决方案是我需要.这样的./data/demo

spring.datasource.url=jdbc:h2:file:./data/demo
Run Code Online (Sandbox Code Playgroud)

  • 请注意:“./”表示此后的目录或文件相对于应用程序的“当前工作目录”。对于嵌入式数据库(通常使用 H2,至少在 Spring 中),这应该没问题。对于专用数据库,您将拥有一个完全限定的 JDBC 字符串,它是正在侦听传入连接的 DBMS 的地址。 (5认同)