簡體   English   中英

每個請求的Hibernate和JSP事務

[英]Hibernate and JSP Transaction per Request

嘿,我正在構建一個四層軟件系統(演示文稿-JSP,問題域,應用程序邏輯,持久性),並且我想讓每個請求的事務都處於休眠狀態,這樣我每次執行某項操作時都不會進行事務處理並且我可以對對象進行數據跟蹤,以便僅更新已更改的屬性。

我已經將Spring視為實現此目的的框架,並且我非常希望實現這一目標,因此我的團隊已經否決了它,我們不能使用它。

我也看過JTA,但由於不使用bean,所以看不到它的用處。

我已經考慮過一種解決方案,例如擁有一種方法來調用關閉和打開的事務,但是似乎有一個更優雅的解決方案。

根據我的系統,按請求保留我的交易的最佳方法是什么?

Apache提供了一個用於Hibernate的SessionFilter ,單擊后會進行說明。

嘿,我正在構建一個四層軟件系統(演示文稿-JSP,問題域,應用程序邏輯,持久性),並且我想讓每個請求的事務都處於休眠狀態,這樣我每次執行某項操作時都不會進行事務處理還有...

我對在使用ClickServlet維護每個請求一個事務的同時如何使應用程序具有4抽象層感興趣。 相信您的事務將和活動的servlet工作者線程一樣多的請求。

如果要利用Hibernate的延遲加載功能,則可以:

(1)必須在請求仍處於活動狀態時維護事務(以免獲得LazyLoadingException),或者

(2)您必須隔離層,使層通過DTO和VO,而不是將Hibernate模型傳遞到上面的層。

IMO是一種更清潔的方法,因為具有抽象層的主要目的是使它們更易於重用,更易於測試和分離問題。

我建議您不要在Servlet會話/請求級別處理事務。 它將使您位於演示文稿下方的所有層都與Servlet API緊密結合。 通常,當我們想要抽象層時,這不是我們想要的。 因此,Apache Click框架及其ClickServlet可能不是最好的方法。 Spring可以更好地解決這一問題。 如果您遭到否決,那就太糟糕了。

如果您不想使用Spring自動事務,則仍然可以使用AspectJ(或其他面向方面的編程組件)透明地處理事務(在輸入方法時創建事務,在退出方法時提交/回滾)。 當然,這比僅僅采用Spring Framework還要麻煩。

……還可以對對象進行數據跟蹤,以便僅更新已更改的屬性。

Hibernate 1級緩存+延遲加載可以透明地處理這一問題。 您不必自己做。 僅當刷新會話,L1緩存已滿或事務提交時,Hibernate才會向后端生成SQL。 通常,您無需執行任何操作即可最小化后端的數據處理語言(DML)語句,通常,如果配置正確,Hibernate可以更好地處理此問題。

我也看過JTA,但由於不使用bean,所以看不到它的用處。

您可以在沒有bean的情況下使用JPA。 它只是可以從任何地方調用的API。

我已經考慮過一種解決方案,例如擁有一種方法來調用關閉和打開的事務,但是似乎有一個更優雅的解決方案。

是。 看一下Gregor Kiczales的面向方面的編程。 Spring Framework支持這種現成的AOP。 如果您的團隊否決了,您仍然可以自己動手做。

根據我的系統,按請求保留我的交易的最佳方法是什么?

最好的方法(因為您計划有4個抽象層)是將數據從Hibernate域模型加載到持久層的數據傳輸對象/值對象。 上層(應用程序邏輯層)可以訪問Hibernate域模型,但可能無法將Hibernate模型傳遞到上層。 為了使其高效,您必須在這些層中實現分頁(否則,您通常會將所有數據加載到內存中,這很不好)。

這樣,再結合方面,我認為這是當前的最佳做法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM