您的位置:首页 > 编程语言 > Java开发

Spring data 接口性能分析

2016-01-18 17:20 603 查看
虽说spring data 封装了对数据库 的操作,大大简化了程序Dao 层的开发,但是凡事有利有弊,使用方式简单了,那么性能如何呢?笔者就以Spring data 的deleteAll()方法来做简单的说明:在myslq 5 环境下,对1000 条测试数据进行删除

一 测试用例:

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 的方法,纵使某些实体并不需要一些方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: