我正在使用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客户机以便我们可以看到返回的内容?
提前谢谢你的帮助。
发布于 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客户端。
发布于 2019-11-18 11:38:30
发布于 2019-11-21 16:04:49
(时间过长,无法发表评论。)
SELECT LAST_INSERT_ID()使用连接中已经可用的值。(这可以解释为什么没有任何日志)。https://stackoverflow.com/questions/58913654
复制相似问题