본문 바로가기

Spring & Java

JPA 와 JDBCTemplate 저장 속도 비교

반응형


spring boot  에서 jpa 와 jdbctemplate 을 제공해주며 , jpa 와  jdbctemplate 동시에 둘다 사용 가능 하다.


pom.xml


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>


접속 정보는 properties 에 아래와 같이 한다.


spring.datasource.username=xxxx
spring.datasource.password=xxxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://xxxx:xxxx/parcelab-test?characterEncoding=utf-8&autoReconnect=true&useSSL=false
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.hibernate.ddl-auto=update
#spring.jpa.show-sql=true


위와 같이 설정하면 JPA , JdbcTemplate 에서 사용 가능하다.


@Entity
public class User implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@Column(name = "username", unique = true)
private String username;
private String name;
private int age;
}


@Component
public class UserDAO {

@Autowired
private JdbcTemplate jdbcTemplate;

private final String INSERTSQL="INSERT INTO USER(username,name,age) values(?,?,?)";

User create(User user){
KeyHolder holder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
PreparedStatement ps = con.prepareStatement(INSERTSQL, Statement.RETURN_GENERATED_KEYS);
ps.setString(1,user.getUsername());
ps.setString(2,user.getName());
ps.setString(3, user.getAge()+"");
return ps;
}
},holder);

int newUserId=holder.getKey().intValue();
user.setId(newUserId);
return user;
}
void createList(List<User> userList) {
List<Object[]> batch = new ArrayList<Object[]>();
for (User user:userList) {
Object[] values = new Object[]{
user.getUsername(),user.getName(),user.getAge()
};
batch.add(values);
}
int[] updateCounts = jdbcTemplate.batchUpdate(INSERTSQL,batch);
}
}


public interface UserRepository extends JpaRepository<User,String> {

}


@Autowired
UserRepository userRepository;

@Autowired
private UserDAO userDAO;

@PostConstruct
public void saveUser() throws Exception{

/** jdcbtemplate saveIterable **/
userRepository.deleteAll();
long startTime = System.currentTimeMillis();
System.out.println("### JdbcTemplate saveList 함수 시작시간: "+formatTime(startTime));
userDAO.createList(generateUserList());
long endTime = System.currentTimeMillis();
System.out.println("### JdbcTemplate saveList 저장 시간: "+(endTime-startTime)/1000.0);
System.out.println("### JdbcTemplate saveList 함수 종료 시간: "+formatTime(endTime));

/** jpa saveIterable **/
userRepository.deleteAll();
startTime = System.currentTimeMillis();
System.out.println("### JPA saveList 함수 시작시간: "+formatTime(startTime));
userRepository.save(generateUserList());
endTime = System.currentTimeMillis();
System.out.println("### JPA saveList 저장 시간: "+(endTime-startTime)/1000.0);
System.out.println("### JPA saveList 함수 종료 시간: "+formatTime(endTime));

}

public List<User> generateUserList(){
List<User> userList = new ArrayList<>();
for (int i = 0; i < 1000 ; i++) {
User user = new User("Testusername-"+i,"Testname-"+i,i);
userList.add(user);
}
return userList;
}
public User generateUser(){
User user = new User();
user.setUsername("test1");
user.setName("test1");
user.setAge(200);
return user;
}
public String formatTime(long time) throws Exception{
Calendar ca = Calendar.getInstance();
ca.setTimeInMillis(time);
return (ca.get(Calendar.HOUR_OF_DAY) + "시 " + ca.get(Calendar.MINUTE) + "분 " + ca.get(Calendar.SECOND) + "." + ca.get(Calendar.MILLISECOND) + "초");
}



실행 결과:


### JdbcTemplate saveList 함수 시작시간: 181239.476
### JdbcTemplate saveList 저장 시간: 7.676
### JdbcTemplate saveList 함수 종료 시간: 181247.152
### JPA saveList 함수 시작시간: 181247.185
### JPA saveList 저장 시간: 5.763
### JPA saveList 함수 종료 시간: 181252.948


JPA 저장 속도가 JdbcTemplate 보다 좀 더 빠른것을 알수 있다. 


반응형

'Spring & Java' 카테고리의 다른 글

spring cloud config  (0) 2018.02.18
spring boot admin server  (0) 2018.02.11
JPA saveIterable 과 save 저장 속도  (1) 2017.09.28
JPA 사용시 Lombok 의 Data 어노테이션 사용 이슈  (0) 2017.08.28
xml convert to object  (0) 2017.08.26