Hibernate+Struts2

一.Hibernate部分
1、什麼是Hibernate的併發機制?怎麼去處理併發問題?
Hibernate併發機制:
a、Hibernate的Session對象是非線程安全的,對於單個請求,單個會話,單個的工作單元(即單個事務,單個線程),它通常只使用一次, 然後就丟棄。
b、多個事務併發訪問同一塊資源,可能會引發第一類丟失更新,髒讀,幻讀,不可重複讀,第二類丟失更新一系列的問題。
解決方案:設置事務隔離級別。
Serializable:串行化。隔離級別最高
Repeatable Read:可重複讀
Read Committed:已提交數據讀
Read Uncommitted:未提交數據讀。隔離級別最差
設置鎖:樂觀鎖和悲觀鎖。
樂觀鎖:使用版本號或時間戳來檢測更新丟失,在的映射中設置 optimistic-lock=”all”可以在沒有版本或者時間戳屬性映射的情況下實現 版本檢查,此時Hibernate將比較一行記錄的每個字段的狀態 行級悲觀鎖:Hibernate總是使用數據庫的鎖定機制,從不在內存中鎖定對象!只要爲JDBC連接指定一下隔 離級別,然後讓數據庫去搞定一切就夠了。類LockMode 定義了Hibernate所需的不同的鎖定級別:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;
信息塊:3
2.update和saveOrUpdate的區別?
update()和saveOrUpdate()是用來對跨Session的PO進行狀態管理的。
update()方法操作的對象必須是持久化了的對象。也就是說,如果此對象在數據庫中不存在的話,就不能使用update()方法。
saveOrUpdate()方法操作的對象既可以使持久化了的,也可以使沒有持久化的對象。如果是持久化了的對象調用saveOrUpdate()則會 更新數據庫中的對象;如果是未持久化的對象使用此方法,則save到數據庫中。
信息塊:4
3.hibernate的三種狀態之間如何轉換
當對象由瞬時狀態(Transient)一save()時,就變成了持久化狀態;
當我們在Session裏存儲對象的時候,實際是在Session的Map裏存了一份, 也就是它的緩存裏放了一份,然後,又到數據庫裏存了一份,在緩存裏這一份叫持久對象(Persistent)。 Session 一 Close()了,它的緩存也都關閉了,整個Session也就失效了,這個時候,這個對象變成了遊離狀態(Detached),但數據庫中還是存在的。當遊離狀態(Detached)update()時,又變爲了持久狀態(Persistent)。
當持久狀態(Persistent)delete()時,又變爲了瞬時狀態(Transient), 此時,數據庫中沒有與之對應的記錄。
信息塊:10
4.比較hibernate的三種檢索策略優缺點
1立即檢索;
優點: 對應用程序完全透明,不管對象處於持久化狀態,還是遊離狀態,應用程序都可以方便的從一個對象導航到與它關聯的對象;
缺點: 1.select語句太多;2.可能會加載應用程序不需要訪問的對象白白浪費許多內存空間;
2延遲檢索:
優點: 由應用程序決定需要加載哪些對象,可以避免可執行多餘的select語句,以及避免加載應用程序不需要訪問的對象。因此能提高檢索性能,並且能節省內存空間;
缺點: 應用程序如果希望訪問遊離狀態代理類實例,必須保證他在持久化狀態時已經被初始化;
3 迫切左外連接檢索
優點: 1對應用程序完全透明,不管對象處於持久化狀態,還是遊離狀態,應用程序都可以方便地衝一個對象導航到與它關聯的對象。2使用了外連接,select語句數目少;
缺點: 1 可能會加載應用程序不需要訪問的對象,白白浪費許多內存空間;2複雜的數據庫表連接也會影響檢索性能;
信息塊:21
5.Hibernate工作原理及爲什麼要用?
1.讀取並解析配置文件
2.讀取並解析映射信息,創建SessionFactory
3.打開Sesssion
4.創建事務Transation
5.持久化操作
6.提交事務
7.關閉Session
8.關閉SesstionFactory
爲什麼要用:
對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。
Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作
hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。
hibernate的性能非常好,因爲它是個輕量級框架。映射的靈活性很出色。它支持各種關係數據庫,從一對一到多對多的各種複雜關係。
信息塊:18
6.Hibernate是如何延遲加載?
當Hibernate在查詢數據的時候,數據並沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。
信息塊:5
7.說下Hibernate的緩存機制
內部緩存存在Hibernate中又叫一級緩存,屬於應用事物級緩存
二級緩存:
a) 應用及緩存
b) 分佈式緩存
條件:數據不會被第三方修改、數據大小在可接受範圍、數據更新頻率低、同一數據被系統頻繁使用、非關鍵數據
c) 第三方緩存的實現
信息塊:11
8.如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,用多對一取代
4.配置對象緩存,不使用集合緩存
5.一對多集合使用Bag,多對多集合使用Set
6. 繼承類使用顯式多態
7. 表字段要少,表關聯不要怕多,有二級緩存撐腰
信息塊:11
9.在數據庫中條件查詢速度很慢的時候,如何優化?
1.建索引
2.減少表之間的關聯
3.優化sql,儘量讓sql很快定位數據,不要讓sql做全表查詢,應該走索引,把數據量大的表排在前面
4.簡化查詢字段,沒用的字段不要,已經對返回結果的控制,儘量返回少量數據
信息塊:9
10.Hibernate的五個核心接口
Configuration 接口:配置Hibernate,根據其啓動hibernate,創建
SessionFactory 對象;
SessionFactory 接口:初始化Hibernate,充當數據存儲源的代理,創建
session 對象,sessionFactory 是線程安全的,意味着它的同一個實例可以被應
用的多個線程共享,是重量級、二級緩存;
Session 接口:負責保存、更新、刪除、加載和查詢對象,是線程不安全的,
避免多個線程共享同一個session,是輕量級、一級緩存;
Transaction 接口:管理事務;
Query 和Criteria 接口:執行數據庫的查詢。
信息塊:9
Hibernate總信息塊:101
二.Struts部分
1.描述Struts2的工作原理
客戶端發送請求–》請求經過一系列過濾器–》FilterDispatcher通過ActionMapper來決定這個Request需要調用哪個Action --》FilterDispatcher把請求的處理交給ActionProxy–》通過ConfigurationManager詢問Struts配置文件(Struts.xml),找到需要調用的Action類–》ActionProxy創建一個ActionInvocation的實例 --》調用Action–》執行完畢,返回結果
信息塊:9
2.Struts2有哪些優點?
1)在軟件設計上Struts2的應用可以不依賴於Servlet API和struts API。 Struts2的這種設計屬於無侵入式設計;
2)攔截器,實現如參數攔截注入等功能;
3)類型轉換器,可以把特殊的請求參數轉換成需要的類型;
4)多種表現層技術,如:JSP、freeMarker、Velocity等;
5)Struts2的輸入校驗可以對指定某個方法進行校驗;
6)提供了全局範圍、包範圍和Action範圍的國際化資源文件管理實現
7) 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現。有豐富的tag可以用,大大提高了開發效率。(簡要)
信息塊:13
3.攔截器和過濾器的區別
1)攔截器是基於java反射機制的,而過濾器是基於函數回調的。
2)過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。
3)攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
4)攔截器可以訪問Action上下文、值棧裏的對象,而過濾器不能。
5)在Action的生命週期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。
信息塊:10
Srtuts總信息塊:32

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章