使用spring的OpenEntityManagerInView

OpenEntityManagerInView和Hibernate的OpenSessionInView一樣,服務端在接收到一個請求的時候開啓EntityManager,在請求結束的時候纔去關閉這個EntityManager,和JpaDaoSupport一起可以很好地工作。

使用OpenEntityManagerInView可以解決JPA延遲加載出現的LazyInitialize異常。如果不使用JPA的OpenEntityManagerInViewFilter,那麼當使用玩getJpaTemplate().persist()或者remove()方法後,Spring就會自動關閉EntityManager,因此,你使用了延遲加載的對象加載屬性的時候將會出現LazyInitialize異常。

OpenEntityManagerInViewFilter會把連接放到線程池裏面,不是馬上關閉。因此,在請求的過程當中,我們可以隨時使用這個EntityManager。當請求結束之後纔會關閉這個EntityManager。

不過在高併發的時候,EntityManager的生命週期會比較長(因爲請求開始到請求結束這段時間長),EntityManager不會立刻關閉,導致連接池連接數佔用的問題。因此高併發的系統最好不要使用OpenEntityManagerInView模式。

配置如下,在web.xml裏面添加一個filter:

<filter>

<filter-name>jpaFilter</filter-name>

<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>jpaFilter</filter-name>

<url-pattern>/*</url-pattern>

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