BMP中使用哪种方法来避免不必要的往返数据库?

时间:2011-12-02 08:42:27

标签: ejb-3.0

如果我正在使用BMP bean,是否有任何方法可以避免不必要的往返数据库并提高效率......

这些方法中的任何一种都有用吗? (认证测试中的问题) ejbSave(),ejbStore()或ejbPersist()

在具有数据库,应用程序服务器和Web层的多层体系结构中,您可以通过减少“往返”的网络流量来优化性能。最佳方法是在应用程序服务器级别启动和停止事务,在EJB容器中。所以想知道这些方法有助于减少Bean管理持久性类型bean中不必要的往返行程....我是ejb的新手,所以我试图学习这些概念

ejbSave()和ejbpersist()不存在......

1 个答案:

答案 0 :(得分:2)

您不必处理以下任何方法:' ejbSave(),ejbStore()或ejbPersist()'

  

如果我使用BMP bean,是否有任何方法可以避免不必要的往返数据库

简答:

是的,EntityManager

的方法

长答案:

为避免网络往返数据库,您只需正确设置事务边界即可。当您使用EntityManager提供的方法时(我正在谈论JPA),这些方法会对持久化上下文起作用。持久化上下文是缓存,在提交发生之前,将避免实际的db命中。

<小时/> 以下是TomEE docs

中的一部分
  

JPA 101

     

如果要成功使用JPA(Java,那么)必须了解一件事   持久性API)它是 Cache 的概念。几乎所有东西都沸腾了   在一点或另一点下到缓存。不幸的是,Cache是​​一个   内部事物并没有通过JPA API类公开,因此不容易   从编码的角度来触摸或感受。

     

这是JPA世界的快速备忘单:

     
      
  • 缓存数据副本,复制含义从生活中拉出来   在数据库之外。   
        
    • 刷新缓存是将修改后的数据放回到缓存中的行为   数据库中。
    •   
    • PersistenceContext 本质上是一个缓存。它也往往有   它自己的非共享数据库连接。
    •   
    • EntityManager 代表一个PersistenceContext(因此是一个   高速缓冲存储器)
    •   
    • EntityManagerFactory 创建一个EntityManager(因此也是一个   PersistenceContext /缓存)
    •   
    • 是   负责EntityManager(PersistenceContext / Cache)的创建和   跟踪...    - 您必须使用 EntityManagerFactory 来获取EntityManager    - 生成的 EntityManager 实例 a   PersistenceContext /缓存    - 可以通过 @PersistenceUnit 注入 EntityManagerFactory   仅注释(不是@PersistenceContext)    - 您允许使用@PersistenceContext来引用单位   类型RESOURCE_LOCAL    - 您必须使用 EntityTransaction API开始/提交   每次调用您的EntityManger    - 调用entityManagerFactory.createEntityManager()两次导致   两个单独的EntityManager实例,因此两个分开   PersistenceContexts /缓存。    - 几乎从不拥有多个实例的好主意   正在使用的EntityManager(除非您已被销毁,否则不要创建第二个)   第一个)
    •   
    • 使用容器   将执行EntityManager(PersistenceContext / Cache)创建和跟踪...    - 您无法使用 EntityManagerFactory 获取EntityManager    - 您只能获得容器提供的 EntityManager    - 可以通过 @PersistenceContext 注入 EntityManager   仅注释(不是@PersistenceUnit)    - 你允许使用@PersistenceUnit来引用一个单位   输入TRANSACTION    - 容器给出的 EntityManager 引用   与JTA事务关联的PersistenceContext / Cache。    - 如果没有正在进行的JTA事务,则EntityManager 不能   使用因为没有PersistenceContext / Cache。    - 每个人都有一个EntityManager引用的相同单位   同一交易将自动引用相同   PersistenceContext /缓存    - PersistenceContext / Cache 刷新并在JTA清除   提交时间
    •   
  •   

  

Cache == PersistenceContext

     

数据库缓存的概念是一个非常重要的概念   意识到。当你没有内存中的数据副本(即缓存)时   调用account.getBalance()持久性提供程序必须读取   来自数据库的值。多次调用account.getBalance()   会导致数次访问数据库。这显然是一个很大的问题   浪费资源。拥有缓存的另一面是当你打电话时   account.setBalance(5000)它也没有击中数据库(通常)。什么时候   缓存是&#34;刷新&#34;其中的数据通过尽可能多的数据发送到数据库   根据需要进行SQL更新,插入和删除。这是基础知识   所有java的持久性都包含在一个简单的内容中。如果你可以的话   明白,你几乎可以使用任何持久性技术   java提供。

     

当存在多个并发症时,可能会出现并发症   PersistenceContext / Cache在同一事务中关联相同的数据。   在任何给定的事务中,您只需要一个PersistenceContext / Cache   一组给定的数据。使用带有EntityManager的TRANSACTION单元   由容器创建将始终保证这是这种情况。同   您应该创建和使用的RESOURCE_LOCAL单元和EntityManagerFactory   您的事务中只有一个EntityManager实例,以确保有   对于给定的数据集活动,只有一个活动的PersistenceContext / Cache   反对当前的交易。