带有 JDBC 配置的 Spring-Session:表 'test.spring_session' 不存在
Posted
技术标签:
【中文标题】带有 JDBC 配置的 Spring-Session:表 \'test.spring_session\' 不存在【英文标题】:Spring-Session with JDBC configuration: Table 'test.spring_session' doesn't exist带有 JDBC 配置的 Spring-Session:表 'test.spring_session' 不存在 【发布时间】:2016-09-20 19:13:43 【问题描述】:我尝试运行 this example,但不使用 Redis,而是使用本地 mysql 服务器。
我已经像这样编辑了这个 Spring Boot 应用程序:
Gradle:
buildscript
repositories
mavenCentral()
dependencies
classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion")
apply plugin: 'spring-boot'
apply from: JAVA_GRADLE
//this 'if' statement is because I was getting error: Execution failed for task ':samples:findbyusername:findMainClass'.
//> Could not find property 'main' on task ':samples:findbyusername:run'.
if (!hasProperty('mainClass'))
ext.mainClass = 'sample.FindByUsernameApplication'
tasks.findByPath("artifactoryPublish")?.enabled = false
group = 'samples'
dependencies
compile("org.springframework.boot:spring-boot-starter-jdbc:$springBootVersion")
compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.2'
compile group: 'org.springframework.session', name: 'spring-session', version: '1.2.0.RELEASE'
compile project(':spring-session'),
"org.springframework.boot:spring-boot-starter-web",
"org.springframework.boot:spring-boot-starter-thymeleaf",
"nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect",
"org.springframework.security:spring-security-web:$springSecurityVersion",
"org.springframework.security:spring-security-config:$springSecurityVersion",
"com.maxmind.geoip2:geoip2:2.3.1",
"org.apache.httpcomponents:httpclient"
testCompile "org.springframework.boot:spring-boot-starter-test",
"org.assertj:assertj-core:$assertjVersion"
integrationTestCompile gebDependencies,
"org.spockframework:spock-spring:$spockVersion"
def reservePort()
def socket = new ServerSocket(0)
def result = socket.localPort
socket.close()
result
application.properties
spring.datasource.url = jdbc:mysql://localhost:3306/TEST?characterEncoding=UTF-8&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=but
spring.thymeleaf.cache=false
spring.template.cache=false
HttpSessionConfig.java
@EnableJdbcHttpSession // <1>
public class HttpSessionConfig
应用程序在 tomcat 上启动,但是当我在浏览器中点击 localhost 时,我得到:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Mon May 23 21:14:31 CEST 2016
There was an unexpected error (type=Internal Server Error, status=500).
PreparedStatementCallback; bad SQL grammar [INSERT INTO SPRING_SESSION(SESSION_ID, CREATION_TIME, LAST_ACCESS_TIME, MAX_INACTIVE_INTERVAL, PRINCIPAL_NAME) VALUES (?, ?, ?, ?, ?)]; nested exception is java.sql.SQLSyntaxErrorException: Table 'test.spring_session' doesn't exist
我不记得读过有关手动创建此表的任何内容,所以我认为 spring 会为我处理它...
编辑: 我实际上尝试了manually create tables,然后应用程序运行正常。但我想我不应该手动执行此操作。
【问题讨论】:
我认为您必须手动创建它们。例如,这里的文档有一个脚本来设置它正在使用的嵌入式数据库中的表:docs.spring.io/spring-session/docs/current/reference/html5/… 【参考方案1】:Spring Session 附带了大多数主要 RDBMS 的数据库模式脚本(位于 org.springframework.session.jdbc
包中),但为 Spring Session JDBC 支持创建数据库表需要用户自己处理。
提供的脚本可以原封不动地使用,但是一些用户可能会选择修改它们以满足他们的特定需求,使用提供的脚本作为参考。
一种选择是使用数据库迁移工具(例如 Flyway)来处理数据库表的创建。
由于您使用的是 Spring Boot,您可能感兴趣的是有一个待处理的 PR 来添加对 Spring Session JDBC 模式的自动初始化的支持:https://github.com/spring-projects/spring-boot/pull/5879
如果文档误导您认为表应该由 Spring Session 本身自动创建,请考虑报告问题,以便我们在必要时更新文档:https://github.com/spring-projects/spring-session/issues
【讨论】:
我经常忘记这个回到这里,只是说“哈!”然后去创建我的表。【参考方案2】:至少到目前为止,您不必手动创建表。
在我的测试中,当该文件如上所示时,将以下行添加到文件 application.properties 后自动创建表。
spring.session.jdbc.initialize-schema=always
我从下面的 *** 页面中找到了这条漂亮的线。
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.spring_session' doesn't exist - Spring Boot
很抱歉,我不知道是否需要在 2016 年或 2017 年手动创建表。当我了解这一点或获得一些更有成效的相关信息时,我会更新这个答案。我只是希望没有人会认为使用 2019 或更高版本的最新 Spring Framework 版本是不可能自动创建会话表的。
【讨论】:
【参考方案3】:spring.session.jdbc.initialize-schema=一直为我工作
【讨论】:
一个值得信赖的解决方案总是一个很好的答案,但 OP 也需要一个建议以上是关于带有 JDBC 配置的 Spring-Session:表 'test.spring_session' 不存在的主要内容,如果未能解决你的问题,请参考以下文章
带有忽略大小写的 JDBC URL 不适用于 H2 数据库连接
使用 Hibernate、Spring 和 JDBC 配置 SSL 证书