有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

quartz和mysql的java自动架构创建因MySQLSyntaxException而失败

我有一个运行mysql数据库的SpringBoot2应用程序,希望添加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类中找到的原因,以执行quartz脚本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。遇到异常in this line。有一个观察结果让我感到困惑:同一方法中的代码试图拆分SQL语句,但只提取了两条语句—第一行#和剩余的脚本。也许这才是真正的问题

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

版本信息:

  • 弹簧靴2.0.2。释放
  • mysql:mysql连接器java:5.1.46
  • 组织。石英调度器:石英:2.3.0

共 (4) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    有一个解决办法:

    1. 复制script file表_mysql_innodb。sql 到您的资源文件夹main/resources/org/quartz/impl/jdbcjobstore/tables\u mysql\u innodb。sql。这将由spring boot而不是原始文件获取
    2. 删除文件开头的所有注释行。这些是Spring的ScriptUtils类中解析的问题行
  3. # 3 楼答案

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

    spring.quartz.jdbc.comment-prefix=#
    
  4. # 4 楼答案

    在YAML配置属性文件中,正如Mouad EL Fakir I所建议的那样:

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