亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我的數據庫連接在嘗試執行 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條經驗 獲得超13個贊

我不知道你是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 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號