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 閱讀(818) 評論(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
          主站蜘蛛池模板: 满洲里市| 苍梧县| 营口市| 泰宁县| 金门县| 兴隆县| 名山县| 南昌县| 翁牛特旗| 连州市| 鄂尔多斯市| 盐山县| 沂南县| 桂平市| 保康县| 天门市| 溆浦县| 尉氏县| 玉林市| 漳浦县| 瑞昌市| 高密市| 郑州市| 黄浦区| 霞浦县| 青阳县| 阜城县| 毕节市| 乳山市| 阿勒泰市| 都江堰市| 余江县| 马尔康县| 樟树市| 惠水县| 金山区| 崇仁县| 长顺县| 隆子县| 改则县| 琼中|