Hibernate:10个或更多用户同时插入记录时出现异常

Posted

技术标签:

【中文标题】Hibernate:10个或更多用户同时插入记录时出现异常【英文标题】:Hibernate: Exception when 10 or more users insert a record concurrently 【发布时间】:2017-02-27 22:41:47 【问题描述】:

我有一个适用于 Spring MVC 和 Hibernate 的应用程序。如果单个用户插入记录,它工作正常,但如果多个用户同时插入记录。它显示此错误“Hibernate:org.hibernate.AssertionFailure:null id in”。我可以观察到这种情况正在发生,因为由于同一时间,hibernate 对所有记录的自动主 id 生成可能是相似的。对此不确定。请帮忙。需要一个关键的修复。

我使用的代码如下

@Transactional
public Account addAccount(Account acct) 

      session = sessionFactory.getCurrentSession();
      session.save(acct);
      session.flush();
      session.clear();
      return acct;


【问题讨论】:

org.hibernate.AssertionFailure: null id in entry (don't flush the Session after an exception occurs)的可能重复 那个问题完全不一样,我读过。在提出我的问题之前 发布映射的实体。 ID是如何生成的? 你为什么要调用 session.clear();也不需要调用 session.flush(); 你得到了什么异常? 【参考方案1】:

如果您遇到并发问题,请考虑创建此类:

public AccountConcurrencyUtils 

    public static synchronized Account addAccount(Account acct, SessionType session) 
        session = sessionFactory.getCurrentSession();
        session.save(acct);
        session.flush();
        session.clear();
        return acct;
    


最后在你的代码中:

@Transactional
public Account addAccount(Account acct) 
    return AccountConcurrencyUtils.addAccount(acct, session);

这应该可以证明并发问题,如果您使用的是 Java 7,应该有更好的解决方法,但这应该 解决你的问题,如果它是关于并发的,如果不是,问题可能是其他的。

我更新了代码,输入了您正在使用的 Session 类型,即使对于 Java 5 等较旧的 Java 版本,这也应该可以工作

【讨论】:

非常感谢你是天才。这可以在 java 8 上使用吗

以上是关于Hibernate:10个或更多用户同时插入记录时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

获取具有2个或更多条件的foreach循环的值

在单个 Activity 中使用 2 个或更多 Firebase Realtime DB

C++ 同时接收 2 个或更多 UDP 消息

将 iOS 中的 UIlabel 文本字段限制为两个字符,输入 3 个或更多时重置

vertx中数据库操作的并发问题

Hive:无法在具有 100 个或更多分区列的表中插入数据错误:在最大长度为 767 的列“PART_NAME”中