猿问

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

当我尝试使用 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 准备查询/语句时才会关闭....



守候你守候我
浏览 104回答 1
1回答

萧十郎

我不知道你是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 内部执行任何查询,而是返回未执行的查询,并继续在外部构建查询,然后获取可能已经存在的内容关闭连接。
随时随地看视频慕课网APP

相关分类

Java
我要回答