为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的数据库连接在尝试执行 JOOQ 生成的 SQL 时关闭?

为什么我的数据库连接在尝试执行 JOOQ 生成的 SQL 时关闭?

守候你守候我 2023-06-14 11:10:49
当我尝试使用 JOOQ 的静态类型字段运行一些 SQL 时,数据库连接关闭我正在将 JOOQ https://www.jooq.org/用于类型安全的 SQL,但由于某种原因连接关闭,我不知道为什么。我有一个 psql 9.6 数据库,我启用了所有日志记录,但连接在运行 JOOQ 生成的查询之前关闭,异常显示在下方。var blockRecord = db.execute(sql -> sql.select(ATTENDANCE.BLOCK_TIME.BLOCK_ID).from(ATTENDANCE.BLOCK_TIME)                .where(ATTENDANCE.BLOCK_TIME.CLIENT_ID.eq(clientId))                        .and(ATTENDANCE.BLOCK_TIME.START_TIME.eq(startTime)))                        .and(ATTENDANCE.BLOCK_TIME.SCHEDULE_ID.eq(scheduleId)).fetchOne().value1();但是,当我以这种方式运行 sql 时,连接保持打开状态并且没有出现任何问题:     //Injection vulnerable        String query = "SELECT block_id FROM attendance.block_time " +                "WHERE start_time = cast ( '" + startTime + "' as timestamp) "  + " and client_id = '" + clientId + "' and schedule_id = '" + scheduleId + "'";        var record = db.execute(sql -> sql.fetch(query));我希望连接在两者上都关闭,但是只有在 JOOQ 准备查询/语句时才会关闭....
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超12个赞

我不知道你是db.execute()做什么的,但跑步之间有明显的区别:

var blockRecord = db.execute(sql -> sql.select(...).from(...)
            .where(...)
                    .and(...)) // Excess parenthesis here
                    .and(...).fetchOne().value1();

var record = db.execute(sql -> sql.fetch(query));

请注意,第二次调用在 lambda 内部运行整个 jOOQ 逻辑,而第一次调用似乎没有在 lambda 内部执行任何查询,而是返回未执行的查询,并继续在外部构建查询,然后获取可能已经存在的内容关闭连接。


查看完整回答
反对 回复 2023-06-14
  • 1 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信