首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate如何获得标识插入的AutoIncrement值

问Hibernate如何获得标识插入的AutoIncrement值
EN

Stack Overflow用户
提问于 2019-11-18 11:33:10
回答 3查看 435关注 0票数 0

我正在使用Hibernate和MySQL开发35000 Qps级的高规模应用程序。

大型表具有AutoIncrement主键,在Hibernate中定义的生成是标识。显示Sql也是正确的。

每当插入发生时,在DB中只会触发一个查询,即

插入语句。

以下几个问题如下:

1)我想知道Hibernate是如何在插入后获得AutoIncrement值的?

2)如果答案是“选择LAST_INSERT_ID()",为什么它不出现在VividCortex或show中?

3)“选择LAST_INSERT_ID()”如何解释不同表中的多个自动增量?

4)如果MySql在Insert上返回一个值,为什么没有构建MySql客户机以便我们可以看到返回的内容?

提前谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-21 17:17:43

你应该打电话给SELECT LAST_INSERT_ID()。

实际上,您不能使用另一个MySQL客户端执行与MySQL JDBC驱动程序相同的操作。您必须编写自己的客户机来读写MySQL协议。

MySQL JDBC驱动程序通过解析MySQL协议的数据包获得最后一个insert id。最后一个insert id在此协议中由MySQL结果集返回。

这就是为什么SELECT LAST_INSERT_ID()没有出现在查询度量中的原因。它不是调用SQL语句,而是在协议级别从结果集中选择整数。

你问内部是怎么做的。相关的代码行是https://github.com/mysql/mysql-connector-j/blob/release/8.0/src/main/protocol-impl/java/com/mysql/cj/protocol/a/result/OkPacket.java#L55。

基本上,它在接收结果集时从数据包中的已知位置解析一个整数。

我不打算再详细讨论解析协议的问题了。我没有编写MySQL协议客户端的经验,这不是我想要做的事情。

我认为这不会很好地利用您的时间来实现您自己的MySQL客户端。

票数 1
EN

Stack Overflow用户

发布于 2019-11-18 11:38:30

  1. 它可能使用标准JDBC机制获取生成的值。
  2. 不是这样的
  3. 在插入一个表后立即执行它,从而获得由该插入生成的值。但这不是我们所使用的,所以这是不相关的
  4. 不清楚这是什么意思:使用标准的JDBC API,MySQL JDBC驱动程序允许这样做。
票数 0
EN

Stack Overflow用户

发布于 2019-11-21 16:04:49

(时间过长,无法发表评论。)

  • SELECT LAST_INSERT_ID()使用连接中已经可用的值。(这可以解释为什么没有任何日志)。
  • 每个表都有自己的auto_inc值。
  • (我不知道Hibernate的任何细节。)
  • 35K qps是可能的,但这并不容易。
  • 请给我们更详细的查询-选择?写? 35K插入?
  • 你在用任何方式批次插入吗?你需要这样做。
  • 那么您在其中使用的是auto_inc值吗?
  • 你用BEGIN..COMMIT吗?自动提交的价值是什么?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58913654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档