我试图掌握冬眠在幕后所做的事情,并且我将p6spy用作mysql jdbc驱动程序的代理,以便可以看到数据库的真正含义。但是,我对p6spy的输出感到有些困惑-感谢任何光线!
问题是这样的。我正在创建类Test1的两个新对象,即test1a和test1b。我的日志中的输出如下:
Hibernate:
/* insert com.play.hibernate1.Test1
*/ insert
into
Test1
(name, value, id)
values
(?, ?, ?)
1274973057265|1|1|batch|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values (?, ?, ?)|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values ('Test 1', 10, 5)
Hibernate:
/* insert com.play.hibernate1.Test1
*/ insert
into
Test1
(name, value, id)
values
(?, ?, ?)
1274973057265|0|1|batch|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values (?, ?, ?)|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values ('Test 2', 20, 6)
1274973057267|2|1|statement|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values (?, ?, ?)|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values ('Test 2', 20, 6)
1274973057268|0|1|commit||
我可以看到两个“batch”语句,大概是从对jdbc addBatch api的调用中得出的,但是“1274973057267 | 2 | 1 | statement”在那里做什么?它看起来像第二次插入正在重复,但是我知道不是这样,否则我会在数据库中看到3行,而不是2行,或者至少是一个错误。
为什么我看到第二条插入语句重复出现?
如果我在spy.properties中排除“batch”,则只会看到这条奇怪的流氓行。
感谢您的照明!
最佳答案
嗯-我看到了这个问题,这似乎是由于我不得不说的是p6spy中一个相当令人惊讶的设计决定。
显然,对于批处理语句,已决定在将语句添加到批处理时记录日志,然后在实际执行批处理时显示已执行的LAST语句!一旦您知道了该工具的功能,我想您就可以理解为什么要使用它,但是除非您碰巧在这里阅读了该线程,否则它是完全令人困惑和违反直觉的:
http://sourceforge.net/projects/p6spy/forums/forum/166969/topic/666877