如果當sql
資料庫中select語句數目過多,就會影響資料庫的效能,如果需要查詢n個customer物件,那麼必須執行n+1次select查詢語句,下文就將為您講解這個n+1次select查詢問題。
在session的快取中存放的是相互關聯的物件圖。預設情況下,當hibernate從資料庫中載入customer物件時,會同時載入所有關聯的order物件。以customer和order類為例,假定orders表的customer_id外來鍵允許為null,圖1列出了customers表和orders表中的記錄。
以下session的find()方法用於到資料庫中檢索所有的customer物件:
list customerlists=session.find("from customer as c");
執行以上find()方法時,hibernate將先查詢customers表中所有的記錄,然後根據每條記錄的id,到orders表中查詢有參照關係的記錄,hibernate將依次執行以下select語句:
select * from customers;
select * from orders where customer_id=1;
select * from orders where customer_id=2;
select * from orders where customer_id=3;
select * from orders where customer_id=4;
通過以上5條select語句,hibernate最後載入了4個customer物件和5個order物件,在記憶體中形成了一幅關聯的物件圖,參見圖2。
(1) select語句的數目太多,需要頻繁的訪問資料庫,會影響檢索效能。如果需要查詢n個customer物件,那麼必須執行n+1次select查詢語句。這就是經典的n+1次select查詢問題。這種檢索策略沒有利用sql的連線查詢功能,例如以上5條select語句完全可以通過以下1條select語句來完成:
select * from customers left outer join orders
on customers.id=orders.customer_id
以上select語句使用了sql的左外連線查詢功能,能夠在一條select語句中查詢出customers表的所有記錄,以及匹配的orders表的記錄。
(2)在應用邏輯只需要訪問customer物件,而不需要訪問order物件的場合,載入order物件完全是多餘的操作,這些多餘的order物件白白浪費了許多記憶體空間。
為了解決以上問題,hibernate提供了其他兩種檢索策略:延遲檢索策略和迫切左外連線檢索策略。延遲檢索策略能避免多餘載入應用程式不需要訪問的關聯物件,迫切左外連線檢索策略則充分利用了sql的外連線查詢功能,能夠減少select語句的數目。
n 1次select查詢問題
什麼叫n 1次select查詢問題?在session的快取中存放的是相互關聯的物件圖。預設情況下,當hibernate從資料庫中載入customer物件時,會同時載入所有關聯的order物件。以customer和order類為例,假定orders表的customer id外來鍵允許為null,圖1列...
什麼叫n 1次select查詢問題
在session的快取中存放的是相互關聯的物件圖。預設情況下,當hibernate從資料庫中載入customer物件時,會同時載入所有關聯的order物件。以customer和order類為例,假定orders表的customer id外來鍵允許為null,圖1列出了customers表和order...
n1 日語N1滿分學姐經驗分享
1.n1滿分難嗎?n1 180分,難。有多難?近三年的統計資料顯示,取得n1滿分的人,佔所有n1報考生的0.6 0.7 不說萬里挑一也是千里挑一。然而考滿分並非是十分稀奇的事情。每年報考的考生有10萬大軍,也就是說,其實每年,會產生600 700名n1滿分,自2010年新jlpt施行以來16次考試中...