테스트 환경을 구축해놓고 공부하는 기타 다른 블로그들을 보며 일주일간 삽질을 했기에..ㅠㅠ 이번 기회에 정리. 이번에 다시 느낀 건 역시 블로그 보단 공식 사이트가 진리다...
신규 업무를 위해 신규 DB서버 구축이 필요했는데, SQL Server를 사용해야 함.
요구사항 1. 본점 Oracle DB 연결(Linked Server) 2. 매일 정해진 시간에 자동으로 00 발송 3. SQL Server 2019 사용
DB Link 전 필수사항 1. Oracle 11g 설치(DB instance는 불필요해서 software만 설치) 2. ODBC 설치 후 시스템 DSN 생성(불필요한 것 같음. 현재 Linked Server로 연결된 이름은 모두 TNS이름이랑 맞췄고 ODBC로 설정된 이름은 다름, 기타 블로그에서 만들라고 해서 만들었으나 추후 확인) 3. tnsnames.ora 파일 설정
DB Link 설정 1. Server Objects(서버개체) 마우스 우클릭 - New - Linked Server... 선택 2. Linked Server 설정
3. 연결 테스트 성공 후 DB 셀렉트 테스트 select * from openquery(DB Link명, 'select 1 from dual'); Oracle 연결 테스트이기 때문에 위처럼 테스트를 진행 Openquery를 사용하지 않고 스키마처럼 .으로 진행하는 방식도 있으나 성능이 떨어짐(테이블의 모든 데이터를 가져온 후 조건 필터링하기 때문) openquery는 링크된 db에서 필터링 후 데이터 가져옴
2. start()와 run() 호출 차이 - thread의 run()을 호출하는 것은 class에 선언된 메서드를 호출하는 것 - start()를 호출하는 것은 새로운 thread가 작업을 실행하는데 필요한 call stack을 생성하고, run()을 호출해서 생성된 call stack에 run()이 첫 번째로 올라가게 됨
3. 데몬 스레드(daemon thread) - 일반 스레드의 작업을 돕는 보저 역할 - 일반 스레드가 종료되면 데몬 스레드는 강제 종료 - "thread변수명".start(); 를 호출하기 전 "thread변수명".setDaemon(boolean 값); 을 해야 데몬 스레드로 지정
4. sleep() 사용법(?) - "thread변수명".sleep(~~); 으로 선언해도 되나 sleep() 메소드는 static 메소드이기 때문에 내가 지정한 스레드가 현재 실행중인 thread가 아니라면 main thread가 영향을 받음 - Thread.sleep(); 으로 호출해야 의미 전달에 혼선이 없음
실행 환경 : sql developer에서 조회 시 2분 정도 걸리는 쿼리(1달치 조회 시 약 800만건 조금 넘게 존재)
1. createstatement 후 setFetchSize 설정
2. executeQuery 실행 후 바로 다음 라인에 Fetch Size 콘솔 로그 남김. (executeQuery 바로 윗 줄에는 로그 파일에 조회 날짜 조건 출력)
3. fetch size 확인 로그는 execute 실행 후 한 참 뒤에 콘솔 로그 출력. 콘솔 로그 출력 전에는 결과 출력 file size = 0
4. fetch size 로그 출력 후 바로 file size 증가하는 것 확인.
위의 상황으로 볼 때 rs.next() 시 쿼리를 실행하는 것이 아니라 Statement.executeQuery 실행 시 쿼리 결과 값을 갖고 있는 것으로 추정.(약 800만건의 데이터를 텍스트 파일로 저장 시 약 2.06gb) 그리고 파일 쓰기가 계속 진행되고 있는 동안 로그 파일에 조회 날짜 출력을 안 함 여기서 궁금한 점은 2기가나 되는 데이터를 어디에 들고 있다가 파일로 쓰기 시작하는 것인지 궁금.