ABOUT ME

포소니는 나의 하루이자 누군가의 공감입니다. 조용히 머물러도 좋고, 가볍게 이야기를 남겨도 좋아요. 당신의 일상도, 이곳에 스며들길 바랍니다.

Today
Yesterday
Total
  • JPA 와 JDBCTemplate 저장 속도 비교
    Tech/SpringBoot 2017. 9. 28. 18:23
    반응형


    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 보다 좀 더 빠른것을 알수 있다. 


    반응형

    'Tech > SpringBoot' 카테고리의 다른 글

    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
Designed by Tistory.