닷넷 프로젝트에서 사용할 수 있는 프레임웍을 한눈에 볼 수 있도록 정리해보자
프레임웍을 구분하는 방법은 여러가지이나 간단하게 티어별로 구분하도록 한다. 

 
프리젠테이션 티어 (웹)
1. ASP.NET MVC - 2008년 1사분기에 출시 예정이 ASP.NET 기반의 MVC 프레임웍. 마이크로소프트 제공
   - 소개
   - 다운로드
   - 포럼
2. MonoRail - 오픈 소스 Castle 프로젝트에서 만든 Rail와 유사한 MVC 웹 프로임웍
3. Maverick.NET - 자바 Maverick의 닷넷 버전으로 오픈 소스 MVC 웹 프레임웍, 업데이트 안됨
4. DotNetNuke - 포털 프레임웍에 가까움. 오픈 소스 

 
비지니스 티어 (DI Container)
1. Spring.NET - 오픈 소스. 자바 Spring의 닷넷 버전. 대표적인 DI Container.
2. ObjectBuilder - Enterprise Library(EntLib)에 들어 있으며, EntLib, Composite UI Application Block 등에 사용된 DI Container
3. Unity - Enterprise Library 4.0 버전에 사용될 DI Container로 ObjectBuilder 후속작. EL과 별개로 사용될 수 있도록 별도 프로젝트로 진행중이며 Codeplex에 현재 2008년 2월 CTP 공개.
4. Windsor Container - 오픈 소스 Castle 프로젝트 일환
5. StructureMap - 닷넷에서 가장 오래된 DI Container. Jeremy D. Miller가 만들고 유지보수하고 있는 오픈 소스 프레임웍
6. NInject - "Lightning-fast dependency injection for .net"을 표방한 오픈 소스 DI Container. 닷넷 프레임웍 3.5 및 Compact Framework 3.5 지원, Silverlight 지원 등이 특징 

 
데이터 티어
1. ADO.NET
2. LINQ to SQL - .NET Framework 3.5의 기본 기능. 엔티티와 테이블의 1:1 매핑. VS2008 툴 지원
3. ADO.NET Entity Framework (LINQ to Entity)
4. NHibernate - 자바 Hibernate의 닷넷 버전. 오픈 소스
5. iBatis.NET - 자바 iBatis의 닷넷 버전. 오픈 소스
6. Active Record - 오픈 소스 Castle 프로젝트의 일환. Active Record 패턴을 구현. NHibernate 기반이나 Configuration을 XML이 아닌 Attribute을 이용
7. LLBLGen Pro - 상용.
8. WilsonORMapper - 상용.
9. LightSpeed - 상용.
10. Codus - 상용.
11. Sooda - 폴란드에서 만든 오픈 소스 ORM 으로 폴란드에서는 구직시 도움되는 기술.
12. SubSonic - 오픈 소스 ORM. ASP.NET 3.5 Extension에 포함된 ASP.NET Dynamic Data 기능 구현에 사용됨.
13. NConstruct - 상용 / 무료, NHibernate 용 코드 자동 생성(HBM, Entity 등), VS용 project 파일 생성 등 

 
All-in-one
1. DotNetNuke - 복잡한 웹 싸이트 구축, CMS에 까깝다고 할 수 있음
2. Oxite - ASP.NET MVC를 사용, 블로그 엔진, Mix Online 싸이트 운영 

 
기타 범용 프레임웍 (혹은 라이브러리)
1. Enterprise Library - MS patterns and practices(PnP) 팀이 Codeplex를 통해 제공. 캐싱, 로깅, 암호화 등등
2. NVelocity - 템플릿 엔진. 진전이 없어 Castle 프로젝트에서 별도 진행
3. NUnit - 단위 테스트
4. NAnt - 빌드
5. log4net - 로깅
6. CruiseControl.NET - 통합 빌드, ThoughtWorks에서 개발한 오픈 소스

 

출처 : http://kingcrap.com/4

Posted by Sting!

시스템 관련

리눅스 버전 확인
cat /etc/issue

커널버전 확인
cat /proc/version

커널 비트 확인
getconf WORD_BIT

Posted by Sting!

Internet Explorer로 Oracle Enterprise Manager에 접속 할 경우 아래와 같은 페이지가 뜨고 접속이 안 되는 경우 해결법.





원인.

마이크로 소프트의 보안 인증서 관련 업데이트(KB 2661254)로 인하여 모든 운영체제에서 1024bit 보다

짧은 키를 가진 RSA 인증서는 차단되도록 변경되었습니다.

하지만 오라클 EM의 기본 인증서 Bit Length는 512bit 이기 때문에 익스플로러에서는 원천 차단되어 넘어가지 않는 것 입니다.


해결법은 3가지가 존재합니다.

1. certutil을 이용하여 익스플로러의 차단 인증서 길이를 1024 에서 512로 내리는 방법.

2. 오라클의 인증서를 1024로 재 발급 하는 방법.

3. 다른 브라우저를 사용한다.


2번의 방법은 추후 포스팅 하기로 하고 먼저 1번 certutil을 이용한 방법을 포스팅 하겠습니다.

3번은 제일 간단하니 뭐... 포스팅하지 않겠습니다.


1. certutil을 이용한 방법


certutil은 윈도우 vista 이상이면 기본으로 포함되어 있는 도구이므로 그 이하 버전의 윈도우를 제외하곤 따로 설치 하실 필요는 없습니다.

certutil을 지원하지 않는 버전의 윈도우에서는 레지스트리 직접수정으로 해결 가능합니다.

마소에서 작업 전 레지스트리 백업을 권장 하는것으로 보아 사실 certutil 자체가 인증관련 레지스트리 수정을 보조하는 도구로서

win7이나 win2008 등 certutil을 지원하는 버전의 윈도우도 레지수정으로 처리를 해도 관계 없을 것으로 보입니다.


- 레지스트리 경로

HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\OID\EncodingType 0\CertDLLCreateCertificateChainEngine\Config


- 작성 키 값

  MinRsaPubKeyBitLength

  EnableWeakSignatureFlags

  WeakSignatureLogDir

  WeakRsaPubKeyTime


이 포스팅에서는 MinRsaPubKeyBitLength와 EnableWeakSignatureFlags로 1024이하의 인증서를 계속 허용하는 방법만 다루겠습니다.

자세한 세팅에 대해 궁금하신분은 참조 URL의 "Microsoft 보안 공지: 최소 인증서 키 길이 업데이트" 를 참조 하세요.


- 각 키의 설명

MinRsaPubKeyBitLength

허용되는 최소 RSA 키 길이를 정의하는 값입니다. 기본 RSA 키 길이는 1024입니다.

본 포스팅에서는 오라클 인증서의 길이인 512로 설정합니다.

ex) certutil -setreg chain\minRSAPubKeyBitLength 512


EnableWeakSignatureFlags

2, 4, 6, 8의 네 가지 값을 가질 수 있으며 설정에 따라 차단 기능 작동 방식이 달라집니다.

4나 8 로 설정 했을 경우에는 WeakSignatureLogDir의 설정이 필수입니다.

본 포스팅에서는 2로 설정합니다.

ex) certutil -setreg chain\EnableWeakSignatureFlags 2


    설명 

 키 길이가 1024비트보다 작은 RSA 루트 인증서를 사용

4

 키 길이가 1024비트보다 작은 인증서를 계속 차단하면서 로깅을 사용

6

 루트 인증서 아래에서 키 길이가 1024비트보다 작은 RSA 인증서의 로깅을 사용하도록 설정

8

 로깅만 사용하도록 설정하고 길이가 1024비트보다 작은 키를 차단하지 않음


WeakSignatureLogDir
 키 길이가 1024비트보다 짧은 인증서가 기록될 폴더를 지정합니다.
ex) certutil -setreg chain\WeakSignatureLogDir "c:\Under1024KeyLog"

WeakRsaPubKeyTime

구성된 날짜 및 시간 전에 코드에 설명하는 데 사용된 인증서는 키 길이가 1024비트보다 짧은지 확인되지 않습니다.

라고 설명은 되어있는데 설정해봤지만 별 반응이 없어서 다음에 다시 해보기로 했습니다.

마소에서는 certutil -setreg chain\WeakRsaPubKeyTime @01/15/2011+00:18 라고 입력하라고 되어있는데 이렇게 입력하면 오류가 납니다.

날짜를 각 언어 로케일대로 입력해야하는데 한글의 경우엔 YYYY-MM-DD로 입력

ex) certutil -setreg chain\WeakRsaPubKeyTime @2013-05-01+00:01


- 작업 순서


1. 커맨드 창을 엽니다.

ex) 윈도우키 + R -> cmd (엔터)


2. 아래 명령어를 입력합니다.

certutil -setreg chain\minRSAPubKeyBitLength 512

certutil -setreg chain\EnableWeakSignatureFlags 2


레지스트리 수정의 경우엔 위의 레지스트리 경로로 가서 아래와 같은 DWORD키를 만드세요.

키 : minRSAPubKeyBitLength         값 : 512

키 : EnableWeakSignatureFlags     값 : 2



변경 사항 어쩌고는 신경쓰시지 않아도 됩니다. 익스플로러만 껐다 키면 문제 없습니다.


3. 설정이 잘 되었는지 확인합니다.

certutil -getreg chain



4. 설정을 해제 할 때 입력 명령어

certutil -delreg chain\minRSAPubKeyBitLength

certutil -delreg chain\EnableWeakSignatureFlags

레지 수정의 경우엔 해당 경로로 가서 키를 삭제 하세요.



여기까지 설정을 마쳤다면 익스플로러를 닫은 후 다시 열고 EM에 접속해보세요.

같은 화면 뜨지만 빨간 박스 안의 링크가 추가되거나 원래 추가되어 있던 사람은 링크를 눌렀을때 정상적으로 접속이 됩니다.







이렇게 설정을 해놓은 상태에서는 계속 512비트의 인증서도 받아들이도록되니 보안수준이 낮아지겠죠.

레지스트리 파일이나 배치파일로 만들어두고 설정을 켯다 껐다 하는것이 낫지 않을까 합니다.



--------------------------------------------------------------------------------------------------------


- 참조 URL

Microsoft 보안 공지: 최소 인증서 키 길이 업데이트 : http://support.microsoft.com/kb/2661254/ko


Posted by Sting!

변수 는 바인드 변수 입니다.

db 프로그래밍을 짜실 때 꼭 한가지를 기억하세요.. 저는 자바로 설명하겠지만 이건 꼭 언어를 따지는 건 아닙니다. 

가령 이런 SQL문이 있다고 하죠. 

select * from tab where id = 1; 

그리고 시스템에서 id 를 입력받아서 매번 각 id에 대해 위의 쿼리를 실행한다고 하죠. 

그러면 다음과 같이 쿼리를 생성해서는 안됩니다. 

Connection con = null; 
Statement stmt = null; 

String query = "select * from tab where id = " + id; 

stmt = con.createStatement(stmt); 
ResultSet rs = stmt.executeQuery(); 

이와같이 코딩하면 SQL문장이 DBMS에 개별적으로 들어갑니다. 
즉, 
select * from tab where id = 1; 
select * from tab where id = 2; 
select * from tab where id = 3; 
select * from tab where id = 4; 
select * from tab where id = 5; 

가 전부다 다른 문장으로 처리된다는 말이죠. 다른 문장으로 처리된다는 말은 매번 저 문장이 
파싱되야한다는 말입니다. 

그러나 쿼리를 

select * from tab where id = ? 

와 같이 만들고 ? 자리에 값을 넣는 방법이 어떤 언어든지 있습니다. 

이럴때 ? 를 바인드 변수라고 하는데, 바인드 변수를 사용하면 위의쿼리는 

select * from tab where id = :id_val; 

이렇게 치환되죠.. 

그리고 개별 쿼리시마다 동일한 sql문을 수행하되 id_val의 값이 바뀌게 됩니다. 

자바의 경우는 이것이 PreparedStatement입니다. 또 어떤분은 PreparedStatement를 쓰긴 
하는데 정말 이상하게 씁니다. 가령 다음과 같은 식이죠. 

String query = "select * from tab where id = " + id; 
PreparedStatement pstmt = con.prepareStatement(query); 

이런식이죠... 이렇게 해서야 바인드 변수가 쓰이지 않습니다. 

String query = "select * from tab where id = ?" 
PreparedStatement pstmt = con.prepareStatement(query); 
pstmt.setInt(1, id); 

이런식으로 코딩해야합니다.. 

그러면 DBMS에는 하나의 쿼리인 select * from tab where id = ? 만 들어가고 
DBMS는 이 문장만 파싱한뒤에 바인드 변수값 바뀌는 처리는 파싱을 제외하고 해줄 수 있습니다.. 

파싱이 뭐 대단하겠냐 하겠지만 파싱이 많으면 CPU점유율이 높아집니다.. 매일 CPU한계치에 
도달해서 뺑뺑이 치는 DBMS에서 이와같이 PreparedStatement를 쓰고 안쓰고의 차이는 
심지어 CPU 차지율을 20% 이상 차이나게 합니다.. 

(말이 20% 지 평상시에 40% 의 CPU가 사용되는 시스템은 60% CPU를 먹게 만든단 뜻입니다..) 

Statement로만 도배를 해놓은 경우 급하면 급한대로 오라클의 init{SID}.ora파일에서
CURSOR_SHARING=FORCE로 선언해주면 급하게 해결을 볼 수 있습니다..

그러나 오라클에서는 DSS나 QUERY REWRITE를 사용하는 환경에서는
이 매개변수를 FORCE로 고치지 말라고 경고하고 있습니다.

얼핏 생각해봐도 아시겠지만, CURSOR_SHARING=FORCE로 해주면 대부분의 쿼리를 오라클이 임의로 수정하여
바인드 변수를 쓰게 만들어 실행계획이 매번 동일하게 돌아가는 효과를 낳습니다.
따라서 QUERY REWRITE와 DSS에서 필요한 그때 그때에 맞는 정확한 플랜이 안나오게
될 수 있다는 것이죠.

QUERY REWRITE를 쓰는지 안쓰는지 모르겠다고 그러시면 안쓰는 것입니다. 제가 알기로는
QUERY REWRITE가 8i 이하에서는 Materialized View외에서는 사용되지 않습니다..
9i 부터는 모르겠군요. 

만약 자신의 데이터베이스에서 얼마나 많은 재파싱이 일어나고 싶은지를 알고 싶다면,
다음 스크립트를 sys로 접근한뒤 실행해보세요.



prompt
prompt * SQL문 parsing time 구하기
prompt
SELECT NAME,
VALUE
FROM V$SYSSTAT
WHERE NAME = 'parse time cpu'
or NAME = 'parse time elapsed'
or NAME like 'parse count%';

결과는 대략 다음과 같이 나타납니다.

NAME VALUE
------------------------------ ------------
parse time cpu 0
parse time elapsed 0
parse count (total) 322,128
parse count (hard) 662

SQL>

여기서 total 은 전체 파싱된 sql문장의 수 이며 (hard)는 하드 파싱, 즉 새로
파싱된 문장의 수를 의미합니다.

이 비율과 parse time cpu 에 나타난 parsing 에 소요된 cpu 시간을 사용해
접근하시면 됩니다.

from:
http://javastudy.co.kr/bbs/read.jsp?bbs=lecadvancebbs&id=70

 

 

----------------------------------------------------------------------------------------

 

EXAMPLE  2.:

 

----------------------------------------------------------------------------------------
-- subject : 바인드변수를 사용하라
-- summary : pl/sql 또는 sql로직에서 바인드변수를 사용한 로직과 사용하지않은
  로직을 각각돌려보면 실행시간이 확실히 차이가난다.
  이 원인은, 바인드변수를 사용하면 shared pool내에서 최초 한번 실행한 sql은
  다음의 똑같은 sql이 왔을때 다시 hard parse를 하지 않고 이미 parse된 sql을 사용하게된다.
----------------------------------------------------------------------------------------


SQL> alter system flush shared_pool;

-- shared_pool내용을 비우는 역활을 한다. 
-- 이렇게 하는 이유는 이후 실행할 쿼리에 대한 parse결과를 메모리상에서 없애기 위해서이다.



SQL> declare
 type rc is ref cursor;
 l_rc rc;
 l_dummy all_objects.object_name%type;
 l_start number default dbms_utility.get_time;
begin
 for i in 1 .. 1000
 loop
  open l_rc for
  'select object_name from all_objects where object_id = ' || i;
  fetch l_rc into l_dummy;
  close l_rc;
 end loop;
 dbms_output.put_line ( round( (dbms_utility.get_time - l_start)/100, 2) || 'seconds');
end;
/

23.17seconds
PL/SQL 처리가 정상적으로 완료되었습니다.
경   과: 00:00:23.02

 

SQL> declare
 type rc is ref cursor;
 l_rc rc;
 l_dummy all_objects.object_name%type;
 l_start number default dbms_utility.get_time;
begin
 for i in 1 .. 1000
 loop
  open l_rc for
  'select object_name from all_objects where object_id = :x' using i; --바인드변수를 사용함
  fetch l_rc into l_dummy;
  close l_rc;
 end loop;
 dbms_output.put_line ( round ( (dbms_utility.get_time - l_start) / 100, 2) || 'seconds..');
end;
/

1.71seconds..
PL/SQL 처리가 정상적으로 완료되었습니다.
경   과: 00:00:01.07

 

 pl/sql 또는 sql로직에서 바인드변수를 사용한 로직과 사용하지않은 로직을 각각돌려보명 실행시간이  확실히 차이가난다.
  

이 원인은, 바인드변수를 사용하면 shared pool내에서 최초 한버실행한 sql은 다음의 똑같은 sql이 왔을때 다시 hard parse를 하지 않고 이미 parse된 쿼리로 사용하게 되기 때문이다.

 

고로 하드 파싱을 줄이는것이 핵심이라고 할수 있다.

 

 

----------------------------------------------------------------------------------------

EXAMPLE  3.:

 

바인드 변수의 사용시 조건절의 컬럼에 인덱스가 있더라도 varchar2형에 숫자형을 바인드변수로 비교하게되면
인덱스가 있는 컬럼쪽이 to_number()로 형변환이 일어나게 된다. 따라서 인덱스를 사용할수 없고 테이블
풀스캔으로 시도한다.

ex) select empno, ename
from emp
where empno=:v1;


empno를 number로 타입을 바꾸거나,

차선책으로 v1 바인드 변수를 to_char()로 형변환하여 인덱스 스캔이 가능하도록 한다.

 

----------------------------------------------------------------------------------------

EXAMPLE  4.:

 

 

바인드의 가치 

Mark A. Williams

 



 바인드 변수와 ODP.NET을 사용한 .NET 애플리케이션의 성능 향상

 

.NET 애플리케이션에서 Oracle Database의 데이터에 액세스하는 방법에는 여러 가지가 있습니다. 그러나 기능과 성능의 관점에서 볼 때 .NET 애플리케이션을 Oracle Database와 연결하는 방법으로는 Oracle Data Provider for .NET(ODP.NET)가 가장 좋은 선택입니다.

본 컬럼에서는 ODP.NET 10g의 핵심 기능을 통해 .NET 애플리케이션을 향상시킬 수 있는 방법을 중심으로 살펴보기로 하겠습니다. 첫 번째 주제는 ODP.NET 10g와 함께 바인드 변수를 사용하는 방법에 대한 것입니다.

바인드 변수 사용

ODP.NET 10g가 효율적으로 작동하고 확장되도록 만들기 위한 가장 간편하고 효과적인 방법 중 하나는 바인드 변수를 적절히 사용하는 것입니다. 바인드 변수는 다양한 유형의 애플리케이션 성능 향상에 도움이 되지만 여기서는 ODP.NET 10g와 함께 사용하는 경우에 대해 살펴보겠습니다.

바인드 변수는 SQL 문의 위치 표시자입니다. 예를 들어 Oracle Database와 함께 제공되는 HR 샘플 스키마를 사용할 경우, 바인드 변수를 사용하지 않는 일반적인 SELECT 문은 다음과 같습니다.

select country_name from hr.countries where country_id = 'UK' 

보는 것처럼 문의 WHERE 절에 리터럴 텍스트를 ‘UK’로 지정하였습니다. 간단히 한 가지를 변경하여 바인드 변수를 사용하도록 문을 변환할 수 있습니다.

select country_name from hr.countries where country_id = :country_id 

바인드 변수를 사용하는 문으로 변환하기 위해 리터럴 텍스트‘UK’를 :country_id로 식별되는 위치 표시자로 바꾸었습니다. 이 바인드 변수 식별자는 단일 콜론(":")으로 시작되는데 이것은 바인드 변수가 SQL 문에서 어떻게 나타나는지를 보여줍니다.

여기서는 SELECT 문을 사용하여 바인드 변수의 용도를 예시하였으나 바인드 변수는 UPDATE, INSERT, DELETE 문에서도 사용될 수 있으며 또 사용해야 합니다. 다음은 같은 countries 테이블을 사용하여UPDATE 문에서 바인드 변수를 사용한 예입니다.

update hr.countries 
set country_name = :country_name 
where country_id = :country_id 

바인드 변수가 중요한 이유

Oracle Database 10g가 SQL 문으로 제시되면 메모리 영역인 공유 풀을 확인하여 해당 문이 이미 존재하는지, 그 문이 메모리에 저장되어 있는지를 확인합니다. 해당 문이 메모리에 이미 존재하고 Oracle Database 10g가 해당 문을 재사용할 수 있으면 데이터베이스는 이 문의 구문 분석과 최적화 작업을 생략하고 건너뛸 수 있습니다. 바인드 변수를 사용하는 경우에는 SQL 문이 메모리에 저장될 가능성이 매우 높아지므로 SQL 문을 필요로 하는 후속 작업에서 이 문을 신속하게 사용할 수 있습니다.

공유 풀에 해당 문이 존재하지 않는 경우, 데이터베이스는 해당 문에 대한 구문 분석과 최적화 작업을 수행해야 하므로 성능이 저하될 수 있습니다. 문의 구문 분석과 최적화 작업에는 CPU 주기가 소모되며 소모되는 CPU 주기가 많을수록 작업은 더 느려지게 됩니다. 구문 분석과 최적화 작업은 또한 래치라는 메커니즘을 통해 공유 풀의 다양한 부분을 잠금 상태로 두게 됩니다. 한 번에 하나의 프로세스만 래치를 유지할 수 있으므로 공유 풀에 래칭이 증가하면 데이터베이스 안에서 경합이 벌어지게 됩니다.

단일 사용자 시스템에서는 래치가 발생하는 양과 문의 구문 분석 및 최적화에 사용되는 시간이 별로 중요하지 않게 보일 수 있습니다. 그러나 시스템에 사용자가 계속 추가되거나 애플리케이션의 추가 복사본이 실행되면 이러한 이벤트는 순식간에 늘어날 수 있으며 심지어는 시스템을 사용불능 상태로 만들 수도 있습니다.

ODP.NET 10g에서 바인드 변수 구현

ODP.NET 10g 프로그램에서 바인드 변수를 사용하려면 OracleParameter 클래스를 사용하여 .NET 코드로 각 바인드 변수를 표시합니다. OracleParameterCollection 클래스는 그 이름으로 알 수 있듯이 각 문에 대한 OracleCommand 객체와 관련된 OracleParameter 객체를 포함하는 수집 클래스입니다.OracleCommand 클래스는 SQL 문을 데이터베이스에 전달하고 그 결과를 애플리케이션에 반환합니다.

ODP.NET 10g에서는 bind by position(기본값) 또는 bind by name이라는 바인드 변수를 사용하는 두 가지 모드를 사용할 수 있습니다. OracleCommand의 부울 속성 BindByName(기본값은 false)이 모드를 설정합니다. bind by position 모드를 사용할 경우 SQL 문에 보이는 것과 같은 순서로OracleParameterCollection 모음에 이 매개변수를 추가해야 합니다. 명령어 객체에 대한 모음에 매개변수를 추가하려면 Parameters 속성에서 Add 메소드를 사용합니다. bind by name 모드를 사용할 경우는 이 모음에 어떤 순서로 매개변수를 추가해도 관계 없으나, 해당 매개변수 객체에 대한ParameterName 속성을 SQL 문의 바인드 변수 식별자와 같은 값으로 설정해야 합니다.

바인딩 모드(by position 또는 by name) 외에도 일반적으로 각 매개변수 객체에 대해 다음과 같은 몇 가지 속성을 설정합니다.

  • Direction
  • OracleDbType
  • Size
  • Value

바인드 변수는 출력, 입력 또는 입/출력 매개변수로 사용될 수 있습니다. 각 매개변수에 대해 적절한 방향을 표시하려면 Direction 속성을 사용합니다. Direction 속성의 기본값은 Input.입니다. 이 매개변수가 숫자, 날짜, VARCHAR2 등 가운데 어떤 것인지 표시하려면 OracleDbType 속성을 사용합니다. VARCHAR2데이터 유형과 같은 변수 길이 데이터 유형을 사용할 경우, 매개변수가 가지고 있는 데이터의 최대 크기를 표시하려면 Size 속성을 사용합니다. Value 속성에는 문 실행 전(입력 매개변수의 경우), 실행 후(출력 매개변수의 경우), 또는 전후(입/출력 매개변수의 경우)의 매개변수 값이 들어있습니다.

목록 1의 Main 메소드는 이러한 개념들을 하나로 묶어주며 SELECT 문에서 바인드 변수를 사용합니다. 다음은 Main 메소드의 핵심 부분입니다.

OracleCommand cmd = new OracleCommand(); 

?명령 객체(OracleCommand) 생성

OracleParameter p_country_id = new OracleParameter(); 

?매개변수 객체(OracleParameter) 생성

p_country_id.OracleDbType = OracleDbType.Varchar2; p_country_id.Value = "UK"; 

?매개변수 객체의 OracleDbType 및 Value 속성 설정

다음 단계

ODP.NET에 대한 추가 정보
Oracle Data Provider for .NET 개발자 가이드

다운로드
이 컬럼에 대한 샘플 애플리케이션 
ODP.NET 10g 
Oracle Developer Tools for Visual Studio .NET

Direction 속성이 기본값 Input을 사용하며 Size 속성은 설정되어 있지 않은 점에 주의하십시오. 이 객체는 입력 매개변수이므로 속성을 설정할 필요가 없습니다. Data Provider가 해당 값의 크기를 결정할 수 있기 때문입니다.

cmd.Parameters.Add(p_country_id); 

?모음에 매개변수 추가

목록 1의 샘플 애플리케이션을 실행하려면 .NET 콘솔 애플리케이션을 생성하고 메소드의 본문으로서 목록 1 코드를 사용하여 Main 메소드를 생성합니다. 프로젝트에 ODP.NET 10g 어셈블리에 대한 참조를 추가하고 코드 모듈 상단에 Oracle .DataAccess.Client 이름 공간을 포함시켜야 합니다. 참조를 추가하려면 Microsoft Visual Studio .NET 2003 메뉴 표시줄에서 Project -> Add Reference...를 선택한 다음 Add Reference 대화상자에서 Oracle .DataAccess.dll을 선택합니다. 이름 공간을 포함시키려면 using Oracle.DataAccess.Client;를 코드 모듈 상단에 추가합니다. 출력 결과는 다음과 같습니다.

C:\VTB\bin\Release>ValuesThatBind.exe Country Name: United Kingdom 

코드 목록 1: 바인드 변수 사용

static void Main(string[] args) { 
 string constr = "User Id=hr; 
 Password=hr; Data Source=oramag"; 
 OracleConnection con = new OracleConnection(constr); 
 con.Open(); 
 StringBuilder sbSQL = new StringBuilder(); 
 sbSQL.Append("select country_name "); 
 sbSQL.Append("from countries "); 
 sbSQL.Append("where country_id = :country_id"); 
 OracleCommand cmd = new OracleCommand(); 
 cmd.Connection = con; cmd.CommandText = sbSQL.ToString(); 
 OracleParameter p_country_id = new OracleParameter(); 
 p_country_id.OracleDbType = OracleDbType.Varchar2; 
 p_country_id.Value = "UK"; cmd.Parameters.Add(p_country_id); 
 OracleDataReader dr = cmd.ExecuteReader(); 


 if (dr.Read()) 
 { 
 Console.WriteLine("Country Name: {0}", dr.GetOracleString(0)); 
 } 
 
 dr.Dispose(); 
 p_country_id.Dispose(); 
 cmd.Dispose(); 
 con.Dispose(); 
} 

바인드 변수: 계속 사용 권장

본 컬럼에서는 .NET 애플리케이션에서 ODP.NET 10g와 함께 간단한 바인드 변수를 사용하는 방법에 대해 설명했습니다. 바인드 변수를 사용할 때와 그렇지 않은 경우에 대해 각 애플리케이션을 테스트하여 바인드 변수의 이점을 확인해 보시기 바랍니다..

 

 

----------------------------------------------------------------------------------------

EXAMPLE  5.:

 

 

Bind 변수를 활용하자

다음과 같은 SQL 구문에 대해 생각해 봅시다.

SELECT * FROM customer WHERE custid=1 
SELECT * FROM customer WHERE custid=249 
SELECT * FROM customer WHERE custid=6380 

오라클은 기본적으로 각각의 구문 별로 다른 실행 계획을 사용합니다. 이 쿼리들이 모두 동일한 구문을 기반으로 하는 것임을 감안하면, 이러한 방법은 시간과 리소스 면에서 낭비일 수 있습니다. 그 대신, 쿼리에 바인드 변수(bind variable; “:var”)를 적용하고 1, 249, 6380의 값을 적용하는 방법을 사용할 수 있습니다. 이렇게 하면 모든 SQL 구문이 동일한 실행 계획을 공유하도록 할 수 있습니다:

변수에 바인드 된 값SQL
1
249SELECT * FROM customer WHERE custid=:var
6380

$value를 :var 에 바인딩 PHP 코드 예제가 다음과 같습니다:

OCIParse($conn, 'SELECT * FROM customer WHERE custid=:var'); 
OciBindByName($stmt, ":var", $value,32); 
# 32 is an arbitrary large size $value = 1; 
OCIExecute($stmt); 
DisplayResults($stmt); 
$value = 249; 
OCIExecute($stmt); 
DisplayResults($stmt); 
$value = 6380; OCIExecute($stmt); 
DisplayResults($stmt); 

바인딩은 “SQL injection” 공격의 피해를 줄일 수 있다는 또 다른 장점이 있습니다 (공격자들은 SQL 구문을 마음대로 조작하기 어렵게 됩니다).

Cursor sharing. 바인딩을 사용하지 않는 SQL 구문이 이미 많이 사용되고 있다면, Oracle8 이후 버전에서 제공되는 CURSOR_SHARING 매개변수를 사용하여 컴파일 과정에 수반되는 오버헤드를 줄일 수 있습니다. 아래 SQL 구문을 실행하는 경우 오라클은 모든 쿼리를 바인드 변수를 사용하도록 재작성합니다:

ALTER SESSION SET CURSOR_SHARING='FORCE' 

따라서 아래 구문은 파서(parser)에 전달되기 전에 바인딩이 가능한 구문으로 자동 변환됩니다:

변경 전: SELECT * FROM customer WHERE custid=6380 
변경 후: SELECT * FROM customer WHERE custid=:SYS_B_0 

CURSOR_SHARING을 이용하면 실행 계획의 공유 및 재활용 수준을 개선할 수 있습니다. 하지만 그 효과는 제한적입니다. 각 구문 별로 직접 바인드 변수를 적용하는 것이 더 효과적입니다. 또 SQL injection 공격의 방지 효과를 기대할 수 없다는 문제도 있습니다.

Oracle9i 이후 버전에서는 CURSOR_SHARING='SIMILAR'를 활용할 수 있습니다. 이 매개변수는 보다 지능적인 알고리즘을 사용하며, 바인드 변수의 적용여부를 결정하기 전에 테이블 통계정보를 참고합니다.

ALTER SESSION 명령은 현재 세션에만 영향을 미칩니다. 따라서 데이타베이스에 연결을 설정할 때마다 다시 호출되어야 합니다. 영구적으로 변경 사항을 적용하려면 DBA에게 요청하여 데이타베이스 매개변수 파일(init.ora 또는 spfile)을 변경해야 합니다.

다음 섹션에서는, 벤치마크 테스트를 통해 바인드 변수 적용에 따른 성능의 차이를 비교해 보도록 하겠습니다. 예제로 사용된 INSERT 구문에서 100% 이상의 성능 개선이 있었음을 확인하실 수 있을 것입니다. 

Posted by Sting!

오라클에서 10g 다운로드를 중단했다...


10g 서버를 깔아야하는 일이 발생했는데 당췌 구할수가 없었는데


마지막으로 들어간 블로그에서 결국 발견했다.


ORACLE 11G - 32, 64 bits database, client download

ORACLE 10G - 32, 64 bits database, client download

ORACLE 9i - client download

ORACLE 8i - client download


Download Link

http://smartuu.blogspot.kr/2013/04/download-oracle-all-version-10g-64bit.html


이곳도 결국 막혔네요.

Posted by Sting!