JPA批量操作及性能比对
假设需要批量插入10000条实体数据至数据库。如下是各个操作方法及耗时
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
@Autowired
private JdbcTemplate jdbcTemplate;
public void jdbc(List<String> list){
int[] updatedCountArray=jdbcTemplate.batchUpdate("INSERT INTO customer (name) VALUES (?);", new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement preparedStatement, int i) throws SQLException {
preparedStatement.setString(1,list.get(i));
}
@Override
public int getBatchSize() {
return list.size();
}
});
}
package net.xjdsz.model;
import javax.persistence.*;
/**
* Created by dingshuo on 2017/6/23.
*/
@Entity
@Table(name = "customer", schema = "test", catalog = "")
public class CustomerEntity {
private int id;
private String name;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Basic
@Column(name = "name", nullable = true, length = 100)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CustomerEntity that = (CustomerEntity) o;
if (id != that.id) return false;
if (name != null ? !name.equals(that.name) : that.name != null) return false;
return true;
}
@Override
public int hashCode() {
int result = id;
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}
}
private EntityManager em;
@PersistenceContext(name = "EntityManagerFactory")
public void SetEntityManager(EntityManager em) {
this.em = em;
}
@Transactional
public void saveBatch(List<CustomerEntity> list) {
for (int i = 0; i < 10000; i++) {
em.persist(list.get(i));
if (i % 1000 == 0) {
em.flush();
em.clear();
}
}
}
package net.xjdsz.dao;
import net.xjdsz.model.CustomerEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* Created by dingshuo on 2017/6/23.
*/
@Repository
public interface CustomerRepository extends JpaRepository<CustomerEntity,Integer> {
}
@Transactional
public void saveBatchJpa(List<CustomerEntity> list) {
repository.save(list);
}
package net.xjdsz;
import net.xjdsz.dao.CustomerRepository;
import net.xjdsz.dao.TestService;
import net.xjdsz.model.CustomerEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* Created by dingshuo on 2017/6/23.
*/
@RestController
public class TestController {
@Autowired
TestService service;//测试用的Service类
@Autowired
CustomerRepository repository; //实体Repository接口
@GetMapping(value = "/test")
public void test(){
List<String> list=new ArrayList<>(); //给jdbctemplate用的集合
List<CustomerEntity> customerEntityList=new ArrayList<>();//给jpa用的集合
for(int i=0;i<10000;i++){
list.add("学生"+i);
CustomerEntity customerEntity=new CustomerEntity();
customerEntity.setName("学生"+i);
customerEntityList.add(customerEntity);
}
//1.jdbc
long startTime=System.currentTimeMillis(); //获取开始时间
service.jdbc(list);
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("jdbc程序运行时间: "+(endTime-startTime)+"ms");
//2.jpa-em
long startTime1=System.currentTimeMillis(); //获取开始时间
service.saveBatch(customerEntityList);
long endTime1=System.currentTimeMillis(); //获取结束时间
System.out.println("JPA-EM程序运行时间: "+(endTime1-startTime1)+"ms");
//3.jpa-循环
long startTime2=System.currentTimeMillis(); //获取开始时间
for(int i=0;i<customerEntityList.size();i++){
repository.save(customerEntityList.get(i));
}
long endTime2=System.currentTimeMillis(); //获取结束时间
System.out.println("JPA-循环程序运行时间: "+(endTime2-startTime2)+"ms");
//4.jpa-集合
long startTime3=System.currentTimeMillis(); //获取开始时间
repository.save(customerEntityList);
long endTime3=System.currentTimeMillis(); //获取结束时间
System.out.println("JPA-集合程序运行时间: "+(endTime3-startTime3)+"ms");
}
}
jdbc程序运行时间: 878ms
JPA-EM程序运行时间: 2018ms
JPA-循环程序运行时间: 21915ms
JPA-集合程序运行时间: 2373ms
@Transactional
public <S extends T> List<S> save(Iterable<S> entities) {
List<S> result = new ArrayList<S>();
if (entities == null) {
return result;
}
for (S entity : entities) {
result.add(save(entity));
}
return result;
}
/*
* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#save(java.lang.Object)
*/
@Transactional
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
JPA批量操作及性能比对的更多相关文章
- jpa batch批量操作save和persist比较
1.网上最常见的JPA----entityManager批量操作方法 private EntityManager em; @PersistenceContext(name = "Entity ...
- 深入浅出学Spring Data JPA
第一章:Spring Data JPA入门 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map ...
- JPA基础
目录 目录 1 一.JPA基础 2 1.1 JPA基础 2 1.2JPA开发过程 3 1.3 实体的生命周期及实体管理器常用方法 4 二.环境搭建 5 2.1 添加JPA支持 6 2.2 添加配置文件 ...
- Spring Data Jpa配置
Spring Data JPA提供的接口,也是Spring Data JPA的核心概念: 1:Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组 ...
- JPA && Spring Data && Spring Data JPA
1.JPA Java Persistence API,用于对象持久化的一组API,JPA本身是一组规范,让开发者用同一种方式访问不同的ORM框架.其实也就是java实体对象和关系型数据库建立起映射关 ...
- JPA学习笔记
一.JPA基础1.1 JPA基础JPA: java persistence api 支持XML.JDK5.0注解俩种元数据的形式,是SUN公司引入的JPA ORM规范 元数据:对象和表之间的映射关系 ...
- Spring Boot 系列教程2-Data JPA
Spring Data JPA 用来简化创建 JPA 数据访问层和跨存储的持久层功能. 官网文档连接 http://docs.spring.io/spring-data/jpa/docs/curren ...
- Spring Data JPA 入门Demo
什么是JPA呢? 其实JPA可以说是一种规范,是java5.0之后提出来的用于持久化的一套规范:它不是任何一种ORM框架,在我看来,是现有ORM框架在这个规范下去实现持久层. 它的出现是为了简化现有的 ...
- Spring Data JPA 初体验
一,JPA相关的概念 JPA概述 全称是:JavaPersistence API.是SUN公司推出的一套基于ORM的规范. Hibernate框架中提供了JPA的实现. JPA通过JDK 5.0注解或 ...
随机推荐
- springboot-mybatis双数据源配置
yml文件 spring: datasource: test1: driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://localhost: ...
- 第二周<导学/分类>
分类学习 分类算法各有不同 knn naivebyes regression dnn sklearn.linear_modlel 线性函数 sklearn.preprocessing 非线性函数 分类 ...
- placeholder颜色更改
::-webkit-input-placeholder { /* WebKit browsers */ color:#999; } :-moz-placeholder { /* Mozilla Fir ...
- Linux常用命令2 权限管理命令
1.权限管理命令:chmod 上面图片中的ugoa与rwx并不是一个命令,而是不同选项 u 所有者 g 所属组 o 其他人 a 所有人 r 读取权限 w写入权限 x 执行权限 chmod u+x ...
- Leetcode746.Min Cost Climbing Stairs使用最小花费爬楼梯
数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始). 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯. 您需 ...
- 小爬爬4.协程基本用法&&多任务异步协程爬虫示例(大数据量)
1.测试学习 (2)单线程: from time import sleep import time def request(url): print('正在请求:',url) sleep() print ...
- python socketserver ftp上传功能
一.socketserver用于多个客户端访问同一个服务端 客户端 import socket client = socket.socket() ip_port = ('127.0.0.1',8001 ...
- MyEclipse2014,java文件无法编译,run as上是none applicable,不是文件本身的问题
1.配置一下JDK目录 2.window -> Preferences -> java -> Installed JREs -> Add
- js、php判断手机PC
用于phpcms <script type="text/javascript"> var url = window.location.href; if(/Android ...
- ACK容器服务发布virtual node addon,快速部署虚拟节点提升集群弹性能力
在上一篇博文中(https://yq.aliyun.com/articles/647119),我们展示了如何手动执行yaml文件给Kubernetes集群添加虚拟节点,然而,手动执行的方式用户体验并不 ...