小编And*_*lov的帖子

Hibernate为每个查询生成不同的SQL

我刚刚在探查器下测试了我的应用程序,发现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查询.一切都很好,没什么奇怪的:)

java sql performance memory-leaks hibernate

21
推荐指数
1
解决办法
4813
查看次数

慢auto_increment重置

我有很多表,由于某些原因,我需要在应用程序启动时调整此表的自动增量值.

我试着这样做:

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)

mysql innodb auto-increment

5
推荐指数
2
解决办法
5302
查看次数