我刚刚在探查器下测试了我的应用程序,发现sql字符串占用了大约30%的内存!这很奇怪.
应用程序内存中存储了很多像这样的字符串.这是由hibernate生成的SQL查询,请注意不同的数字和尾随下划线:
select avatardata0_.Id as Id4305_0_,...... where avatardata0_.Id=? for update
select avatardata0_.Id as Id4347_0_,...... where avatardata0_.Id=? for update
Run Code Online (Sandbox Code Playgroud)
这是我无法理解的部分.为什么hibernate必须为每个查询生成具有不同标识符的不同sql字符串,如" Id4305_0_ "?为什么不能为所有相同的查询使用一个查询字符串?这是绕过查询缓存的某种技巧吗?
如果有人能形容我为什么会这样,以及如何避免这种资源浪费,我将不胜感激.
UPDATE
好.我找到了.假设内存泄漏我错了,这是我的错.Hibernate按预期工作.
我的应用程序在10个线程中创建了121(!)SessionFactories,它们生成了大约2300个SingleTableEntityPersisters实例.每个SingleTableEntityPersister生成大约15个具有不同标识符的SQL查询.Hibernate被迫生成大约345,000个不同的SQL查询.一切都很好,没什么奇怪的:)
我有很多表,由于某些原因,我需要在应用程序启动时调整此表的自动增量值.
我试着这样做:
mysql> select max(id) from item;
+----------+
| max(id) |
+----------+
| 97972232 |
+----------+
1 row in set (0.05 sec)
mysql> alter table item auto_increment=1097972232;
Run Code Online (Sandbox Code Playgroud)
在另一场会议中:
afrolov@A1-DB1:~$ mysql -u root -e "show processlist" | grep auto_increment
472196 root localhost test Query 39 copy to tmp table alter table item auto_increment=1097972232
Run Code Online (Sandbox Code Playgroud)
MySQL正在开始重建表!为什么MySQL需要这样做?如何在调整auto_increment值时避免重建大表?
MySQL 5.0,InnoDB.
表定义:
CREATE TABLE `item` (
`id` bigint(20) NOT NULL auto_increment,
`item_res_id` int(11) NOT NULL default '0',
`stack_count` int(11) NOT NULL default '0',
`position` int(11) NOT …Run Code Online (Sandbox Code Playgroud)