You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin+Spring Boot集成JDBC Session引发持续重启循环求助

解决Vaadin + Spring Session JDBC 应用持续重启循环问题

问题根源分析

  • Spring Session JDBC的自动配置会覆盖Vaadin默认会话管理机制,导致会话状态频繁变更触发Spring Boot DevTools重启(若启用)
  • H2数据库文件模式配置不当,数据库文件频繁修改触发DevTools文件监控重启
  • Spring Session JDBC表初始化逻辑与Vaadin会话存储逻辑存在冲突

分步解决方案

1. 调整DevTools重启策略

若使用了Spring Boot DevTools,可直接禁用自动重启:

# application.properties
spring.devtools.restart.enabled=false

如需保留DevTools功能,可排除数据库相关文件的监控:

spring.devtools.restart.exclude=h2/**,*.db

2. 明确配置Spring Session与H2参数

在application.properties中指定会话存储类型、数据库连接方式,避免自动配置冲突:

# 配置Spring Session使用JDBC存储
spring.session.store-type=jdbc
# 确保表初始化完成后再启动应用
spring.session.jdbc.initialize-schema=always
# H2使用内存模式,避免文件变更触发重启
spring.datasource.url=jdbc:h2:mem:sessiondb;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

3. 排除冲突的自动配置类

创建配置类,排除Vaadin与Spring Session冲突的自动配置项:

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration(exclude = SessionAutoConfiguration.class)
public class CustomSessionConfig {
    // 自定义会话管理逻辑
}

4. 手动初始化Spring Session数据库表(可选)

若禁用自动表初始化,可执行以下SQL创建所需表结构:

CREATE TABLE SPRING_SESSION (
    PRIMARY_ID CHAR(36) NOT NULL,
    SESSION_ID CHAR(36) NOT NULL,
    CREATION_TIME BIGINT NOT NULL,
    LAST_ACCESS_TIME BIGINT NOT NULL,
    MAX_INACTIVE_INTERVAL INT NOT NULL,
    EXPIRY_TIME BIGINT NOT NULL,
    PRINCIPAL_NAME VARCHAR(100),
    CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
);

CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME);

CREATE TABLE SPRING_SESSION_ATTRIBUTES (
    SESSION_PRIMARY_ID CHAR(36) NOT NULL,
    ATTRIBUTE_NAME VARCHAR(200) NOT NULL,
    ATTRIBUTE_BYTES BYTEA NOT NULL,
    CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),
    CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
);

5. 验证Vaadin与Spring Session集成

在Vaadin视图中通过HTTP Session存储用户活动数据:

@Route
public class ActivityView extends VerticalLayout {
    public ActivityView() {
        Button saveActivity = new Button("记录活动", event -> {
            HttpSession httpSession = VaadinSession.getCurrent().getSession();
            httpSession.setAttribute("lastActivity", LocalDateTime.now().toString());
        });
        add(saveActivity);
    }
}

额外排查要点

  • 查看应用日志,定位Restarting due to change in...类日志,明确重启触发源
  • 确认版本兼容性:Vaadin 23对应Spring Boot 2.7.x,Vaadin 24对应Spring Boot 3.x
  • 简化依赖:若无需JPA完整功能,将spring-boot-starter-data-jpa替换为spring-boot-starter-jdbc,减少自动配置冲突

内容的提问来源于stack exchange,提问作者Shubham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:22:55