quartz 和 mysql 的自动模式创建因 MySQLSyntaxException 而失败
Automatic schema creation for quartz and mysql fails with MySQLSyntaxException
我有一个 Spring Boot 2 应用程序和一个 mysql 数据库 运行 并且想添加 Quartz 调度程序。配置:
spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=always
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false
但是在启动时它不会创建数据库表并且在访问 QRTZ_* 表时会失败。我调试得到我在 ScriptUtils
class 中找到的原因,由 Spring 调用以执行石英脚本 tables_mysql_innodv.sql
。异常被有意抑制:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an
error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'DROP TABLE IF
EXISTS QRTZ_PAUSED_TRIGGER_GRPS; DROP TABLE IF EXISTS QRTZ_SCHEDUL' at
line 9
我看不到任何语法错误,当我直接在 MySQL Workbench 中执行相同的脚本时,它运行良好,即创建表等
执行的启动脚本源码可用here. Exception is encountered in this line。有一个观察结果让我感到困惑:同一方法中的代码试图拆分 SQL 语句,但只提取了 2 个语句——第一行 #
和其余脚本。也许这才是真正的问题。
那么,我该如何解决这个问题?
版本信息:
- Spring 启动 2.0.2.RELEASE
- mysql:mysql-连接器-java:5.1.46
- org.quartz-调度器:quartz:2.3.0
有一个解决方法:
- 复制script filetables_mysql_innodb.sql
到您的资源文件夹 main/resources/org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql。这将由 spring 引导而不是原始文件拾取。
- 删除文件开头的所有注释行。这些是 Spring 的
ScriptUtils
class. 中解析的问题行
将以下 属性 添加到您的配置中,以指定注释字符:
spring.quartz.jdbc.comment-prefix=#
在 YAML 配置属性文件中,按照 Mouad EL Fakir 的建议,我添加了:
quartz:
job-store-type: jdbc
jdbc:
initialize-schema: always
comment-prefix: '#'
方法'ScriptUtils.containsSqlScriptDelimiters' 无法正确解析脚本。
因为 mysql 脚本的注释包含一些单引号。你可以用空白替换单引号。
我有一个 Spring Boot 2 应用程序和一个 mysql 数据库 运行 并且想添加 Quartz 调度程序。配置:
spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=always
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false
但是在启动时它不会创建数据库表并且在访问 QRTZ_* 表时会失败。我调试得到我在 ScriptUtils
class 中找到的原因,由 Spring 调用以执行石英脚本 tables_mysql_innodv.sql
。异常被有意抑制:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; DROP TABLE IF EXISTS QRTZ_SCHEDUL' at line 9
我看不到任何语法错误,当我直接在 MySQL Workbench 中执行相同的脚本时,它运行良好,即创建表等
执行的启动脚本源码可用here. Exception is encountered in this line。有一个观察结果让我感到困惑:同一方法中的代码试图拆分 SQL 语句,但只提取了 2 个语句——第一行 #
和其余脚本。也许这才是真正的问题。
那么,我该如何解决这个问题?
版本信息:
- Spring 启动 2.0.2.RELEASE
- mysql:mysql-连接器-java:5.1.46
- org.quartz-调度器:quartz:2.3.0
有一个解决方法:
- 复制script filetables_mysql_innodb.sql 到您的资源文件夹 main/resources/org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql。这将由 spring 引导而不是原始文件拾取。
- 删除文件开头的所有注释行。这些是 Spring 的
ScriptUtils
class. 中解析的问题行
将以下 属性 添加到您的配置中,以指定注释字符:
spring.quartz.jdbc.comment-prefix=#
在 YAML 配置属性文件中,按照 Mouad EL Fakir 的建议,我添加了:
quartz:
job-store-type: jdbc
jdbc:
initialize-schema: always
comment-prefix: '#'
方法'ScriptUtils.containsSqlScriptDelimiters' 无法正确解析脚本。 因为 mysql 脚本的注释包含一些单引号。你可以用空白替换单引号。