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 閱讀(819) 評論(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
          主站蜘蛛池模板: 腾冲县| 左贡县| 余姚市| 洛南县| 和龙市| 澎湖县| 沿河| 汉源县| 乳源| 从江县| 闻喜县| 咸宁市| 清河县| 砀山县| 临高县| 阜康市| 碌曲县| 泸西县| 申扎县| 渝北区| 措美县| 武穴市| 扶绥县| 南木林县| 偃师市| 乌拉特前旗| 上蔡县| 兴安盟| 武冈市| 吉林市| 湟中县| 绩溪县| 邮箱| 堆龙德庆县| 宜丰县| 新宾| 茶陵县| 德钦县| 宜兰市| 镇江市| 钟祥市|