【问题标题】:Spring Boot - Web app is unable to stop MVStore writer threadSpring Boot - Web 应用程序无法停止 MVStore 编写器线程
【发布时间】:2018-07-15 08:33:40
【问题描述】:

我在我的 Spring Boot 应用程序中使用了一个嵌入式 H2 数据库,但是在每次关闭时,数据库都没有按照我在 application.properties 中的配置正确关闭/删除。这是我关闭应用程序时出现的错误:

2018-02-05 13:00:37.360 WARN  [localhost-startStop-2] [WebappClassLoaderBase] 
     The web application [ROOT] appears to have started a 
     thread named [MVStore background writer nio:C:/Users/user/testdb.mv.db] but has failed to stop it. 
     This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 org.h2.mvstore.MVStore$BackgroundWriterThread.run(MVStore.java:2715)

效果是文件 testdb.mv 保留在我的用户目录中,并且在随后的启动中我得到 ​​p>

org.h2.jdbc.JdbcSQLException: Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.USERS(ID)"; SQL statement:
INSERT INTO Users (id,first_name,last_name) VALUES (1,'Vincent', 'Vega') [23505-196]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:179)

这是在启动时运行的data.sql 脚本

INSERT INTO Users (id,first_name,last_name) VALUES (1,'Vincent', 'Vega');

这是定义@Table("Users")User实体

@Entity
@Table(name="Users")
public class User 
{
    @Id
    @GeneratedValue
    private long id;

    @Column(name="first_name")
    private String firstName;

    @Column(name="last_name")
    private String lastName;
    /* getters and setters */
}

这些是application.properties中的h2相关配置

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=none 
spring.jpa.database=H2
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.show-sql=true
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:~/testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE
spring.datasource.name=testdb
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

感谢您的帮助

【问题讨论】:

    标签: java spring hibernate spring-data-jpa h2


    【解决方案1】:

    您正在组合DB_CLOSE_DELAY=-1,它告诉数据库不要自动关闭,以及DB_CLOSE_ON_EXIT=TRUE。如果您想拥有一个带有 H2 的持久数据库,请将其更改为 DB_CLOSE_ON_EXIT=FALSE

    【讨论】:

    • 我尝试使用spring.datasource.url=jdbc:h2:~/testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE,“无法关闭线程”错误消失了,但唯一索引错误仍然存​​在。当我手动删除testdb.mv 文件时,它可以工作。
    • 发生这种情况是因为您有一个 data.sql,Spring Boot 使用它来初始化数据,但每次启动应用程序时它都会运行。这对于用于测试目的的内存数据库很有用,在每次启动时都会重新创建。但是您希望拥有一个持久数据库(这不是 h2 的主要用例),并且您需要一种不同的方法来初始化数据(liquibase、flyway ..)
    • 我正在尝试连接 MySQL,这些配置没有帮助,还需要其他配置吗?
    【解决方案2】:

    就我而言:

    配置文件,application.properties,这个配置:

    server.ssl.key-alias=***
    server.ssl.key-store-password=****
    

    不正确,控制台没有显示具体的错误。?

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      相关资源
      最近更新 更多