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
          主站蜘蛛池模板: 鄂托克旗| 姜堰市| 邵武市| 东兴市| 桃江县| 额尔古纳市| 林芝县| 安乡县| 西贡区| 苍山县| 靖远县| 长治市| 如皋市| 衡南县| 杂多县| 景东| 靖远县| 沁阳市| 湘潭市| 江源县| 玉屏| 区。| 波密县| 钟祥市| 黑河市| 安宁市| 衡东县| 昌江| 洮南市| 长沙县| 吕梁市| 安仁县| 伊宁市| 商水县| 和田市| 平陆县| 长乐市| 鹰潭市| 平和县| 嘉兴市| 新宁县|