-
부트캠프 과제를 하는 과정 중에 공공와이파이 정보를 api로 받아와서 DB에 적재해야 했다.
간단하게 구현할 수 있을 거라 생각했는데..
거의 3시간 동안 이것만 붙잡은 것 같다.
api 명세에 각 필드가 몇 글자 제한인지 나와 있지 않다보니
그냥 타이트하게 하려고 했다가 오류나고
늘려줬는데도 오류나고
안늘려줘도 오류나고
오류나고
오류나고
오류나고....
하다가 화나서 그냥 전부 다 varchar(100)으로 해결했다.
생각지도 못한 데서 글자 수 오류 걸리니까 어이가 없더라..ㅋㅋㅋ
그 다음은 insert 실행 하는데 속도가 1초에 50건(...)
이것 때문에 별거 다 찾아봤다.
> 쿼리 배치 처리
> INSERT INTO TABLE(col1, col2, col3)
VALUES(a1, b1, c1), (a2, b2, c2), (a3, b3, c3), ....
> LOAD DATA INFILE
(이거는 쓰려다가 안 썼다.)insert가 이렇게 느리다고는 도저히 내 머리가 이해할 수가 없어서
어떻게든 insert로 하고만다고 오기가 생기더라 ㅋㅋ
결론은 트랜잭션.
jdbc Connection 클래스의 메소드 setAutoCommit으로 해결할 수 있었다.
setAutoCommit이 true라면 트랜잭션이 실행되어 속도가 크게 저하하게 된다.
false라면 만약 오류가 발생할 경우 그냥 rollback 해버린다.
지금 내가 하는 게 큰 프로젝트도 아니고, 데이터가 중간에 변경될 일도 없다보니
트랜잭션을 끄는 게 맘이 편하다.
결과는 true : 306초 가량 => false : 4.8초
...
너무 차이가 나서 너무 놀랐다.
그냥 편-안 그 자체
mysql 시스템 변수를 설정해서 트랜잭션을 끄는 방법도 있었는데 지금 당장 필요하지는 않다보니 설정은 안 했다.
하지만 혹시 필요할 때를 위해 링크.
innodb mysql/mariadb insert 속도 높이기
innodb 의 경우 instert 속도가 myisam에 비해 느리다. 이경우 여러가지 튜닝을 할 수 있는데 대표적인것만 몇개 수정, 비교 해보려고 한다. 1.innodb_flush_log_at_trx_commit 를 0으로 변경하면 속도를 많이 올.
santander.co.kr
오늘은 하루종일 DAO만 구현했다.
그래도 고민한 만큼 결과물이 나쁘지 않은 것 같아서 만족스럽긴 하다.
insert에 시간만 안 썼어도..
@Override public void connect() { // default == saveFromDB(select) connectDB(); saveFromDB(); closeDB(); } // insert 또는 select만 가능 @Override public void connect(Query query) { connectDB(); insertOrSelect(query); closeDB(); }
별로 구현한 건 없었지만
어느 정도 객체지향이 머리에 들어는 있구나 느껴졌다.
DB 연결 메소드와 비즈니스 로직 메소드를 분리하고,
파사드 패턴으로 내부를 추상화했다.※ 파사드 패턴이 아닌 것 같다. 어떤 건지 다시 찾아봐야 할 듯.
중요한 건 내가 어떤 방식을 사용했는지 안다는 것.
알고 쓰는 것과 모르고 쓰는 것에는 차이가 있다.
모르고 썼다면 그냥 이렇구나 하고 넘어갔겠지만
알고 썼기 때문에 머리에 한번 더 각인시킬 수 있었다.
다음에 할 건 데이터를 처리해서 jsp로 보내주기!
'대충 정리 일기' 카테고리의 다른 글
String 관련 클래스 (0) 2022.09.03 Annotation (0) 2022.08.27 Collection (0) 2022.08.27