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 閱讀(854) 評論(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
          主站蜘蛛池模板: 焦作市| 滦平县| 石城县| 鹤岗市| 肥乡县| 西华县| 铁力市| 道孚县| 奇台县| 沭阳县| 靖安县| 丽水市| 阳新县| 龙门县| 神木县| 华宁县| 中山市| 新昌县| 吴江市| 保德县| 宜兰县| 靖西县| 东阿县| 延津县| 周至县| 即墨市| 柞水县| 柳河县| 靖州| 临朐县| 扎囊县| 马鞍山市| 兴文县| 明星| 沙坪坝区| 武冈市| 新野县| 德昌县| 巧家县| 垫江县| 崇仁县|