java mysql并发写入,java – Hibernate并发插入(MySQL INSERT IGNORE)

我正在学习使用Hibernate.我想知道如何正确地在休眠中进行并发插入.

我有一个url表定义为:

CREATE TABLE `urls` (

id INT PRIMARY KEY AUTO_INCREMENT,

md5 CHAR(32) UNIQUE,

url TEXT

);

该表的目的是维护映射id< - >网址.

md5字段是来自url的md5和,因为通常url可以长于1024字节,这是mysql中UNIQUE约束的限制.

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

> SELECT id WHERE md5 = md5(url);

>如果存在,则返回id,否则:

> INSERT IGNORE INTO urls(md5,url)VALUES(MD5(url),url);

>重试步骤1.

即使在步骤2和3之间插入请求的url,它仍然可以正常工作.如何使用Hibernate执行此操作?

解决方法:

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

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

标签:java,mysql,hibernate,jdbc

来源: https://codeday.me/bug/20190705/1382536.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值