當我嘗試使用 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 內部執行任何查詢,而是返回未執行的查詢,并繼續在外部構建查詢,然后獲取可能已經存在的內容關閉連接。
添加回答
舉報
0/150
提交
取消