有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate+并发插入(MySQL插入忽略)

我正在学习使用Hibernate。我想知道如何在hibernate中正确地执行并发插入

我将url表定义为:

CREATE TABLE `urls` (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    md5 CHAR(32) UNIQUE, 
    url TEXT
);

该表用于维护映射id<-&燃气轮机;网址。 md5字段是来自url的md5和,因为通常url可以超过1024字节,这是mysql中唯一约束的限制

我的问题是关于url的查询->;id函数处理并发性。在JDBC实现中,我执行以下步骤:

  1. 选择md5=md5(url)的id
  2. 如果存在,则返回id,否则:
  3. 将忽略插入url(md5,url)值(md5(url),url)
  4. 重试步骤1

即使在第2步和第3步之间插入请求的url,它也能很好地工作。如何使用Hibernate实现这一点


共 (1) 个答案

  1. # 1 楼答案

    您可以使用注释@SQLInsert。它允许您指定在插入期间使用哪个SQL语句。问题是:Hibernate不仅仅是插入/更新/选择数据库中的数据。这就是说,我很确定一开始只使用@SQLInsert可能会起作用,但我不确定当您遇到您描述的场景(步骤2和步骤3之间的并发插入)时,Hibernate将如何运行,特别是因为它不执行步骤4。相反,它调用JDBC的“getGeneratedKeys”来检索生成的ID(我怀疑,如果忽略插入,ID将为null)

    简而言之:我看到的唯一解决方案是使用@SQLInsert,但您需要使用它,并确保在并发插入发生时Hibernate的行为正确