當(dāng)我嘗試使用 JOOQ 的靜態(tài)類型字段運(yùn)行一些 SQL 時(shí),數(shù)據(jù)庫(kù)連接關(guān)閉我正在將 JOOQ https://www.jooq.org/用于類型安全的 SQL,但由于某種原因連接關(guān)閉,我不知道為什么。我有一個(gè) psql 9.6 數(shù)據(jù)庫(kù),我啟用了所有日志記錄,但連接在運(yùn)行 JOOQ 生成的查詢之前關(guān)閉,異常顯示在下方。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();但是,當(dāng)我以這種方式運(yùn)行 sql 時(shí),連接保持打開狀態(tài)并且沒有出現(xiàn)任何問題: //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));我希望連接在兩者上都關(guān)閉,但是只有在 JOOQ 準(zhǔn)備查詢/語句時(shí)才會(huì)關(guān)閉....
1 回答

蕭十郎
TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
我不知道你是db.execute()
做什么的,但跑步之間有明顯的區(qū)別:
var blockRecord = db.execute(sql -> sql.select(...).from(...) .where(...) .and(...)) // Excess parenthesis here .and(...).fetchOne().value1();
和
var record = db.execute(sql -> sql.fetch(query));
請(qǐng)注意,第二次調(diào)用在 lambda 內(nèi)部運(yùn)行整個(gè) jOOQ 邏輯,而第一次調(diào)用似乎沒有在 lambda 內(nèi)部執(zhí)行任何查詢,而是返回未執(zhí)行的查詢,并繼續(xù)在外部構(gòu)建查詢,然后獲取可能已經(jīng)存在的內(nèi)容關(guān)閉連接。
添加回答
舉報(bào)
0/150
提交
取消