找不到数据库“C:/data/sample”,并且 IFEXISTS=true,所以我们无法自动创建它 - Spring Boot 中的错误
Posted
技术标签:
【中文标题】找不到数据库“C:/data/sample”,并且 IFEXISTS=true,所以我们无法自动创建它 - Spring Boot 中的错误【英文标题】:Database "C:/data/sample" not found, and IFEXISTS=true, so we cant auto-create it - Error in Spring Boot 【发布时间】:2019-10-09 06:39:59 【问题描述】:我创建了一个 spring boot 应用程序来连接 h2 数据库。这样做时,它会抛出一个错误,显示找不到数据库。请帮助我解决我可以实施和解决问题的解决方案。
我在 pom.xml 文件中添加了 com.h2database 依赖,然后它也给出了错误。
下面是我的 pom.xml 文件和 application.properties 文件
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>santanderdbproj</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>firstproject</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
application.properties
spring.datasource.url = jdbc:h2:file:C:/data/sample
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.h2.console.path=/h2
我附上了下面的错误图片,请参考。
【问题讨论】:
您是否在嵌入到 Spring 的 H2 控制台中看到此错误?由于安全原因,从 1.4.198 开始默认不再允许创建数据库,您需要先在应用程序中创建数据库。如果您在应用程序的堆栈跟踪中看到此错误,请在此处发布。 在 localhost 上运行应用程序时出现网页错误。当我单击连接按钮时,它会引发错误。我已经更新了问题并附上了错误页面的图片链接,请查看。 @EvgenijRyazanov 我是使用初始化程序创建的引导项目 - 这个链接帮助我而不是 application.properties 我更改了 application.yml 并粘贴了以下链接。(***.com/questions/56209686/…)并且不要忘记删除数据库名称末尾的分号。 【参考方案1】:这是仅在 1.4.198 和 1.4.199 中出现的错误错误消息。 H2 的下一个版本(1.4.200)将显示更好的消息,例如
数据库...未找到,请预先创建或允许远程创建数据库(不推荐在安全环境中使用)
您看到此错误消息是因为您的数据库还不存在。解决问题的常规方法是先使用您的应用程序创建数据库,然后再尝试使用 H2 控制台登录。
H2 控制台可以配置为允许创建数据库,但它可能会在您的系统中创建一个安全漏洞,任何可以打开此页面的人都可以在此类配置中使用您的访问权限对您的系统进行任何操作。
请注意,H2 从系统托盘中的图标启动浏览器会话中的 H2 控制台(您可以简单地将 h2-1.4.199 jar 作为 Java 应用程序启动,或使用 java -jar h2-1.4.199.jar
)授予您创建新数据库的权限以安全的方式。您可以将其用于此目的。如果您不打算将其用作 TCP 服务器,请在创建数据库后从系统托盘图标中将其关闭,以确保它不保存您的数据库。您还可以使用命令行 Shell 工具:
https://h2database.com/html/tutorial.html#creating_new_databases
Spring 的 H2 控制台不具备此类功能。
旧版本的 H2(最高 1.4.197)也允许创建数据库,包括来自 Spring 的控制台,但是,它再次在您的系统中创建了一个安全漏洞。
【讨论】:
【参考方案2】:您可能错过了指定版本,请在您的 pom.xml 中添加此依赖项 这会工作
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.193</version>
</dependency>
如果上述步骤没有解决问题,请尝试将控制台中的 JDBC URL 更改为以下 URL
jdbc:h2:mem:testdb
【讨论】:
【参考方案3】:将下面的 db 版本添加到 maven 依赖项中,为我解决了这个问题。
<version>1.4.193</version>
【讨论】:
【参考方案4】:覆盖 h2 数据库依赖的版本对我有用
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
<version>1.4.193</version>
</dependency>
【讨论】:
【参考方案5】:我们想从 1.4.193 升级到 1.4.200,所以不,将版本设置为 1.4.193 对我们来说不是正确的解决方案。我们可以选择在我们的进程中启动 TCP 服务器,所以我从接受的答案中读取了链接:https://h2database.com/html/tutorial.html#creating_new_databases
按照建议(实际上,出于安全原因并未建议,但我们接受了风险),我在 Server.createTcpServer(...)
调用中添加了 -ifNotExists
参数,问题已为我们解决。
【讨论】:
【参考方案6】:a) 尝试在 application.properties 中提供 spring.datasource.url=jdbc:h2:mem:testdb b) 确保您使用 jdbc:h2:mem:testdb 作为 H2 控制台中的数据库 URL
【讨论】:
【参考方案7】:您可以在属性文件中添加数据库配置。
server:
port: 9092
spring:
h2:
console:
enabled: true
datasource:
url: jdbc:h2:mem:testdb;
username: sa
password:
driver-class-name: org.h2.Driver
platform: h2
【讨论】:
【参考方案8】:仅通过添加上述答案中提到的版本并没有解决我的问题以及我还在配置下面添加的 h2 版本来解决问题
我在 pom.xml 中为 H2 依赖项添加了以下版本
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.193</version>
</dependency>
并在 application.properties 文件中添加下面的配置
spring.h2.console.enabled=true
spring.datasource.platform=h2
spring.datasource.driverClassName = org.h2.Driver
spring.datasource.url=jdbc:h2:file:~/test;
spring.datasource.username=sa
spring.datasource.password=
【讨论】:
【参考方案9】:另一种选择,您也可以在日志中获取正确的 JDBC url。 示例日志 o.s.b.a.h2.H2ConsoleAutoConfiguration :H2 控制台在“/h2-console”中可用。 数据库位于 'jdbc:h2:mem:testDb'
注意:要启用 h2 日志,请在 application.properties 文件中添加以下内容
spring.h2.console.enabled=true
【讨论】:
以上是关于找不到数据库“C:/data/sample”,并且 IFEXISTS=true,所以我们无法自动创建它 - Spring Boot 中的错误的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate 5.1.0 错误无法执行解组并且找不到元素“休眠配置”的声明
make: *** 没有指明目标并且找不到 makefile。