如何解决将持久 SQL 命令执行到 h2db 中时出现 H2 JDBC 语法错误
我的应用程序使用 Java + jOOQ + H2DB。
我创建了两个 Threads
以继续执行。
线程1:向表A中连续插入记录
线程2:从表A中选择10000条连续记录的限制
当我运行我的应用程序时,有时会抛出 org.h2.jdbc.JdbcsqlSyntaxErrorException
,
sql 语句被一些字符改变了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();
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 举报,一经查实,本站将立刻删除。