在WEB容器中获取持久化上下文

http://java.chinaitlab.com/advance/756728_3.html

 

 

 

 

   这样注入进来的EntityManager完全由容器管理,不要做任何EntityManager相关的工作.但是一切就这样完美了吗? 当然不是,和EJB容器不同的是,相当于有状态会话BEAN的Servlet是多线程服务的,一个实例变量的EntityManager 完全可能会被多个线程同时访问而出现极大的安全性隐患.那么这样的注入是否有意义呢?  当然有意义,一种情况是你可以在ServletContextListener这样的线程安全模块中注入,另一种情况只要你能控制不让多个线程同时访问一个实例变量的EntityManager,那么你就可以享受容器管理带来的方便性.

     但是任何事物都有两面性,如果你要获取方便,就要牺牲应用范围的控制和性能,要让多个线程不同时访问一个实例变量EntityManager,最终还是要进行同步或互斥.即一个线程使用变量EntityManager时其它线程都要等待.如果能在线程的local方法中(doXXX或父类的service方法中)获取由容器管理的EntityManager, 那将会大大提高程序的性能.  "容器管理"的意思,其实就是容器产生了一些对象,你只需要拿来使用,不需要负责它的产生和销毁,关键是容器产生了这样的对象后你如何"拿到".通过注入只能注入成实例字段,那么在线程方法中,可能通过JNDI 来即时获取"容器中的EntityManager".(实事上,只要改一下容器实现的源码,还可以通过在service方法中获取ServletContext对象来动态即时注入,但这对于普通程序员是做不到的).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值