Programming/Java 18

동기화 필요한 Class 정리 (mutable)

사실 JDK API doc 에 개별적으로 다 있긴 하지만, 따로 정리가 필요할 듯 싶다. (멀티스레드 동작 중 값이 이상하게 들어온다 싶으면 일단 의심...) 내부적으로 상태를 유지하기 때문에 작업이 끝나기전에 다른 요청이 들어오면 상태값이 바뀌어 예측할 수 없게 된다. synchronized block 감싸거나(성능 고려), 새로 인스턴스를 만들어서 해결할 수 있음 java.util.SimpleDateFormat java.sql.Connection java.sql.Statement 이하

Programming/Java 2012.01.20

JDBC를 이용해 대용량 데이터 처리시 OOM(Out of memory, Java heap space 문제) 해결

ResultSet을 가지고 한줄씩 disk 로 쓰면서 사용된 객체를 정리하는 것을 반복하더라도 OOM 나면서 죽는 경우, Statement 를 생성할 때 Cursor 옵션에 문제가 있을 수 있다. TYPE_SCROLL_SENSITIVE, TYPE_SCROLL_INSENSITIVE 로 Scrollable하게 만들면 내부적으로 Vector를 사용해 읽어온 데이터를 Caching 하게 되며 gc 되지 않는다. TYPE_FORWARD_ONLY, CONCUR_READ_ONLY 를 지정하여 Cache 되지 않도록 하면, OOM 을 피할 수 있다. 단, Scrollable Cursor 를 이용하던 로직은 불가능하거나 수정할 필요가 있다.

Programming/Java 2012.01.12

Multithread 환경에서의 JDBC 사용

thread 를 이용해 여러개의 connection을 생성해 DB에서 읽어온 데이터를 가지고 작업할 일이 있었으나, jdbc 가 thread-safe 하지 않아서 인지 자꾸 오류가 나는 것이었다. (분명 다른 connection인데 같은 statement, resultset 를 생성하여, 더이상 읽어온 값이 없다는 오류를 뱉는 둥...) 최대한의 동시성을 유지하면서 무결성이 깨지지 않는 동기화 수준을 정리할 필요성을 느낌... [Connection] - DriverManager 수준 synchronized(DriverManager.class) { conn = (Connection)DriverManager.getConnection(jdbcUrl, dbProp); } [Statement, PreparedSt..

Programming/Java 2011.11.02

Producer/Consumer 예제

두 곳의 데이터 소스에서 입력을 받는 동안 사이사이 두 입력값의 동일성을 비교해서 화면에 나타내려고 할 때 사용한 Thread 처리 방식이다. Consumer는 데이터가 없으면 대기하다가, Producer가 데이터를 입력해서 생기면 비교하고 결과를 리턴하는데, 종료 처리는, 두개의 Producer가 생성을 마쳤는지를 검사하다가 interrupt 하게 된다. 쉽게 말해, 두 명의 제빵사가 빵을 만들고 빵 나올때까지 손님이 기다리는 상황인데 빵이 나오면, 손님은 빵을 바로 집고 또 기다린다. 두 명 모두 빵을 다 찍어내면(영업 끝나면) 손님보고 나가라고 interrupt 한다. [Main.java] package pc; public class Main { public static void main(Strin..

Programming/Java 2011.06.20