hibernate開發總結

http://www.51myit.com/thread-45659-1-1.html


1、OpenSessionInView對系統的影響有多大沒測試過,不過大家都說使用的時候一定要慎重。個人使用也比較少

2、既然用了hibernate, lazyload毫無疑問是一個很好的東西,否則是自找麻煩。但是lazy對性能的影響有大多不得而知。

3、hibernate默認會把所有字段都update一次,這個對效率當然是有影響的。
你可以試着寫hql去update或者設置動態sql: 在update 的時候又選擇的去save,但是動態sql對效率的提升有多大我也不太清楚。

4、個人覺得N+1不是問題,在有緩存的情況下效率和性能應該是很高的。
反而過多的關聯查詢性能不一定高/低多少,這樣N+1不是什麼壞事,何況在緩存的情況下根本就不會去查數據庫。

5、要搞清楚爲什麼要用lazy和什麼情況下用lazy,用和不用的區別、影響又在哪。不要一出問題就說什麼把lazyload設置成EAGER之類的就當成是解決了問題了事。這類人完全沒明白自己在幹什麼。

7、如果是openAmf這類遇到需要序列化的項目(lazyload不起作用),這個時候就別想着用什麼lazy、EAGER和OpenSessionInView了 實體全部拆散,需要的時候自己再封裝成一個對象裏面去。迴歸原始。

8、既然沒有lazyload就應該明白過多的對象關聯是很恐怖的。
例如:User 裏面有幾個UserPorperty對象用來存儲User的道具狀態之類的。現在你只希望update status這一個字段在User user=get(User);的時候會把這些無用屬性都查出來,因爲:EAGER。
當然 你可以用幾個辦法解決:1、”update User set status = 1“。2、lazy 3、把User裏面的UserProperty對象改爲Integer :ID在需要的時候再去查詢

9、開發效率和性能無法兼得。
最典型的例子就是hibernate會加載你“不需要”的東西出來。
例如:你想找出User 的status、age屬性,在查詢的時候會把整個User都加載出來。代碼上是方便了許多,以後如果擴展也很方便,因爲這裏User的東西都有了隨便你之後修改其他屬性。
但是在這裏千萬別說Hibernate效率低,因爲這是你選擇的結果:如果你希望效率更高,整個系統的東西都應該是你定製的。
例如:你這裏只想修改status =1 那麼你就應該用hql:"update User set status = 1" 而不是User user=get(User);  user.setStatus(1);  save(user);

10、關於批量saveOrUpdate,這裏我只用過隔20/30次save操作flush一次這種方式,還有拼接sql字符串的方式的效率會更高一些。
不要直接用hibernateTemplter提供的saveOrUpdateAll方法,對於大的數組會內存溢出,因爲hibernate都是把session存在內存中

11、用HQL的語法大部分只用到了封裝對象模式(我自己這樣描述) 就像:"from User" 而是不 "select * from t_user"。如果需求是很複雜的場景hibernate還是提供了sql方式解決:createSQLQuery()

12、使用hibernate最理想的情況就是系統是用的時候就設計好了的,而且你應該明白設計之後的系統的利弊。
其中影響最大的就是實體之間的關係如何設定,lazyload openSessioninView是否能夠派上用處。
一旦用不上思維就要變換了,最顯著的地方就是不要把fetch 模式改爲EAGER就了事,這樣只會讓你跑來發帖說hibernate效率如何之差

13、緩存那是一定要用的,使用簡單效果明顯。ehcache很好很強大。

14、 lazy+緩存 < 一個好的設計






個人在開發過程中遇到的最多問題大概就這些了,效率問題無非是體現在封裝和load整個實體這2個方面。總要的是如果你想優化,空間還是有很多的。實在不行我們還有大絕招:createSQLQuery()  !

歡迎大家來補充。提供更多的優化和解決辦法。

發佈了151 篇原創文章 · 獲贊 5 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章