ODBC 연결로 오라클에잇는 정보 추가 삭제 변경 가능하게 연습예제를 만들어 보았다.

오라오라오라클.zip


'Programing > 오라클&SQL' 카테고리의 다른 글

저장프로시져  (0) 2016.11.30
저장프로시져  (0) 2016.11.30
Oracle ODBC 설치 및 연결  (0) 2016.11.30


1. Oracle.com에서 접속용 기본 프로그램 및 ODBC를 다운 받음.

다운받는 위치:

http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html

 

금일현재 Version 11.1.0.7.0가 최신버젼

 

가장 기본적인 프로그램 (무조건 받을 것.)

instantclient-basic-win32-11.1.0.7.0.zip (46,734,555 bytes)

 

가장 기본적인 프로그램 (경량버전)

instantclient-basiclite-win32-11.1.0.7.0.zip (17,667,999 bytes)

 

JDBC 클라이언트 패키지

instantclient-jdbc-win32-11.1.0.7.0.zip (1,562,261 bytes)

 

SQL*Plus 패키지

instantclient-sqlplus-win32-11.1.0.7.0.zip (789,617 bytes)

 

개발자 관련 SDK 패키지

instantclient-sdk-win32-11.1.0.7.0.zip (1,068,348 bytes)

 

개별접속용 ODBC 패키지 - 내가 필요한 기능

instantclient-odbc-win32-11.1.0.7.0.zip (728,899 bytes)

 

WRC 패키지

instantclient-tools-win32-11.1.0.7.0.zip (6,009 bytes)

 

 

 

내가 필요한 것은 기본 프로그램과 ODBC용 패키지로 2개를 다운받아 아래 디렉토리에 압축을 해제함

 

d:\oracle\instentclient_11_1   (요걸 잘 기억 해 주시고...)

 

2. 환경변수 지정

 

시작-> 내컴퓨터 -> 속성




고급 -> 환경변수 





시스템 변수 새로 만들기



시스템 변수 생성



ORACLE_HOME=d:\Oracle\instantclient_11_1

TNS_ADMIN=d:\Oracle\instantclient_11_1 <- tnsnames.ora 파일이 위치할 폴더

NLS_LANG=KOREAN_KOREA.KO16MSWIN949   <- 한글관련 설정

PATH=d:\Oracle\instantclient_11_1 <- 기존 패스에 추가해야 함

 

Path만 기존 변수명에 추가하고 나머지는 새로이 생성

 

 

3. 레지스트리 변경

1) 드라이브 설치했다고 변경 (아래 표내의 글을 복사해서 drive.reg 파일로 저장해서 더블클릭 해도 됨)

 Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers]
"Oracle in InstantClient_11_1"="Installed"

 

2) Oracle in InstantClient_11_1 세부내역 추가 (아래글을 복사해서 dddd.reg 파일로 저장해 더블클릭 해도 됨)

 Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Oracle in InstantClient_11_1]
"APILevel"="1"
"CPTimeout"="60"
"ConnectFunctions"="YYY"
"Driver"="d:\\Oracle\\instantclient_11_1\\SQORA32.DLL"
"DriverODBCVer"="03.51"
"FileUsage"="0"
"Setup"="d:\\Oracle\\instantclient_11_1\\SQORAS32.DLL"
"SQLLevel"="1"

 

3. TNS 서비스 파일 등록

아래 내용을 tnsnames.ora 파일을 작성하여 d:\Oracle\instantclient_11_1 디렉토리에 저장

 

 oracleTest1 =

(DESCRIPTION =
     (ADDRESS_LIST =
          (ADDRESS = 
               (PROTOCOL = TCP)
                    (HOST = xxx.xxx.xxx.xxx)
                    (PORT = 1521)
                )
          )
     (CONNECT_DATA =
          (SERVICE_NAME = DB_NAME)
     )

)

 

oracleTest1 : 사용할 TNS 서비스명으로 임의로 자기가 설정

xxx.xxx.xxx.xxx : oracle이 설치된 서버 IP 주소

1521: 포트번호

DB_NAME : 접속할 DB명

 

 

여기까지 진행이 되었으면 컴퓨터를 재부팅 함... (환경변수 등이 반영되도록...)

 

 

4. ODBC 데이터 원본 관리자 실행

시작-> 제어판-> 데이터 원본 (ODBC) - 추가



드라이버를 선택 - 하단 그림은 Oracle in OraClient10g로 되어 있으나 위에 레지스트리를 정상적으로 적용했다면 Oracle in InstantClient_11_1로 나옴...



드라이버 정보 입력 - TNS Service Name이 중요함




비밀번호를 입력하고....





접속 성공...


'Programing > 오라클&SQL' 카테고리의 다른 글

저장프로시져  (0) 2016.11.30
저장프로시져  (0) 2016.11.30
오라클 ODBC 연결 프로그램  (0) 2016.11.30



§IOCP : Input Output Completion Port
§Win32 에서 제공하는 커널 오브젝트 중에 하나.



IOCP는 비동기 I/O작업을 지원하면서 적은 수의 스레드로 최대한 요청을 처리하기 위한 방법입니다.

비동기적으로 I/O가 완료되면 하나의 정보단위가 만들어지고 이것은 IOCP큐에 들어가게 됩니다

이 때 작업 스레드는 IOCP의 통지를 받고 IOCP큐에서 정보 단위 하나를 가져와 작업을 수행하게 됩니다.

작업 스레드가 많으면 좋겠지만,

스레드가 많게되면 스레드를 차지하려고 context switching이 많이 일어나므로 적은 수의 스레드를 사용합니다.








CP오브젝트를 3개 생성

소켓과 CP연결 된 상태를 1, 2, 3이 입출력이 완료된 상태 일 때 CP Q 들어간다.

운영체제가 일이 끝났는지 확인을 하는데 끝났으면 Worker Thread로 만들어서 다른 일을 하게 한다.




동작 방식 및 특징
요청이 들어오면 처리비용이 가장 높은 IO 작업을 커널 영역에서 처리해주고 처리 결과를 큐에 담는다.
(빠른이유1 : OS 커널에서 지원하는 IO처리)

이제 유저영역에선 큐에서 요청을 가져와(GetQueuedCompletionStatus 함수) 여러 스레드에서 처리한다.
이렇게 커널 영역에서 유저 영역으로의 데이터 전달시 동일한 버퍼를 사용한다.
(빠른이유2 : 커널영역과 유저영역의 버퍼 공유)

요청을 처리하는 스레드들도 Leader/Follow 패턴을 따르는 Thread pool을 
사용하기 때문에 context switching이 일어나지 않는다.
(빠른이유3 : context switching이 없음)
(context switching이 일어나지 않는다는건 잘못된 말 같다.
일어나지 않는게 아니고 방지하도록 만들 수 있다는 것으로 이해하고 있다.
일단 Thread pool을 통해 thread를 미리 생성하고 재활용 할수 있어 빠를 수 있으며
일반적인 IOCP 샘플을 보면 thread 개수를 CPU 코어 개수 만큼이나 2배로 잡는데
(경험적인 노하우로 얻어진 적정 수치로 알고 있음)
이렇게 CPU 단위의 thread 개수 선택으로 인해 context switching을 방지하는 것으로 보여진다.)

또한 Overlapped IO(비동기적인 IO)를 지원. (속도 향상)
polling이 아닌 notification 방식 사용. (속도 향상)
IO 스케쥴링이 FIFO 방식이 아닌 SCAN방식으로 물리적으로 가까운 곳의 IO처리. (속도 향상)
RAID 구성을 사용할 경우 더 빠른 처리가 가능. (속도 향상)
의 특징을 갖고 있다.

메세지 처리에서 콜백 함수 사용하는 방법과 이벤트 커널 오브젝트를 사용하는 방법이 있다.


관련 함수 설명
소켓 : IOCP 객체 : 스레드
n    : 1         : n(보통 CPU 코어 개수 * 2)

적은 IOCP 객체와 적은 스레드의 사용으로 많은 소켓 처리시 우수한 성능

HANDLE CreateIoCompletionPort(HANDLE FileHandle, HANDLE ExistingCompletionPort, ULONG_PTR CompletionKey, DWORD NumberOfConcurrentThreads);
IOCP 객체 생성 및 소켓과 연결.
/*
1st, 2nd : 
case 1 : IOCP 객체 생성 - 1st는 INVALID_HANDLE_VALUE(-1), 2nd는 NULL 일 경우 IOCP 객체 핸들 리턴
case 2 : IOCP 객체와 소켓 연결 : 1st는 소켓핸들, 2nd는 IOCP 객체
3rd : IO완료 통보시 IO완료 대기 함수로 전달될 32bit 값.
4th : 동시에 깨울 수 있는 스레드 개수. 0이면 자동으로 최대 CPU 코어 개수만큼.
(IOCP 객체 생성시에만 유효함.)
*/
EX : IOCP 생성)
g_hCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
if (g_hCP == NULL) return 0;//error
EX : IOCP 객체와 소켓 연결)
if (CreateIoCompletionPort((HANDLE)commsock, g_hCP, (DWORD)commmsock, 0) != g_hCP)
return 0; //error
BOOL GetQueuedCompletionStatus(HANDLE CompletionPort, LPDWORD lpNumberOfBytes, PULONG_PTR lpCompletionKey, LPOVERLAPPED* lpOverlapped, DWORD dwMilliseconds);
비동기 IO 완료를 대기.
/*
1st : IOCP 객체 핸들
2nd : 입출력이 완료된 bytes 크기
3rd : CreateIoCompletionPort()를 호출해 소켓과 IOCP 객체 연결시 3rd 인자로 전달한 32비트 값을 반환받기 위한 인자.
4th : 비동기 입출력 함수에 전달한 WSAOVERLAPPED 구조체를 반환받기 위한 인자.
5th : 타임아웃시간(ms). INFINITE지정시 무한 대기. 
*/
BOOL PostQueuedCompletionStatus(HANDLE CompletionPort, DWORD dwNumberOfBytesTransferred, ULONG_PTR dwCompletionKey, LPOVERLAPPED lpOverlapped);
IOCP 객체에 가상의 완료를 통보.
인자로 전달된 값을 이용해 가상의 완료 패킷을 하나 만들어 IOCP 완료 큐에 보내주는 함수. (한번 호출시 하나의 스레드가 깨어남)
즉, GetQueuedCompletionStatus()를 깨우는 함수.
/*
1st : 완료 패킷을 보낼 IOCP 객체 핸들.
2nd : 입출력 완료된 가상의 바이트. GetQueuedCompletionStatus()의 두번째 인자로 반환됨.
3rd : 어플리케이션이 정의하는 32bit 값. GetQueuedCompletionStatus()의 세번째 인자로 반환.
4th : GetQueuedCompletionStatus()dml 4th 인자로 반환될 WSAOVERLAPPED 구조체 포인터
*/
GetQueuedCompletionStatus()가 깨어날때 입출력 완료로 깨어났는지 PostQueuedCompletionStatus()로 깨어났는지 확인 방법.
PostQueuedCompletionStatus(g_hCP, 1, 0, NULL); //3,4번째 인자로 0, NULL을 전달하기 때문에
..
int nRet = GetQueuedCompletionStatus(g_hCP, &cbTransferred, (LPWORD)&sock, (LPOVERLAPPED*)&pOV, INFINITE); //3,4번째 인자가 0, NULL로 세팅됨.
if (sock == 0 && pOV == NULL)
//PostQueuedCompletionStatus()에 의해 깨어남.


'Programing > 소켓 프로그래밍' 카테고리의 다른 글

Overlapped I/O 모델  (0) 2016.11.30
WSAEventSelect 모델  (0) 2016.11.30

+ Recent posts