如果我正在使用BMP bean,是否有任何方法可以避免不必要的往返数据库并提高效率......
这些方法中的任何一种都有用吗? (认证测试中的问题) ejbSave(),ejbStore()或ejbPersist()
在具有数据库,应用程序服务器和Web层的多层体系结构中,您可以通过减少“往返”的网络流量来优化性能。最佳方法是在应用程序服务器级别启动和停止事务,在EJB容器中。所以想知道这些方法有助于减少Bean管理持久性类型bean中不必要的往返行程....我是ejb的新手,所以我试图学习这些概念
ejbSave()和ejbpersist()不存在......
答案 0 :(得分:2)
您不必处理以下任何方法:' ejbSave(),ejbStore()或ejbPersist()'
如果我使用BMP bean,是否有任何方法可以避免不必要的往返数据库
为避免网络往返数据库,您只需正确设置事务边界即可。当您使用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 反对当前的交易。