WasNull 调用
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
处理这些事件的 SPI 方法是 unnecessaryWasNullCall() 和 missingWasNullCall()
只有直接使用 JDBC API 时才会出现此问题,因为 jOOQ 和大多数 ORM 都正确地抽象了此 JDBC 遗留问题。 在 JDBC 中,当获取原始类型(某些类型仅以其原始形式可用)时,需要随后调用 ResultSet.wasNull(),以查看之前的原始类型是否确实为 NULL 值,而不是 0 或 false 值。
为什么这不好?
在此领域可能会出现两种误用
- 当应该进行
wasNull()调用时(可空类型,作为原始类型获取)未进行调用,可能导致客户端出现错误结果。 wasNull()调用过于频繁,或者在不需要进行调用时(不可空类型,或作为引用类型获取的类型)进行了调用,可能会导致非常轻微的性能开销,具体取决于驱动程序。
这里给出了一个例子
// A custom DiagnosticsListener SPI implementation
class WasNull implements DiagnosticsListener {
@Override
public void unnecessaryWasNullCall(DiagnosticsContext ctx) {
System.out.println("Unnecessary wasNull() call: " + ctx.resultSetUnnecessaryWasNullCall());
}
@Override
public void missingWasNullCall(DiagnosticsContext ctx) {
System.out.println("Missing wasNull() call: " + ctx.resultSetMissingWasNullCall());
}
}
然后
// Configuration is configured with the target DataSource, SQLDialect, etc. for instance Oracle.
try (Connection c = DSL.using(configuration.derive(new WasNull()))
.diagnosticsConnection();
Statement s = c.createStatement()) {
try (ResultSet rs = s.executeQuery("SELECT year_of_birth FROM author")) {
// The YEAR_OF_BIRTH column is nullable, so a 0 int could really mean null
while (rs.next())
System.out.println("Year of birth: " + rs.getInt(1));
}
}
反馈
您对此页面有任何反馈吗? 我们很乐意听到您的反馈!