본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Spring framework

Mybatis와 일반적인 DB커넥션 그리고 DBMS의 속도에 관해

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 4. 29.

 

 

약 5백만건 정도 되는 데이터베이스에서 Mybatis를 활용하여 데이터를 가져와야 되는 부분이 있었다.

속도는 0.1~0.2초정도 걸렸으나 아무래도 데이터가 많아지면 많아질수록 속도가 느릴 것 같았다.

이에 DBMS를 활용해서 쿼리를 보내보니 왠걸? 0.01초~ 0.03초사이가 나오는 것이었다.

아무리 인덱스를 주고 Mybatis 세팅을 해 보아도 속도차이가 계속 나서 일반적인 커넥션 방법을 활용해서 데이터베이스 접속을 해 보았다.

//...생략

public class DBTester {
	
	public static void main(String[] args) {
	
		Connection conn = null;
		java.sql.PreparedStatement psmt = null;
		ResultSet res = null;
        String user = "root"; 
        String pw = "비밀번호";
        String url = "jdbc:mysql://아이피:3306/db명";

        try {
        	Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, user, pw);
		
				long aaaa = System.currentTimeMillis();

				psmt = conn.prepareStatement(" 쿼리 ");
				long gaps = (System.currentTimeMillis() - aaaa);
				System.out.println("속도 : "+ gaps);

		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}	
			try {
				psmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
      
		
	}


}

별거 없는 코드이다. 단순하게 조회해서 끝내는 코드이다.

해당 코드를 사용하니 0.02초~ 0.05초사이가 나오는 것이었다.

DBMS나 일반 커넥션 형식은 별 차이가 없는 것 같았고, Mybatis만 느리다는 생각이 들었다.

속도차이를 보면,

- DMBS : 0.01초~ 0.03초

- 일반 커넥션 형식 : 0.02~0.05초

- Mybatis : 0.1 ~ 0.2 초

그런데 ResultSet은 List를 자동으로 주는 것이 아니므로 사용자가 List형식으로 구현해야 한다.

해서 List로 결과를 직접 담아보기로 하였다.

//...생략
				psmt = conn.prepareStatement(" 쿼리 ");
				res = psmt.executeQuery();
				final List<HashMap<Object, Object>> list = new ArrayList<>();
				final HashMap<Object, Object> item = new HashMap<Object, Object>(5);

				while(res.next()){ //반복문을 통해서 결과 담아보기
					item.put("aaa",res.getObject("aaa"));
					item.put("bbb",res.getObject("bbb"));
					item.put("ccc",res.getObject("ccc"));
					item.put("ddd",res.getObject("ddd"));
					item.put("eee",res.getObject("eee"));
					list.add(item);
					item.clear();
				}
				long gaps = (System.currentTimeMillis() - aaaa);
				System.out.println("속도 : "+ gaps);
//...생략

아..이렇게 사용자가 매핑하는 로직을 추가하니 속도가 환장하게 느려졌다.

- DMBS : 0.01초~ 0.03초

- 일반 커넥션 형식 : 0.5~0.8초

- Mybatis : 0.1 ~ 0.2 초

즉 Mybatis가 일반 DMBS나 다른 것보다 느린게 아니라 쿼리 조회하거나 명령수행속도는 이상없지만 해당 결과를 매핑하는데 조금 더 시간을 쓴 다는 예상을 해본다.

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글