Hibernate使用自定义主键生成器@TableGenerator和数据库自身生成器的性能测试

Hibernate提供实现类:org.hibernate.id.MultipleHiLoPerTableGenerator
碰到一个问题:
org.hibernate.id.IdentifierGeneratorHelper类里面的方法:
value:当前值,
factor:model类定义的allocationSize = 100小1,及时99(第一次传入的信息)

,从这里可以看到启动服务器的时候第一次执行到这里,就发现表的主键是tb_generator(保存主键信息)表的gen_value的allocationSize倍数。那么会浪费掉很多主键值。
上面的方法被org.hibernate.id.enhanced.OptimizerFactory的public synchronized Serializable generate()调用,maxLo同时初始化这个变量,这个变量maxLo+1就是factor。

hibernate中自定义主键生成器:http://panyongzheng.iteye.com/blog/1827786
探索 Hibernate 新 TableGenerator 机制 http://www.ibm.com/developerworks/cn/java/j-lo-tablegenerator/index.html?ca=drs-
探索 Hibernate 新 TableGenerator 机制 http://www.itpub.net/thread-1822509-1-1.html

Hibernate的主键生成策略与并发测试http://blog.sina.com.cn/s/blog_56d8ea900100xb8h.html
一些重要的知识,可以在这里看到.

SpringMVC3.x, Hiberante4, sql server 2008, 数据库的VM内存2G, 本机的web环境内存8G(VM在本机上建立的), j2ee环境option内存:1G.  服务器:jetty,  idea采用非调试启动.
这里不想讨论为什么使用@TableGenerator, 因为没必要,只是比较性能而已.

在运行是, 没有手动session.flush()等操作.

使用自定义主键生成器的service
pojo的主键定义示例:

注意,没有设定allocationSize属性,默认是50.

使用数据库自己的主键生成器的service
pojo的主键定义示例:

调用service的controller方法

测试结果:
10万级别的,自定义要快一点, .
1万级别的,数据库自己的主键要快一点, .
1000条级别的,自定义要快一点 .

60w条数据:
使用自定义主键生成器:
service耗时=142s 耗时=1195s, service耗时=130s 耗时=1587s
使用数据库主键生成器
service耗时=974s 耗时=1284s, service耗时=971s 耗时=1662s

6w条数据:
使用自定义主键生成器:
service耗时=13s 耗时=94s, service耗时=12s 耗时=92s, service耗时=12s 耗时=104s
使用数据库主键生成器
service耗时=89s 耗时=92s, service耗时=82s 耗时=85s, service耗时=90s 耗时=93s

6000条数据:
使用自定义主键生成器:
service耗时=1s 耗时=10s, service耗时=1s 耗时=10s, service耗时=1s 耗时=11s
使用数据库主键生成器
service耗时=9s 耗时=10s, service耗时=10s 耗时=12s, service耗时=8s 耗时=10s