약 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나 다른 것보다 느린게 아니라 쿼리 조회하거나 명령수행속도는 이상없지만 해당 결과를 매핑하는데 조금 더 시간을 쓴 다는 예상을 해본다.
반응형
'Spring framework' 카테고리의 다른 글
전자정부, MongoTemplate 빈 생성 오류 (0) | 2019.06.03 |
---|---|
Spring에서 (전자정부) Mail 발송하기 (2) | 2019.05.14 |
Software caused connection abort: socket write error (0) | 2019.04.29 |
Spring 또는 전자정부, AOP가 되지 않는 경우 (0) | 2019.04.29 |
페이징 처리, 페이징 클래스 (0) | 2019.04.29 |
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)
댓글