如何使用 JDBC 在 spring-session 中初始化模式

Posted

技术标签:

【中文标题】如何使用 JDBC 在 spring-session 中初始化模式【英文标题】:How to initialize schema in spring-session with JDBC 【发布时间】:2018-12-17 21:22:43 【问题描述】:

我在 mysql 5.7 中使用 Spring Boot 2.0.x、Hibernate 和 Spring Session Jdbc。 我在开发环境下工作,所以 Hibernate 被配置为每次都生成模式:

spring.jpa.hibernate.ddl-auto=create-drop

它工作正常,但我对 Spring Session 有疑问...... 我尝试设置initialize-schema,但它不起作用。

spring.session.jdbc.initialize-schema=always

是否可以自动生成完整架构(所有实体和 SPRING_SESSION)?

它不适用于 MySQL 和 H2(我尝试了 embedded 选项)

【问题讨论】:

您找到解决方案了吗?我将 2.2.7.RELEASE 与 spring.session.jdbc.initialize-schema=alwaysspring.session.store-type=jdbc 一起使用,并且没有创建表。 @theGirrafish 不,但我没有尝试新版本的 spring-session。也许它已经被修复了...... 【参考方案1】:

我正在描述这些步骤。它对我有用。

1- 在你的 pom 文件中添加依赖。

<dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-jdbc</artifactId>
    </dependency>

2-在“resources”文件下添加同路径同名的sql文件。

路径:/org/springframework/session/jdbc/schema-mysql.sql

schema-mysql.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)
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;

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 BLOB 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
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;

我从spring github官方账号得到了sql文件。

https://github.com/spring-projects/spring-session/blob/master/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc/schema-mysql.sql

3-将以下属性添加到 application.properties

spring.session.jdbc.initialize-schema=always
spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-mysql.sql

如果它再次不起作用,请告诉我。就像我说的,它对我有用。

【讨论】:

我在 mysql 中有架构,我知道如何连接等。Hibernate dll-auto=create-drop 工作正常。我对spring.session.jdbc.initialize-schema=always 有疑问,因为它不会在应用程序启动时初始化 SPRING_SESSION 表。有可能吗? 您使用的是哪个版本的 Spring Boot? 我用的是 2.0.4.RELEASE 我用的是 2.0.6.RELEASE,但它不起作用...spring.session.jdbc.initialize-schema=alwaysspring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-mysql.sqlspring.jpa.hibernate.ddl-auto=create-dropspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect 你的休眠方言是 MySQL57Dialect。你确定这是真的吗?据我所知,它是 MySQLDialect。如果可能,只需在 db 中使用 SQL“创建模式示例”创建一个空模式;一次代码,而不是每次都会更新它。您打开和关闭了您将不再创建的项目。如果发生故障,您能否更新问题?【参考方案2】:

application.properties 中尝试此设置

spring.session.store-type=jdbc
spring.session.jdbc.initialize-schema=always //spring will create required tables for us
spring.session.timeout.seconds=900

【讨论】:

以上是关于如何使用 JDBC 在 spring-session 中初始化模式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JDBC 源在 (Pyspark?

如何在 jmeter 中关闭 JDBC 连接

如何使用 jdbc 在 teradata 上获取表创建脚本?

如何在 Google AppEngine 上使用 JDBC

如何在spring jdbc中使用数组

如何使用 JDBC 创建事务性 DAO