微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将持久 SQL 命令执行到 h2db 中时出现 H2 JDBC 语法错误

如何解决将持久 SQL 命令执行到 h2db 中时出现 H2 JDBC 语法错误

我的应用程序使用 Java + jOOQ + H2DB。 我创建了两个 Threads 以继续执行。

线程1:向表A中连续插入记录

线程2:从表A中选择10000条连续记录的限制

当我运行我的应用程序时,有时会抛出 org.h2.jdbc.JdbcsqlSyntaxErrorExceptionsql 语句被一些字符改变了PUBLIC.SCENAR ऀ☀䙉O_EXECUTE_LOG

org.h2.jdbc.JdbcsqlSyntaxErrorException: Column "PUBLIC.SCENAR  ऀ☀䙉O_EXECUTE_LOG.TOTAL_RUNNING_TIME" not found; sql statement:
select "PUBLIC"."SCENARIO_EXECUTE_LOG"."LOG_SEQ","PUBLIC"."SCENARIO_EXECUTE_LOG"."USER_ID","PUBLIC"."SCENARIO_EXECUTE_LOG"."EXECUTE_DIV","PUBLIC"."SCENARIO_EXECUTE_LOG"."EXECUTE_SCENARIO_ID","PUBLIC"."SCENARIO_EXECUTE_LOG"."EXECUTE_START_TIME_UTC","PUBLIC"."SCENARIO_EXECUTE_LOG"."EXECUTE_END_TIME_UTC","PUBLIC"."SCENARIO_EXECUTE_LOG"."EXECUTE_START_TIME_LOCAL","PUBLIC"."SCENARIO_EXECUTE_LOG"."EXECUTE_END_TIME_LOCAL","PUBLIC"."SCENAR  ऀ☀䙉O_EXECUTE_LOG"."TOTAL_RUNNING_TIME","PUBLIC"."SCENARIO_EXECUTE_LOG"."LOG_FOLDER_NAME","PUBLIC"."SCENARIO_EXECUTE_LOG"."RESULT_DIV" from "PUBLIC"."SCENARIO_EXECUTE_LOG" where "PUBLIC"."SCENARIO_EXECUTE_LOG"."LOG_SEQ" = cast(? as int) for  [42122-199]
    at org.h2.message.DbException.getJdbcsqlException(DbException.java:451)
    at org.h2.message.DbException.getJdbcsqlException(DbException.java:427)
    at org.h2.message.DbException.get(DbException.java:205)
    at org.h2.message.DbException.get(DbException.java:181)
    at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:176)
    at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:158)
    at org.h2.command.dml.Select.prepare(Select.java:1245)
    at org.h2.command.Parser.prepareCommand(Parser.java:689)
    at org.h2.engine.Session.prepareLocal(Session.java:627)
    at org.h2.server.TcpserverThread.process(TcpserverThread.java:270)
    at org.h2.server.TcpserverThread.run(TcpserverThread.java:175)
    at java.base/java.lang.Thread.run(Thread.java:844)

相反,它是PUBLIC.SCENARIO_EXECUTE_LOG

如果我只运行线程 1 或线程 2,则不会出现此错误

这个错误是从哪里产生的?

更新:

辅助类

    private static Connection h2Connection;
    private static DSLContext dslContext;
    private static Server server;


    public static DSLContext getDSLContext() throws Exception {
        if (dslContext == null) {
            dslContext = new DefaultDSLContext(getConnection(),sqlDialect.H2,settings);
        }
        return dslContext;
    }

    private static Connection getConnection() throws Exception {
        if (h2Connection == null) {
            Class.forName("org.h2.Driver");
            String url = String.format("jdbc:h2:tcp://localhost/%s;",(DB_PATH.isEmpty() ? OUTPUT_PATH + folderPath + H2DB_PATH : DB_PATH)) +
                    String.format("USER=%s;",USER_NAME) +
                    String.format("PASSWORD=%s;",PASSWORD);

            System.setProperty("java.net.useSystemProxies","false");
            server = Server.createTcpserver("-tcpAllowOthers").start();
            System.setProperty("java.net.useSystemProxies","true");
            try {
                h2Connection = new JdbcConnection(url,new Properties());
                return h2Connection;
            } catch (Exception ex) {
                log.error("Error fetching connection",ex);
                throw ex;
            }
        }
        return h2Connection;
    }

主类

Thread insertExecuteLog = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) {
        try {
            Random random = new Random();
            scenarioExecuteLogRecordInsert.setLogSeq(random.nextInt(10000000 - 4000000) + 4000000);
            JooqScenarioExecuteLogHelper.insertExecuteLog(scenarioExecuteLogRecordInsert);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
});

Thread getExecuteLog = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) {
        try {
            ScenarioExecuteLogRecord[] listScenarioExecuteLog2 = JooqScenarioExecuteLogHelper.getListScenarioExecuteLog();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
});

insertExecuteLog.start();
getExecuteLog.start();

sql

public static ScenarioExecuteLogRecord[] getListScenarioExecuteLog(){
    DSLContext dslContext = JooqRpaSysDBHelper.getDSLContext();
    return dslContext.selectFrom(SCENARIO_EXECUTE_LOG)
        .orderBy(SCENARIO_EXECUTE_LOG.LOG_SEQ)
        .limit(10000)
        .fetchArray();
}

public static void insertExecuteLog(ScenarioExecuteLogRecord scenarioExecuteLogRecord){
    DSLContext dslContext = JooqRpaSysDBHelper.getDSLContext();
    dslContext.insertInto(SCENARIO_EXECUTE_LOG)
        .set(SCENARIO_EXECUTE_LOG.LOG_SEQ,scenarioExecuteLogRecord.getLogSeq())
        .set(SCENARIO_EXECUTE_LOG.USER_ID,scenarioExecuteLogRecord.getUserId())
        .set(SCENARIO_EXECUTE_LOG.EXECUTE_DIV,scenarioExecuteLogRecord.getExecuteDiv())
        .execute();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。