linux (java application) -> oracle Connection delay 현상

신규로 세팅한 linux (redhat 2.6.32) 버전에서 내부망에 있는 oracle로 db커넥션이 이상하게 30~40 초나 걸리는 현상이 발생하였다.

네트워크 방화벽을 의심했으나 tcpdump를 떠보니 신규로 세팅한 linux 서버쪽에서 db서버로 P flag에 해당하는 ack를 20초 이상 지연하여 응답하고 있었다.

jdk-1.7.80, jdk-1.6.45, jdk-1.6.31  등 여러버전으로 시도했으나 동일하게 지연이 발생

구글링을 하던도중 아래 글에서 해결책을 찾음

관련 URL : http://stackoverflow.com/questions/5503063/oracle-getconnection-slow

예전에 고객사에 납품한 솔루션 제품에서 어느날 갑자기 지연이 발생하여 2달가량 삽질하다가 당시에도 렌덤값을 구하는 엔트로피 머시깽이에서 지연이 발생했다란 것과 유사해보였다

 

동일한 에러에 대해 좀더 디테일하게 설명해준 글 주소http://opendatabase.tistory.com/entry/WAS-%EC%97%90%EC%84%9C-DB%EB%A1%9C-%EC%A0%91%EC%86%8D-%EB%B6%88%EA%B0%80-javasqlSQLRecoverableException-IO-Error-Connection-reset

20170517_0120170517_0320170517_04

 

[결론]

자바실행 쉘에 아래 옵션을 추가하니 해결되었다 (1.7, 1.6 에서 모두 동작함을 확인하였음)

-Djava.security.egd=file:/dev/./urandom

 

JAVA 컴파일 및 실행

LINUX 환경에서…

cd classes 한 후

#java 컴파일 (방법1)
/app/jdk/jdk1.7.0_80/bin/javac -d . -cp ../lib/*: /app/MINA-PROXY/src/org/apache/mina/proxy/*

#java 컴파일 (방법2)
/app/jdk/jdk1.7.0_80/bin/javac -Xlint -d . -cp ../lib/mina-core-2.0.13.jar:../lib/slf4j-api-1.7.21.jar: /app/MINA-PROXY/src/org/apache/mina/proxy/*

#실행실패
/app/jdk/jdk1.7.0_80/bin/java -Xms128m -Xmx256m -classpath .:./classes/org/apache/mina/proxy/*:./lib/*:./conf: org.apache.mina.proxy.Main

#정상실행 (방법1)
/app/jdk/jdk1.7.0_80/bin/java -Xms128m -Xmx256m -classpath .:./classes/:./lib/*:./conf: org.apache.mina.proxy.Main 8080 127.0.0.1 8021 30

#정상실행 (방법2)
/app/jdk/jdk1.7.0_80/bin/java -Xms128m -Xmx256m -cp .:./classes/:./lib/*:./conf: org.apache.mina.proxy.Main 8080 127.0.0.1 8021 30

 

실행시 classes 디렉토리이하에 있는 class 파일을 모두 적용하겠다고 아래처럼 * 를 넣으면 안된다.
/classes/: <– 이렇게 설정하면 된다.
-classpath .:./classes/*:

FileWriter 8192 byte 이상 저장이 안될때, (java 파일 이어쓰기)

입력 파일을 읽어 DB작업후 결과를 파일로 기록하는 프로그램 작성중

결과파일이 8192 바이트 이상 기록이 안되고 있었다.


FileWriter fw = null;
BufferedWriter bw = null;

while((line=in.readLine())!= null){
	fw = new FileWriter(resultPath, true); // true 옵션을 주면 파일 이어쓰기가 가능해진다.
	bw = new BufferedWriter(fw);

// db작업

if(성공) {
	StringBuffer sb = new StringBuffer();
	sb.append(line);
	sb.append(&quot;,성공&quot;);
	bw.write(sb.toString());
	bw.newLine();
		bw.close();
} else {
	StringBuffer sb = new StringBuffer();
	sb.append(line);
	sb.append(&quot;,실패&quot;);
	bw.write(sb.toString());
	bw.newLine();
	bw.close();
}

fw.close();

음 워드프레스에서 소스같은걸 편하게 보여주려면 어케해야하려나…