Jooq 不会为失败抛出异常

Posted

技术标签:

【中文标题】Jooq 不会为失败抛出异常【英文标题】:Jooq not throwing exception for failures 【发布时间】:2018-01-29 09:29:54 【问题描述】:

我正在使用 Jooq 将 CSV 数据填充到我的数据库中。 如果我提供 "String Value" 而不是 Int 它不是将值输入数据库,而是平均时间它也没有抛出错误。 我怎么知道上传是否失败。如何处理这些类型的异常。此外,如果我尝试在 int 列中给出字符串,还有什么方法可以检查/抛出警告。

版本:3.8.x

Connection connection = getConnection()
try(Connection connection = getConnection()) 
            DSLContext create = DSL.using(connection, SQLDialect.mysql);

            create.loadInto(Tables.PROCESS_QUEUE_MAP)
                    .loadCSV(new File("/my/folder/testInput.csv"))
                    .fields(Tables.PROCESS_QUEUE_MAP.PROCESS_QUEUE_ID,
                            Tables.PROCESS_QUEUE_MAP.PROCESS_NAME,
                            Tables.PROCESS_QUEUE_MAP.QUEUE_NAME,
                            Tables.PROCESS_QUEUE_MAP.MARKEPTLACE,
                            Tables.PROCESS_QUEUE_MAP.QUEUE_TYPE,
                            Tables.PROCESS_QUEUE_MAP.CREATED_BY,
                            Tables.PROCESS_QUEUE_MAP.CREATED_TIME,
                            Tables.PROCESS_QUEUE_MAP.LAST_MODIFIED_BY,
                            Tables.PROCESS_QUEUE_MAP.LAST_MODIFIED_TIME)
                    .execute();

         catch(Exception ex) 
            ex.printStackTrace();
        
    

【问题讨论】:

【参考方案1】:

使用Loader API 处理一般故障

默认情况下,加载程序 API 会抛出从底层数据库或 JDBC 驱动程序引发的各种异常。这可以通过指定来配置和覆盖:

LoaderOptionsStep.onErrorAbort()(默认) LoaderOptionsStep.onErrorIgnore()

这只影响 JDBC 错误,不影响数据加载“错误”

jOOQ 的自动转换

由于历史原因,在整个 jOOQ API 中,数据类型之间的自动转换是“宽松的”而不是“快速失败的”。所有数据类型转换都通过Convert 实用程序,如果数据类型转换失败,该实用程序将返回null。例如。调用Convert.convert(Object, Class)时,会通过以下测试:

assertNull(Convert.convert("abc", int.class));

这在过去曾受到批评,但由于向后兼容性,无法在 jOOQ API 中轻松更改。

解决方法包括:

自己解析 CSV 内容 将Object[][] 传递给LoaderSourceStep.loadArrays()

【讨论】:

嗨,谢谢你的信息。我从这个示例中找到了如何做到这一点jooq.org/doc/3.8/manual/sql-execution/importing/importing-csv

以上是关于Jooq 不会为失败抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ“IN”查询抛出空指针异常

jOOQ loadInto 不会在外键约束上抛出错误失败

finally中流关闭失败需要抛出异常吗

JOOQ 记录缓存异常

在clickhouse中,投射失败时如何返回null而不是抛出异常?

带有 MockResult 的 Jooq 自定义类型抛出 DataTypeException