【问题标题】:Automatic schema creation for quartz and mysql fails with MySQLSyntaxException石英和 mysql 的自动模式创建失败并出现 MySQLSyntaxException
【发布时间】:2018-06-11 08:23:51
【问题描述】:

我有一个运行 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 附近使用正确的语法 存在 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-connector-java:5.1.46
  • org.quartz-scheduler:quartz:2.3.0

【问题讨论】:

  • 好像和this有关。

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


【解决方案1】:

将以下属性添加到您的配置中,以指定注释字符:

spring.quartz.jdbc.comment-prefix=#

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      有一个解决方法:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 问题是SQL有一个分号,在CLI中用于分隔语句是有效的,但是在JDBC中是不允许的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        • 2021-03-09
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2019-07-27
        相关资源
        最近更新 更多