【问题标题】:Inserting NaN values into postgresql database with JOOQ使用 JOOQ 将 NaN 值插入到 postgresql 数据库中
【发布时间】:2016-09-01 19:58:48
【问题描述】:

如何使用 JOOQ 将 Double.NaN 插入 PostgreSQL“双精度”字段?

我正在使用 PostgreSQL 9.5 和 JOOQ 3.7.3。我将传感器值批量插入表中。有时值是 NaN,当 JOOQ 尝试插入它时,它会抛出异常。

org.springframework.jdbc.BadSqlGrammarException: jOOQ; bad SQL grammar [];
nested exception is java.sql.BatchUpdateException: Batch entry 6 
insert into "sensordata" ("measure_time", "location_id", "sensor_id", "value") 
values (1462551000, 12, 15, NaN)
on conflict ("measure_time", "location_id", "sensor_id")
do update set "value" = NaN 
was aborted.  
Call getNextException to see the cause.
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:99) ~[spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) ~[spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]

值字段在 SQL 中定义如下:"value" DOUBLE PRECISION NOT NULL DEFAULT 0.0

我的 Java 代码的相关部分:

final List<InsertOnDuplicateSetMoreStep<SensordataRecord>> inserts =
seq(list)
.map(this::process)
.flatMap(t -> t)
.map(d ->
    sql.insertInto(SENSORDATA, SENSORDATA.MEASURE_TIME, SENSORDATA.LOCATION_ID, SENSORDATA.SENSOR_ID, SENSORDATA.VALUE)
       .values(d.getMeasureTime(), d.getLocationId(), d.getSensorId(), d.getValue())
       .onDuplicateKeyUpdate()
       .set(SENSORDATA.VALUE, d.getValue())
    )
    .toList();
 sql.transaction(cfg -> DSL.using(cfg).batch(inserts).execute());

【问题讨论】:

  • 问题在于批量插入,在我将其替换为inserts.forEach(query -&gt; DSL.using(cfg).execute(query)); 后,事务运行正常。也许我应该将问题更改为:“为什么使用 onDuplicateKeyUpdate 子句时批量插入失败?”,但我不确定这是否是我的查询的真正问题。

标签: postgresql double nan jooq


【解决方案1】:

这是 jOOQ 中的一个错误:https://github.com/jOOQ/jOOQ/issues/5249

jOOQ 应该将NaN 显式转换为double precision,例如:'NaN'::double precision。有两种可能的解决方法:

在这种特殊情况下,后者可能更可取,因为您可以通过微调批量、批处理和提交大小来获得更好的性能。

【讨论】:

  • 看起来唯一的选择是使用显式的 NaN 检查来实现转换。具有多个绑定变量的单个语句不起作用,因为我也需要 onDuplicateKeyUpdate 子句。
猜你喜欢
  • 2018-01-27
  • 2021-08-01
  • 1970-01-01
  • 2019-02-22
  • 2011-05-13
  • 1970-01-01
  • 2014-12-29
  • 2023-04-03
  • 2019-10-19
相关资源
最近更新 更多