`

使用spring的OpenEntityManagerInView

    博客分类:
  • SSH
阅读更多


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>
分享到:
评论
1 楼 86614009 2014-04-01  
如何在service层,如何获取绑定到当前线程的entitnamager?
也就是OpenEntityManagerInViewFilter开启的这个entityManager

相关推荐

Global site tag (gtag.js) - Google Analytics