【问题标题】:Issue with hibernate entity manager on multiple servers多个服务器上的休眠实体管理器问题
【发布时间】:2015-09-13 21:22:34
【问题描述】:

我在 dropwizard 框架中使用休眠。 应用程序的配置:为多个服务器的后端提供负载均衡器。 问题是当我保存新记录时,记录会保存在数据库中。但是当我试图从指向同一个数据库的不同服务器获取记录时,我无法获取新创建的行。它仅存在于创建它的服务器中。 Hibernate 缓存在属性中被标记为 false。 谁能建议我缺少什么?或任何提示。

代码:

保存api:

@Transactional
public ID save(T entity) {
    EntityManager em = getEntityManager();
    if (em.contains(entity) ) {
        em.merge(entity);
    } else {
        em.persist(entity);
    }
    em.flush();
    return (ID) entity.getId();
}

获取接口:

  public T findOne(final ID id) {
    EntityManager em = getEntityManager();

    T entity = em.find(getEntityClass(), id);
    em.flush();
    return entity;
}

【问题讨论】:

  • 你能展示你代码的相关部分吗?
  • 您使用的是哪个版本的 dropwizard 和 hibernate?

标签: database hibernate entitymanager dropwizard hibernate-entitymanager


【解决方案1】:

这是 JPA 的一个问题。

JPA 在后台执行一些神奇的操作来加速与数据库的事务。 (这是一个基本概述)

实体管理器为加快处理速度所做的一些工作是缓存和批量查询。
缓存是个问题,因为:

Server 1 commits a new object to the database, and the data is flushed
Server 2 fetch request to get objects
    Server 2 has the data its fetching in cache so it returns the data without the new object

有多种方法可以确保不会发生这种情况:

1.) 让一个实体管理器在处理所有数据库交互的服务器上设置服务。

2.) 设置一个主实体管理器,在其他服务器的实体管理器之间同步(缓存)数据。

还有其他方法可以解决这个问题,但我相信这是最好的两种方法。

更好的答案---- JPA with Multiple Servers 基于 Eclipse 链接。

【讨论】:

  • 使用的标准做法是什么?
  • @Arjit 就标准而言,我不是 100% 确定的。我只使用了我列出的方式。除此之外,我们的商店主要是 db2 / SQL,所以我们绝不是 JPA 专家。你最好问问别人。 (我宁愿不要误导你)
【解决方案2】:

虽然没有看到相关代码我们无法确定,但这听起来像是数据根本没有写入数据库,或者没有被提交,因此对其他事务不可见。

为了验证,这是问题的原因,主动记录sql语句和事务并验证

  1. 您的数据被写入数据库。您应该会在日志中看到相关的 sql 语句。

  2. 事务在之后被提交。

【讨论】:

  • 保存实体代码:@Transactional public ID save(T entity) { EntityManager em = getEntityManager(); if (em.contains(entity)) { em.merge(entity); } 其他 { em.persist(entity); } em.flush();返回 (ID) entity.getId(); } ...... 获取实体代码: public T findOne(final ID id) { EntityManager em = getEntityManager(); T 实体 = em.find(getEntityClass(), id); em.flush();返回实体; }
  • .. 保存后,我可以看到数据库中的数据,甚至可以在创建它的服务器上获取调用,但是当在 diff 服务器上进行获取调用时,我找不到记录。
  • @Ankush 你不希望有人真正阅读你在评论中压扁的代码,是吗?
  • 谢谢..我已经更新了问题本身的代码部分......现在它的可读格式......
  • “我可以看到数据库中的数据”是什么意思?日志记录是否真的表明发生了提交?
猜你喜欢
  • 2014-08-25
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 2015-07-28
  • 1970-01-01
  • 2017-04-23
相关资源
最近更新 更多