Spring Session配置后频繁触发ORA-00942:表或视图不存在错误求助
问题描述
本人是Spring和Java新手,尝试配置Spring Session实现会话管理,但遇到问题。环境及配置如下:
- 服务器:JBoss
- 数据库:Oracle
- 通过JNDI配置数据源,
application.properties内容:
spring.datasource.jndi-name = java:jboss/OracleDatabaseInstance spring.h2.console.enabled=true spring.session.store-type=jdbc spring.session.jdbc.initialize-schema=always spring.session.timeout.seconds=900
- pom.xml中已排除MySQL相关依赖,其余代码参考常规Spring Session指南实现。
运行后页面空白,服务器每分钟频繁输出以下错误日志:
Caused by: Error : 942, Position : 12, Sql = DELETE FROM SPRING_SESSION WHERE EXPIRY_TIME < :1 , OriginalSql = DELETE FROM SPRING_SESSION WHERE EXPIRY_TIME < ?, Error Msg = ORA-00942: table or view does not exist ...................... 2023-08-10 06:28:00,012 ERROR [org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler] (pool-30-thread-1) Unexpected error occurred in scheduled task: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [DELETE FROM SPRING_SESSION WHERE EXPIRY_TIME < ?]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
错误成因分析
Spring Session未自动执行Oracle专用建表脚本:
你设置了spring.session.jdbc.initialize-schema=always,但Spring Session默认只自动加载H2、MySQL等常见数据库的初始化脚本,Oracle需要单独的建表语句。框架不会自动适配Oracle,导致SPRING_SESSION和SPRING_SESSION_ATTRIBUTES这两张会话存储必需的表没有被创建,定时清理过期会话的任务执行时自然会报“表不存在”的错误。JNDI数据源对应的数据库账号无建表权限:
你使用的JNDI数据源java:jboss/OracleDatabaseInstance,如果其关联的Oracle数据库账号没有CREATE TABLE的权限,就算Spring尝试执行初始化脚本,也会因为权限不足创建失败,最终还是会出现表不存在的问题。页面空白的关联原因:
页面空白是因为会话管理模块初始化失败,请求处理流程中抛出未捕获的异常,前端无法获取有效响应内容导致的。
内容的提问来源于stack exchange,提问作者Kmus
相关产品推荐
相关产品推荐

