虽然已经有很多文章讨论了Spring的OpenSession/EntityManagerInViewFilter,但我找不到任何一篇提到它的缺点。根据我的理解,假设使用@Transactional服务层的典型分层Web应用程序架构,该过滤器的工作方式如下:
我认为这有两个问题:
你怎么看?
谢谢!
- 过滤器拦截Servlet请求
- 过滤器打开一个EntityManager并将其绑定到当前线程
- 调用Web控制器
- Web控制器调用服务
- 事务拦截器开始一个新事务,检索与线程绑定的EntityManager并将其绑定到事务
- 调用服务,使用EntityManager执行一些操作,然后返回
- 事务拦截器刷新EntityManager,然后提交事务
- Web控制器准备视图,然后返回
- 构建视图
- 过滤器关闭EntityManager并将其从当前线程解绑
我认为这有两个问题:
- 加载多个惰性关联将导致多个数据库事务,可能会影响性能
- 根对象及其惰性关联在不同的数据库事务中加载,因此数据可能过时(例如,由线程1加载的根,在线程2更新后由线程1加载它的关联)
你怎么看?
谢谢!