未找到数据库 "C:/data/sample",并且 IFEXISTS=true,因此我们无法自动创建它 - Spring 启动时出错

Database "C:/data/sample" not found, and IFEXISTS=true, so we cant auto-create it - Error in Spring Boot

我创建了一个 spring 启动应用程序来连接 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

下面附上错误图片,请参考。

这是一条仅在 1.4.198 和 1.4.199 中出现的错误消息。下一版本的 H2 (1.4.200) 将显示更好的消息,如

Database … not found, either pre-create it or allow remote database creation (not recommended in secure environments)

您看到此错误消息是因为您的数据库尚不存在。解决问题的正常方法是先使用您的应用程序创建数据库,然后再尝试使用 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 的控制台,但是,同样,它会在您的系统中创建一个安全漏洞。

您可能没有指定版本,请在您的 pom.xml 中添加此依赖项 这会起作用

<dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.193</version>
</dependency>

如果上述步骤没有解决问题,请尝试将控制台中的 JDBC URL 更改为 URL

以下
jdbc:h2:mem:testdb

将如下所示的数据库版本添加到 Maven 依赖项中,为我解决了这个问题。

<version>1.4.193</version>

覆盖 h2 数据库依赖项的版本对我有用

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
    <version>1.4.193</version>
</dependency>

我们想从 1.4.193 升级到 1.4.200,所以不行,将版本设置为 1.4.193 对我们来说不是正确的解决方案。我们有选择地在我们的进程中启动 TCP 服务器,所以我从接受的答案中读取了 link:https://h2database.com/html/tutorial.html#creating_new_databases

按照建议(实际上,出于安全原因不建议,但我们接受了风险),我在 Server.createTcpServer(...) 调用中添加了 -ifNotExists 参数,问题已为我们解决。

a) 尝试给出 spring.datasource.url=jdbc:h2:mem:testdb - 在 application.properties b) 确保您在 H2 控制台

中使用 jdbc:h2:mem:testdb 作为数据库 URL

您可以在 属性 文件中添加数据库配置。

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

仅仅通过添加上述答案中提到的版本并没有解决我的问题,我还在配置下面添加了 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=

只是替代方案,您也可以在日志 中获得正确的 JDBC url。 示例日志 o.s.b.a.h2.H2ConsoleAutoConfiguration :H2 控制台在“/h2-console”可用。 数据库位于 'jdbc:h2:mem:testDb'

注意 :要启用 h2 日志,请在 application.properties 文件

中添加以下内容

spring.h2.console.enabled=true

访问 localhost:8080/h2-console 后,检查 url。一般是pre-populated。我删除了它并输入了我在 application.properties 文件中使用的相同 url。

spring.datasource.url=jdbc:h2:mem:testdb

除此之外,在 pom.xml 文件中将版本添加到 h2 依赖项可能会有用。

Follow the steps given here and you're good to go.