使用MySQLSyntaxException,quartz和mysql的自动模式创建失败

时间:2018-06-11 08:23:51

标签: java mysql spring spring-boot quartz-scheduler

我有一个运行mysql数据库的Spring Boot 2应用程序,并希望添加Quartz调度程序。配置:

spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=always

spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false

但是在启动时,它不会创建数据库表,并且在访问QRTZ_ *表时会失败。我进行了调试,以获得我在Spring调用的ScriptUtils类中找到的原因来执行石英脚本tables_mysql_innodv.sql。有意禁止例外:

  

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你有一个   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本,用于在'DROP TABLE IF附近使用正确的语法   EXISTS QRTZ_PAUSED_TRIGGER_GRPS; DROP TABLE IF EXISTS QRTZ_SCHEDUL'at   第9行

我看不到任何语法错误,当我直接在MySQL Workbench中执行相同的脚本时,它运行正常,即创建表等。

已执行的启动脚本的来源可用here。遇到异常in this line。有一个观察让我感到困惑:同一方法中的代码尝试拆分SQL语句,但只提取了2个语句 - 第一行#和剩余的脚本。也许这是实际问题。

那么,我该如何解决这个问题?

版本信息:

  • Spring Boot 2.0.2.RELEASE
  • 的MySQL:MySQL的连接器的Java:46年1月5日
  • org.quartz调度器:石英:2.3.0

4 个答案:

答案 0 :(得分:2)

在配置中添加以下属性,以指定注释字符:

spring.quartz.jdbc.comment-prefix=#

答案 1 :(得分:1)

有一种解决方法:

  1. 复制script file tables_mysql_innodb.sql 到您的资源文件夹 main / resources / org / quartz / impl / jdbcjobstore / tables_mysql_innodb.sql 。这将通过spring boot而不是原始文件来获取。
  2. 删除文件开头的所有注释行。这些是在Spring的ScriptUtils类中解析的有问题的行。

答案 2 :(得分:1)

根据Mouad EL Fakir的建议,在YAML配置属性文件中,我添加了:

   quartz:
      job-store-type: jdbc
      jdbc:
         initialize-schema: always
         comment-prefix: '#'

答案 3 :(得分:-1)

“ScriptUtils.containsSqlScriptDelimiters”方法无法正确解析脚本。 因为 mysql 脚本的注释包含一些单引号。您可以将单引号替换为空白。