1 回答

TA貢獻1811條經驗 獲得超6個贊
如果沒有運行的測試系統(tǒng),就很難找到合適的解決方案。
我發(fā)現可疑的是,您的第一個查詢的每個結果行都會調用您的2nd方法,并且它似乎每次都打開和關閉數據庫連接。(您ConnectionHandler
可能實現了正確的連接池,但是我無法在不知道代碼的情況下進行判斷。如果每次都真正打開和關閉連接,那么這是迄今為止代碼中最昂貴的事情)。
但是,即使有適當的連接池,您的第二個方法也會為每個調用創(chuàng)建并執(zhí)行新的SQL語句。這稱為N + 1選擇查詢問題。
因此,我建議進行以下改進:
嘗試將兩個SQL語句合并為一個(可能使用嵌套的SELECT等)。這樣就不能執(zhí)行1 + N查詢,這將大大減少執(zhí)行時間。
如果那不可能,請
PreparedStatement
對第二種方法至少使用a 。確保在進入循環(huán)之前僅創(chuàng)建一次準備好的語句。因此,您必須使用第一種方法創(chuàng)建和準備它。因此,您需要第二個數據庫連接。也分別在循環(huán)之后之前打開和關閉它。另一策略:運行第一個查詢,迭代結果集,然后將所有結果放入
regCodes
列表中。關閉查詢后,請使用批處理via處理PreparedStatement
所有regCodes
。另一個優(yōu)點:因此,僅需要一個數據庫連接。
順便說一句:成熟的對象關系映射框架(例如Hibernate)已經提供了開箱即用的這些策略,以避免或至少減輕了1 + N選擇問題。
添加回答
舉報