Spring data 接口性能分析
2016-01-18 17:20
603 查看
虽说spring data 封装了对数据库 的操作,大大简化了程序Dao 层的开发,但是凡事有利有弊,使用方式简单了,那么性能如何呢?笔者就以Spring data 的deleteAll()方法来做简单的说明:在myslq 5 环境下,对1000 条测试数据进行删除
一 测试用例:
二 测试分析:
spring data 自带的deleteAll 方法执行时sql:
原生sql 执行delete 方法:
这样效率就一目了然了。
四 总结:
1. Spring data 虽然说使用方便,但是有些方法性能却不高,要选择使用。
2. Spring data 提供接口比较多, 在项目管理的时候,如果不做强制约束,随意继承Repository 接口,那么不利于代码统一维护, 或许需要自定义接口
3. 如果统一 继承JpaRepository 的话, 会导致所有的实体都具有jpaRepository 的方法,纵使某些实体并不需要一些方法。
一 测试用例:
package org.zgf.spring.data.service; import java.util.Date; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.zgf.spring.data.base.BaseTest; import org.zgf.spring.data.entity.StudentPO; /** * 性能测试分析 * @ClassName: Test_compare_performance * @Description: * @author: zonggf * @date: 2016年1月18日-下午1:32:33 */ public class Test_compare_performance extends BaseTest { @Autowired private IStudentService studentService; private int batchSize = 1000; @Test public void test_add_50000() { Long start = System.currentTimeMillis(); StudentPO studentPO = null; for (int i = 0; i < batchSize; i++) { studentPO = createStudentPO(i); this.studentService.save(studentPO); } Long end = System.currentTimeMillis(); System.out.println("mysql " + batchSize + "条数据时间:" + (end - start)); } @Test public void test_delete_sql() { Long start = System.currentTimeMillis(); this.studentService.deleteAllBySql(); ; Long end = System.currentTimeMillis(); System.out.println("mysql 删除" + batchSize + " 条数据时间:" + (end - start)); // Hibernate: delete from spj_student_2 // mysql 删除1000条数据时间:186 // mysql 删除1000 条数据时间:180 } @Test public void test_delete_spjpa() { Long start = System.currentTimeMillis(); this.studentService.deleteAll(); Long end = System.currentTimeMillis(); System.out.println("mysql 删除" + batchSize + " 条数据时间:" + (end - start)); // mysql 删除1000 条数据时间:862 // mysql 删除2000 条数据时间:1593 } private StudentPO createStudentPO(int index) { return new StudentPO("zong_" + index, "man", new Date(), new Date(), 20); } }
二 测试分析:
spring data 自带的deleteAll 方法执行时sql:
Hibernate: select studentpo0_.id as id1_0_, studentpo0_.age as age2_0_, studentpo0_.birth as birth3_0_, studentpo0_.create_time as create_t4_0_, studentpo0_.name as name5_0_, studentpo0_.sex as sex6_0_ from spj_student studentpo0_ Hibernate: delete from spj_student where id=? Hibernate: delete from spj_student where id=? Hibernate: delete from spj_student where id=? Hibernate: delete from spj_student where id=? Hibernate: delete from spj_student where id=? Hibernate: delete from spj_student where id=?
原生sql 执行delete 方法:
Hibernate delete from spj_student_2
这样效率就一目了然了。
四 总结:
1. Spring data 虽然说使用方便,但是有些方法性能却不高,要选择使用。
2. Spring data 提供接口比较多, 在项目管理的时候,如果不做强制约束,随意继承Repository 接口,那么不利于代码统一维护, 或许需要自定义接口
3. 如果统一 继承JpaRepository 的话, 会导致所有的实体都具有jpaRepository 的方法,纵使某些实体并不需要一些方法。
相关文章推荐
- 关于JAVA中Map集合的遍历
- 【17】EL表达式
- JAVA字符串格式化-String.format()的使用
- 怎么在Eclipse中添加VI插件
- 怎么在Eclipse中添加VI插件
- Javaweb学习总结(五):JavaBean的作用域
- java/scala下的最好用的数据绘图工具breeze-viz
- Java用户线程和守护线程
- Java GC专家系列1:理解Java垃圾回收
- java 自定义注解使用
- wamp和Eclipse搭建PHP环境
- mongdb java 实例
- java for循环的几种写法
- 非常好的Java反射例子
- java 拦截器,监听器,过滤器比较
- Java 多线程
- JAVA字符串的基本用法(转)
- 【Java】List集合按数量分组
- Ubuntu14.04安装JDK与配置环境变量
- struts,Hibernate,Spring三大框架整合错误分析