如何使用 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=always
和 spring.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=always
spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-mysql.sql
spring.jpa.hibernate.ddl-auto=create-drop
spring.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 中初始化模式的主要内容,如果未能解决你的问题,请参考以下文章