- 浏览: 3361920 次
- 性别:
- 来自: 珠海
文章分类
- 全部博客 (1633)
- Java (250)
- Android&HTML5 (111)
- Struts (10)
- Spring (236)
- Hibernate&MyBatis (115)
- SSH (49)
- jQuery插件收集 (55)
- Javascript (145)
- PHP (77)
- REST&WebService (18)
- BIRT (27)
- .NET (7)
- Database (105)
- 设计模式 (16)
- 自动化和测试 (19)
- Maven&Ant (43)
- 工作流 (36)
- 开源应用 (156)
- 其他 (16)
- 前台&美工 (119)
- 工作积累 (0)
- OS&Docker (83)
- Python&爬虫 (28)
- 工具软件 (157)
- 问题收集 (61)
- OFbiz (6)
- noSQL (12)
最新评论
-
HEZR曾嶸:
你好博主,这个不是很理解,能解释一下嘛//左边+1,上边+1, ...
java 两字符串相似度计算算法 -
天使建站:
写得不错,可以看这里,和这里的这篇文章一起看,有 ...
jquery 遍历对象、数组、集合 -
xue88ming:
很有用,谢谢
@PathVariable映射出现错误: Name for argument type -
jnjeC:
厉害,困扰了我很久
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# -
TopLongMan:
非常好,很实用啊。。
PostgreSQL递归查询实现树状结构查询
Hibernate提供实现类:org.hibernate.id.MultipleHiLoPerTableGenerator
碰到一个问题:
org.hibernate.id.IdentifierGeneratorHelper类里面的方法:
value:当前值,
factor:model类定义的allocationSize = 100小1,及时99(第一次传入的信息)
上面的方法被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
碰到一个问题:
org.hibernate.id.IdentifierGeneratorHelper类里面的方法:
value:当前值,
factor:model类定义的allocationSize = 100小1,及时99(第一次传入的信息)
public IntegralDataTypeHolder multiplyBy(long factor) { checkInitialized(); value *= factor; return this; },从这里可以看到启动服务器的时候第一次执行到这里,就发现表的主键是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的主键定义示例:
@GeneratedValue(strategy = GenerationType.TABLE,generator="customer_gen") @TableGenerator(name = "customer_gen", table="tb_generator", pkColumnName="gen_name", valueColumnName="gen_value", pkColumnValue="testtable_PK" )
注意,没有设定allocationSize属性,默认是50.
@Override public void saveTestData(int sum) { /* DELETE FROM dbo.testtable3; DELETE FROM dbo.testtable2; DELETE FROM dbo.testtable1; DELETE FROM dbo.testtable; */ Date d1 = new Date(); //单表 for(int i=0; i<sum; i++){ Testtable t = new Testtable(); t.setCode("Test"+i); testtableDao.save(t); //System.out.println("自定义主键生成 记录:"+i+" 单表:"+(new Date()).toString()); } System.out.println("完成单表操作"); //关联 for(int i=0; i<sum; i++){ Testtable1 p = new Testtable1(); p.setCode("P"+i); p = testtable1Dao.save(p); Testtable2 c = new Testtable2(); c.setTesttable1(p); c.setCode("C"+i); testtable2Dao.save(c); //System.out.println("自定义主键生成 记录:"+i+" 关联:"+(new Date()).toString()); } System.out.println("完成关联操作"); //映射 for(int i=0;i<sum; i++){ Testtable t = new Testtable(); t.setCode("T"+i); t = testtableDao.save(t); Testtable2 c = new Testtable2(); c.setCode("C"+i); c = testtable2Dao.save(c); Testtable3 m = new Testtable3(); m.setCode("M"+i); m.setTesttable(t); m.setTesttable2(c); m = testtable3Dao.save(m); //System.out.println("自定义主键生成 记录:"+i+" 映射:"+(new Date()).toString()); } System.out.println("完成映射操作"); System.out.println("Over......"); Date d2 = new Date(); long t = d2.getTime() - d1.getTime(); System.out.println("service耗时=" + (t / 1000) + "s"); }
使用数据库自己的主键生成器的service
pojo的主键定义示例:
@GeneratedValue(strategy = GenerationType.AUTO)
@Override public void saveTestData(int sum) { /* DELETE FROM dbo.atabletest3; DELETE FROM dbo.atabletest2; DELETE FROM dbo.atabletest1; DELETE FROM dbo.atabletest; */ Date d1 = new Date(); //单表 for(int i=0; i<sum; i++){ Atabletest t = new Atabletest(); t.setCode("Test"+i); atabletestDao.save(t); //System.out.println("数据库主键生成 记录:"+i+" 单表:"+(new Date()).toString()); } System.out.println("完成单表操作"); //关联 for(int i=0; i<sum; i++){ Atabletest1 p = new Atabletest1(); p.setCode("P"+i); p = atabletest1Dao.save(p); Atabletest2 c = new Atabletest2(); c.setAtabletest1(p); c.setCode("C"+i); atabletest2Dao.save(c); //System.out.println("数据库主键生成 记录:"+i+" 关联:"+(new Date()).toString()); } System.out.println("完成关联操作"); //映射 for(int i=0;i<sum; i++){ Atabletest t = new Atabletest(); t.setCode("T"+i); t = atabletestDao.save(t); Atabletest2 c = new Atabletest2(); c.setCode("C"+i); c = atabletest2Dao.save(c); Atabletest3 m = new Atabletest3(); m.setAtabletest(t); m.setAtabletest2(c); m.setCode("M"+i); m = atabletest3Dao.save(m); //System.out.println("数据库主键生成 记录:"+i+" 映射:"+(new Date()).toString()); } System.out.println("完成映射操作"); System.out.println("Over......"); Date d2 = new Date(); long t = d2.getTime() - d1.getTime(); System.out.println("service耗时=" + (t / 1000) + "s"); }
调用service的controller方法
@RequestMapping("/test") public ModelAndView test(@RequestParam("flag") int flag, @RequestParam("sum") int sum) { if (flag == 1) { Date d1 = new Date(); testtableManager.saveTestData(sum); Date d2 = new Date(); long t = d2.getTime() - d1.getTime(); System.out.println("使用自定义主键生成器"); System.out.println("记录数:"+(sum*6)+" 耗时=" + (t / 1000) + "s"); } else if (flag == 0) { Date d1 = new Date(); atabletestManager.saveTestData(sum); Date d2 = new Date(); long t = d2.getTime() - d1.getTime(); System.out.println("使用数据库主键生成器"); System.out.println("记录数:"+(sum*6)+" 耗时=" + (t / 1000) + "s"); } else { } return null; }
测试结果:
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
发表评论
-
spring配置事物的方式:注解和aop配置
2016-05-14 00:26 4056参考: Spring AOP中pointcut express ... -
写个mybatis的拦截插件,实现将所有执行的sql写入文件里
2016-05-12 15:59 5057原文 http://3131854.blog.51cto.co ... -
Mybatis分库分表扩展插件
2016-05-12 15:47 1584http://fangjialong.iteye.com/bl ... -
spring+mybatis+atomikos 实现JTA事务
2016-05-11 22:00 5469sping配置多个数据源 不同用户操作不同数据库 http:/ ... -
ibatis扩展支持主键生成的方法(非数据库方式)
2016-04-13 22:01 938http://blog.csdn.net/warison200 ... -
ibatis 动态 Mapped Statement
2016-03-31 17:02 818http://www.cnblogs.com/lcngu/p/ ... -
分布式事务管理
2016-03-31 16:43 990http://my.oschina.net/pingpangk ... -
ibatis中动态查询表返回用resultClass="java.util.HashMap" 的问题
2016-03-11 10:49 1078http://blog.csdn.net/dyllove98/ ... -
Mybatis传多个参数(三种解决方案)
2016-03-07 17:46 1400http://my.oschina.net/ydsakyclg ... -
mybatis --mapper配置文件中大于小于怎么处理
2016-03-04 14:21 2323http://blog.csdn.net/nich002/ar ... -
Mybatis 数据库物理分页插件 PageHelper
2015-11-28 01:09 2742http://www.cnblogs.com/digdeep/ ... -
Druid 的SQL翻译功能如何使用
2015-11-27 21:40 1924Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接 ... -
[MyBatis]mapperLocations属性通配符的使用
2015-11-26 10:49 6162http://blog.csdn.net/szwangdf/a ... -
Hibernate Validation使用示例及讲解
2015-11-22 21:06 2702http://wdmcygah.iteye.com/blog/ ... -
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
2015-11-17 17:54 20004http://blog.csdn.net/weibing_hu ... -
SpringMVC + Mybatis + Shiro 权限整合
2015-11-14 14:06 8697详细见参考文章: 基于Spring + Spring MVC ... -
MyBatis3 的Mapper XML 文件详解
2015-11-13 11:54 1310MyBatis3 的Mapper XML 文件http://m ... -
HibernateDao.java
2015-11-10 15:55 1128http://my.oschina.net/lizy/blog ... -
Hibernate envers开发指南
2015-10-24 00:44 1191http://www.blogjava.net/xmatthe ... -
Spring+Ibatis数据库水平分库
2015-09-13 21:15 1257Spring+Ibatis数据库水平分库 http://blo ...
相关推荐
NULL 博文链接:https://mqyl1.iteye.com/blog/1098358
一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn( name="planetype", discriminatorType=...
JPA的基本注解主要包括@Entity、@Table、@Id、@GeneratedValue、@Basic、@Column、@Transient、@Temporal和@TableGenerator等。
这是JPA标签配置手册,从ORACLE官方得到的资料,里面对JPA所有的标签都进行详细的说明。 Index of Annotations ...o @TableGenerator o @Temporal o @Transient • U o @UniqueConstraint • V o @Version
JPA注解1.1 @Entity1.2 @Table1.3 @Id1.4 @GeneratedValue1.5 @Basic1.6 @Column1.7 @Transient1.8 @Temporal1.9 @TableGenerator 1. JPA注解 1.1 @Entity 标注在实体类上,表示此类对应一个数据表。 1.2 @Table 与...
探索 Hibernate 新 TableGenerator 机制 服务好“最后一公里”,高效CDN架构经验 探索推荐引擎内部的秘密 一起 select 引起的崩溃 课堂上传纸条如何防范中间人攻击? 程序人生 《9Tech访谈录》揭秘游戏王子白泽的...
表格生成器-ST3插件甲崇高文本3插件用于将CSV状文本到其它可读表格格式在适当位置。 转换器内部的功劳 。 演示:安装将存储库克隆到Sublime Text“ Packages”目录中: git clone ...
javax.persistence.TableGenerator.class javax.persistence.Temporal.class javax.persistence.TemporalType.class javax.persistence.TransactionRequiredException.class javax.persistence.Transient.class ...