Feb 23, 2018 - jooq

jooq(Java Object Oriented Querying)

자바 객체지향 쿼리 라고 알려진 jooq는 가벼운 데이터베이스와의 맵핑 입니다. 소프트웨어 공학의 active record pattern의 구현체로 database schema로 부터 classes generated 한다.

하지만 아쉬운점은 오픈소스로 제공되기는 하지만 라이센스를 사야 특정DB는 동작한다는 점이 아쉽다. JPA와의 차이점은 JPA는 소스기준으로 테이블을 생성시키고 작업하는데 jooq는 쿼리기준으로 소스를 생성시키는것이 새롭다.

참조


Feb 20, 2018 - loadtest

loadtest

간단하게 자바로 동시성 태스트를 하기 위해서 CyclicBarrier를 사용해서 프로세스 실행을 대기 시켜서 Thread Safe 여부를 확인하려고 한다. 아래 코드를 보고 사용법을 보고 여러가지 방향을로 변경시켜서 테스트 해보면 좋을것 같다 몇달전에 static 변수 사용시에 값이 썩여서 Thread Safe 하지 않다고 증명시켜준적이 있는데 아래와 비슷한 코드였다.


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StopWatch;
import org.springframework.web.client.RestTemplate;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;


public class LoadTest {
    static AtomicInteger counter = new AtomicInteger(0);
    private static final Logger log = LoggerFactory.getLogger(LoadTest.class);

    public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
        int cnt = 100;
        ExecutorService es = Executors.newFixedThreadPool(cnt);

        RestTemplate rt = new RestTemplate();
        String url = "http://localhost:8080/rest?idx={idx}";
        CyclicBarrier barrier = new CyclicBarrier(cnt);
        for (int i = 0; i < cnt ; i++) {
            es.submit(()->{
                int idx = counter.addAndGet(1);
                barrier.await();
                log.info("Thread {}",idx);
                StopWatch sw = new StopWatch();
                sw.start();
                String res = rt.getForObject(url,String.class,idx);
                sw.stop();
                log.info("Elapsed : {} {} / {}",idx,sw.getTotalTimeSeconds(),res);
                return null;
            });
        }
        barrier.await();
        StopWatch main = new StopWatch();
        main.start();

        es.shutdownNow();
        es.awaitTermination(100, TimeUnit.SECONDS);

        main.stop();

        log.info("Elapsed main : {}",main.getTotalTimeSeconds());

    }
}


참조


Feb 20, 2018 - access log 분석

access log 분석

갑자기 DB에서 처리량이 밀리면서 리플리케이션이 밀리기 시작했다. WAS쪽 모니터링을 scourt를 통해서 하고 있는데 was 쪽에서는 특별한 장애 상황이 감지 되지 않았다. scouter agent에서 2초마서 서버로 전송하니 초단위에 부하량은 볼수가 없다고 판단(?) 초단위에 정보를 보고 싶어하는 니즈가 생김 그래서 access log 카운트를 할려고 한다.

시간대별 파일이 생기니 아래처럼 분단위에 파일을 하나 만들어서 하고 싶은 범위를 지정했다.

grep "08/Feb/2018:15:01" access.log-20180208-15 >> was01.txt 

그리고 아래처럼 초단위로 카운트를 찍어서 확인을 해보았다


grep "08/Feb/2018:15:01" was01.txt  | cut -d[ -f2 | cut -d] -f1 | awk -F: '{print $2":"$3":"$4}' | sort -nk1 -nk2 -nk3 | uniq -c | awk '{ if ($2 > 10) print $0}'

참조