2019년 3월 6일 수요일

Guava Cache (구아바 캐시)

캐시는 응답 속도(또는 부하)를 줄이기 위한 장치다. 자주 변경되지 않으면서 자주 참조되는 데이터가 DB나 디스크에 기록되어 있다면 필요할 때마다 매번 읽어오는 것보다 메모리로 땡겨온 뒤 참조하는게 당연히 빠르다.

Google이 만든 Guava Library엔 이러한 캐시 기능이 포함되어 있다. Guava의 Cache는 키-값 형태의 데이터 구조로 표현되며 손쉽게 캐시의 크기, 리프레시, 로딩 방법 등을 지정할 수 있다. Guava Cache는 내부적으로 ConcurrentHashMap과 유사하게 구현되어 있다고.. 따라서 동시성 문제를 덜 걱정해도 된다. (thread-safe)

Guava에서는 LoadingCache와 Cache의 2가지 타입의 캐시를 제공하는데 필요한 값이 없을 때 데이터를 다시 로드해주는 LoadingCache가 주로 쓰인다. LoadingCache는 CacheBuilder를 이용해 생성하는데 build() 호출 시 load()나 loadAll()을 오버라이드한 CacheLoader 구현체를 파라미터로 전달해 주어야 한다. 캐시 미스가 발생하면 알아서 로딩 메서드가 호출되는 방식이다. (get -> load, getAll -> loadAll)

Guava Cache는 캐시의 최대 사이즈나 시간을 기준으로 캐시가 적정 사이즈를 유지할 수 있도록 지원한다. 사이즈에 대한 설정도 마음에 들지만 expireAfterAccess나 expireAfterWrite는 특히 유용해 보인다. After Access는 마지막 참조 이후 설정된 시간이 지나면 캐시에서 삭제되고, After Write는 마지막 갱신(load) 이후 설정된 시간이 지나면 캐시에서 삭제된다. 그리고 removalListener()에 리스너를 등록해서 삭제되는 데이터를 확인할 수 있고, CacheStats로 hitRate 등을 측정할 수도 있다.

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
       .maximumSize(1000)
       .expireAfterWrite(10, TimeUnit.MINUTES)
       .removalListener(MY_LISTENER)
       .build(
           new CacheLoader<Key, Graph>() {
             public Graph load(Key key) {
               return createExpensiveGraph(key);
             }
           });

데이터를 가져오는 API가 조금씩 다른긴 하지만 Cache 인스턴스를 만든 뒤엔 Map 쓰듯이 쓰면 된다.

https://github.com/google/guava/wiki/CachesExplained

2019년 3월 3일 일요일

MS-SQL to MS-SQL DB 링크

DB 링크를 생성하여 사용하면 원격지에 있는 데이터베이스의 리소스를 사용할 수 있게 된다. DB 링크를 이용하면 물리적으로 떨어진 데이터베이스 뿐만 아니라 이기종 간의 데이터베이스도 현재 데이터베이스에 있는 것처럼 사용할 수 있다.

MS-SQL에선 SSMS 툴을 이용해 DB 링크를 생성할 수 있다. DB 링크를 생성하기 위해서는 DB 링크를 생성하는 서버에서 원격의 DB로 접속할 수 있는 공급자가 설치되어 있어야 하는데 타겟 데이터베이스가 MS-SQL인 경우엔 SQLNCLI10(SQL Server Native Client 10.0) 공급자를 선택하면 된다.

MS-SQL 기준으로 DB 링크를 생성하려면 SSMS를 실행한 뒤 '서버 개체 > 연결된 서버 > 새 연결된 서버'를 실행하여 설정을 진행하면 된다. 표시되는 화면에서 '일반', '보안', '서버 옵션' 항목의 내용을 건드려줘야 한다.


[일반]

'기타 데이터 원본' 형식으로 설정하는 것이 사용하기 편하며 '연결된 서버'에는 DB 링크의 이름을, 제품 이름엔 'MS-SQL', 데이터 원본에는 '127.0.0.1, 1433'과 같이 (IP, Port) 형식으로 입력해 준다.

[보안]

'다음 보안 컨텍스트를 사용하여 연결'을 선택해 타겟 데이터베이스의 원격 로그인 계정과 암호를 입력해 준다.

[서버 옵션]

RPC, RPC 내보내기를 True로 변경한다. RPC는 그 RPC(Remote Procedure Call)가 맞다.


3가지 탭의 설정을 입력한 뒤 '확인'을 누르면 방금 지정한 이름으로 DB 링크가 표시되는 것을 확인할 수 있다.
사용방법은 DB링크명.데이터베이스명.권한.테이블명 순으로 지정하면 된다.
DB 링크명: link1
데이터베이스명: mydb
테이블명: users
라면,
select * from link1.mydb.dbo.users와 같은 형식이 된다.