gpt4 book ai didi

mysql - Hibernate 如何获取 Identity Insert 上的自动增量值

转载 作者:行者123 更新时间:2023-11-29 09:30:00 24 4
gpt4 key购买 nike

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

大型表具有自动增量主键,并且在 Hibernate 中定义的生成是 IDENTITY。 Show Sql 也是如此。

每当发生插入时,我都会看到数据库中只触发一个查询,这是一个

插入语句。

以下几个问题:

1)我想知道Hibernate如何在插入后获取自动增量值?

2) 如果答案是“SELECT LAST_INSERT_ID()”,为什么它没有出现在 VividCortex 或显示 Sql 日志中...?

3)“SELECT LAST_INSERT_ID()”如何考虑不同表中的多个自动增量?

4) 如果 MySql 在插入时返回一个值,为什么不构建 MySql 客户端以便我们可以看到返回的内容?

提前感谢您的所有帮助。

最佳答案

您应该调用SELECT LAST_INSERT_ID()

实际上,您无法使用另一个 MySQL 客户端执行与 MySQL JDBC 驱动程序相同的操作。您必须编写自己的客户端来读取和写入 MySQL 协议(protocol)。

MySQL JDBC驱动程序通过解析MySQL协议(protocol)的数据包来获取最后的插入id。在此协议(protocol)中,最后的插入 ID 由 MySQL 结果集返回。

这就是 SELECT LAST_INSERT_ID() 未显示在查询指标中的原因。它不是调用该 SQL 语句,而是在协议(protocol)级别从结果集中选取整数。

您询问内部是如何完成的。相关代码行是 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

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

我不会详细讨论协议(protocol)解析。我没有编写 MySQL 协议(protocol)客户端的经验,这不是我想做的事情。

我认为花时间来实现自己的 MySQL 客户端并不是一个好的做法。

关于mysql - Hibernate 如何获取 Identity Insert 上的自动增量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58913654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com