gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          Thread-safety when injecting JPA EntityManager

          Injecting EJB 3 stateful beans into servlet instance fields is not thread-safe. Along the same line, injecting EntityManager with @PersistenceContext into servlet instance variables is not thread-safe, either. EntityManager is just not designed to be thread-safe.

          For example, the following code snippet of a servlet class is incorrect:

          1
          2
          3
          4
          5
          6
          7
          public class EMTestServlet extends HttpServlet {
            //This field injection is not thread-safe.
            //FIXME
            @PersistenceContext
            private EntityManager em;
          ...
          }

          One way to fix this is to inject EntityManagerFactory instead. EntityManagerFactory is guaranteed to be thread-safe. For example:
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          public class EMTestServlet extends HttpServlet {
            //This field injection is thread-safe
            @PersistenceUnit
            private EntityManagerFactory emf;
            
            protected void doGet(HttpServletRequest request,
                       HttpServletResponse response)
            throws ServletException, IOException {
            EntityManager em = emf.createEntityManager();
            //work with em
            }
          }

          Continuing container-managed EntityManager vs application-managed EntityManager.

          There are important differences between the injected EntityManager, and the EntityManager created from an injected EntityManagerFactory. Basically, injected EntityManager is container-managed, meaning all of its lifecycle is controlled by the container (web container or EJB container). Application code cannot close it, or otherwise interfere with its life.

          In addition, for a container-managed EntityManager, its associated PersistenceContext is automatically propagated along with the underlying JTA, from servlet A to servlet B, from servlet to EJB, from EJB a to EJB B, and so on. As such, EntityManager of the same configuration injected into various classes can share the same PersistenceContext in a call stack.

          On the other hand, EntityManager created from EntityManagerFactory is application-managed EntityManager. Application code is responsible for managing its whole lifecycle. And there is no PersistenceContext propagation for application-managed EntityManager.

          Are all EntityManager's obtained from EntityManagerFactory application-managed EntityManagerYes.

          Is it possible to get a container-managed EntityManager from EntityManagerFactoryNo.

          You may have read about the method EntityManagerFactory.getEntityManager(), which returns a container-managed EntityManager. This method was considered and included in the early draft version of Java Persistence API, but was eventually removed from its final release.

          posted on 2013-02-04 10:49 gembin 閱讀(850) 評論(0)  編輯  收藏 所屬分類: JavaEE

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊

          收藏夾(9)

          Adobe

          Android

          AS3

          Blog-Links

          Build

          Design Pattern

          Eclipse

          Favorite Links

          Flickr

          Game Dev

          HBase

          Identity Management

          IT resources

          JEE

          Language

          OpenID

          OSGi

          SOA

          Version Control

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          free counters
          主站蜘蛛池模板: 含山县| 东乌| 巴彦县| 阳谷县| 剑河县| 濮阳县| 卢湾区| 渭源县| 宿迁市| 门头沟区| 榆中县| 买车| 芮城县| 武城县| 望奎县| 乐陵市| 松原市| 山阴县| 阿拉善盟| 木兰县| 长武县| 福鼎市| 勃利县| 和硕县| 柏乡县| 随州市| 宁武县| 富宁县| 新昌县| 德昌县| 乌拉特前旗| 仁怀市| 巩留县| 调兵山市| 连平县| 皮山县| 海伦市| 庆元县| 玉山县| 义乌市| 乐清市|