Too Slow JDBC Connection
개인적인 스터디겸 간단한 프로젝트를 Java SE 8으로 개발하였다.
IntelliJ가 많은 도움을 줘서 쉽게 개발하였다.
배포도 귀찮은지라 IntelliJ에서 jar로 만들어 Linux 머신에서 실행하였다.
사용한 것은 JDBC, TCP, Thread, logger와 HashMap, Hashtable, Multimap의 컨테이너들이다.
전반적으로 C++과 큰 차이점은 느끼지 못했다. 헤더와 소스의 분리가 안되는 것과 int 데이터의 적절한 형변환에 더 조심해야하는 것 외에는 말이다.
이렇게 해피엔딩이면 좋았겠지만 PC에서 문제가 없던 부분이 Linux 머신에서는 문제를 일으켰다.
첫번째는 버전 관련 사항이었다.
뭐 결론은 Linux에 Java SE 8을 인스톨하여 정리하였다.
두번째는 class path 관련 사항이었다.
귀찮아서 jar로 만들어서 실행하였다.
세번째는 JDBC로 연결하는 시간이 매우 많이 소요 됐다.
그래서 스택오버플로에 검색을 했다.
주로 나오는 내용은 random 관련된 사항이었다.
http://stackoverflow.com/questions/5503063/oracle-getconnection-slow
http://stackoverflow.com/questions/137212/how-to-solve-performance-problem-with-java-securerandom
DriverManager.getConnection()에서 SecureRandom을 호출하는데 일반적인 random의 경우 블럭될 수 있다는 것이다. 이 현상은 Linux에서 나타난다 하였다. 해결방법은 urandom을 사용하는 것과 haveged란 프로그램을 통해 random의 seed를 만드는 노이즈를 빨리 수집하는 방법이 있다.
두가지를 모두 적용하였으나 여전히 connection은 5초~30초 사이로 오래 걸렸다.
결국 팀원에게 도움을 청해 답을 얻었다.
네트웍 문제였던 것이다.
IP로 접근하는 지라 특별히 dns문제나 네트웍 쿼리가 문제가 있을꺼라 생각하지 않았으나 내 착각이었다.
/etc/resolv.conf를 수정하여 접근 속도를 개선하였다.
약 400ms이 소요되는지라 아주 빠르다 할 순없지만 말이다.
'프로그래밍???' 카테고리의 다른 글
GO Lang 시작 (0) | 2016.09.22 |
---|---|
iBatis 설정 자료 링크 (0) | 2016.01.20 |
Redis 시작... (0) | 2015.12.11 |
DNS의 타입에 대해... (0) | 2015.04.21 |
엑셀에서 랜덤 문자열 생성하는 VBA 스크립트 (0) | 2015.03.04 |
POCO Library link 이슈 - GCC 5.4.0 업버전 후 생긴 문제
현재 운영중인 시스템에서 poco library의 log시스템을 사용한다.
c++14를 사용하기 위해 최근 GCC를 5.4버전으로 올렸다.
그 과정의 수많은 삽질이 있었다. Linux를 잘아는 천과장이 아니었으면 지금도 미궁을 헤메고 있었을듯... :(
우쨋거나 GCC 5.4 업버전 이후 또 다른 문제에 봉착했다.
poco library가 정상 작동을 하지 않았다.
혹시 하는 생각에 poco-1.7.4로 업버전 하여 컴파일하여 install 하였다.
여전히 안된다.
configure를 살펴봐도 gcc 관련 내용은 없다.
여기저기 뒤져보다가 make file을 살펴보니 다름과 같은 라인이 보인다.
include $(POCO_BASE)/build/config/$(POCO_CONFIG)
시스템상 관련 파일은 ./build/config/Linux 이다
해당 부분에서 현재의 gcc5.4의 관련 부분으로 수정하여 컴파일 했더니 문제 없이 넘어가게 되었다.
# # $Id: //poco/1.4/build/config/Linux#2 $ # # Linux # # Make settings for Linux 2.6/gcc 3.3 # # # # General Settings # LINKMODE ?= SHARED # # Define Tools # #CC = ${CROSS_COMPILE}gcc #CXX = ${CROSS_COMPILE}g++ CC = /opt/rh/gcc-5.4.0/bin/gcc CXX = /opt/rh/gcc-5.4.0/bin/g++
원래 나던 링크 에러 문제...
ubirloader.cpp:(.text+0x20a): undefined reference to `Poco::FileChannel::setProperty(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::char_traits<char>, std::allocator<char> > const&)' collect2: error: ld returned 1 exit status
'프로그래밍??? > C/C++' 카테고리의 다른 글
GCC 5.4.0 Install on CentOS 및 작업중 기타 삽질 시리즈... (0) | 2016.09.22 |
---|---|
Dual ABI 이슈 - GCC5 (0) | 2016.08.05 |
기존에 제작했던 pcqueue 샘플 코드 (0) | 2016.07.13 |
Bad cast exception on poco-library when I tried to cast Int64 (0) | 2015.07.30 |
Boost를 활용해 공유 메모리에 STL Container 사용하는 방법 (0) | 2015.07.10 |
protocol option - SOCKET 에 대해...
오랜만에 수정하는 작업이 하나 있었다.
해당 서버의 mysql의 계정 설정이 하나 빠진 것이 있어 공인IP로 접속이 되지 않았다.
관련해서 이런저런 얘기를 팀원과 하다가 하나 배운 것이 있다.
바로 protocol 옵션에 대한 것이다. 실제 사용 DB는 mariadb 5.x.x 버전이다.
mysql의 메뉴얼 페이지를 보자.
4.2.2 Connecting to the MySQL Server
클릭을 하면 바로 protocol 쪽으로 이동한다.
네개의 옵션이 있다. 정확하지는 않지만 아랫쪽으로 갈수록 빠를듯 하다.
PIPE와 MEMORY는 윈도우즈에서만 사용가능하고
SOCKET은 Unix Only이다.
내용에 보듯이 unix(linux)에서 localhost로 접속하게 되면 기본적으로 Unix socket file을 사용한다는 내용이다.
당연히 TCP 보다 빠르다.
127.0.0.1로 접속하면 TCP로 접속하지만 localhost로 접속하면 unix socket으로 접속한다.
간단하지만 db의 local machine에서 작업을 해야한다면 염두에 둬야할 내용이다.
127.0.0.1로 접속 하는 경우
MariaDB [(none)]> \s -------------- mysql Ver 15.1 Distrib 5.5.34-MariaDB, for Linux (x86_64) using readline 5.1 Connection id: 115593510 Current database: Current user: finepoint@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server: MariaDB Server version: 5.5.36-MariaDB-log MariaDB Server Protocol version: 10 Connection: 127.0.0.1 via TCP/IP Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8
localhost로 접속 하는 경우
MariaDB [(none)]> \s -------------- mysql Ver 15.1 Distrib 5.5.34-MariaDB, for Linux (x86_64) using readline 5.1 Connection id: 115586990 Current database: Current user: finepoint@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server: MariaDB Server version: 5.5.36-MariaDB-log MariaDB Server Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/lib/mysql/mysql.sock
'프로그래밍??? > MYSQL' 카테고리의 다른 글
mysql_affected_rows가 "0"를 반환할때... (0) | 2016.12.20 |
---|---|
Numeric Type의 display width (1) | 2016.09.07 |
mysql DB 생성/삭제, 사용자 생성/삭제, 권한부여 (0) | 2015.07.03 |
mysql_store_result를 사용할때 주의 사항(memory leak) (0) | 2012.07.11 |
mysql_insert_id() 오류 (0) | 2012.01.10 |
execl 을 통한 프로그램 내에서 다른 프로그램 실행하기
아래의 코드를 통해 프로그램 내에서 다른 프로그램을 호출 할 수 있다
if(execl("./ubikhanslistenerd", "./ubikhanslistenerd", NULL) == -1)
LogRet( 1, "[%-4s] Command Exec Error!!!.\n", ERROR);
'프로그래밍??? > 리눅스 및 서버 기타' 카테고리의 다른 글
Diffe-Hellman Key (0) | 2018.08.20 |
---|---|
HTTP와 SSL 인증서 (0) | 2018.08.03 |
kill signal 전송 (0) | 2012.07.12 |
리눅스에서 매초마다 메모리 확인 (0) | 2012.07.11 |
centos5에서 root 암호를 잊어버렸을 경우... (0) | 2012.04.19 |