달력

42025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

TKPROF 관련 정보

업무질... 2014. 8. 26. 18:06

원문: http://www.gurubee.net/lecture/2130


10046 Trace 사용 순서

  아래와 같은 순서로 사용을 하면 된다.

① 자신이 접속한 Session의 SPID(Server Process ID)를 확인한다.
 
-- SYSDBA 권한으로 접속한다. 
SQL> SELECT P.SPID SERVER
     FROM V$PROCESS P, V$SESSION S
     WHERE P.ADDR = S.PADDR
       AND S.AUDSID = USERENV('SESSIONID');

    SERVER
    ------
    218038
    

② 10046 Trace 활성화

  아래 명령어로 SQL Trace를 활성화 할 수 있다.

 
SQL> ALTER SESSION SET 
     EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 1';
    

항 목설 명
LEVEL - 1기본 정보
LEVEL - 4기본 정보 + Binding 정보
LEVEL - 8기본 정보 + Waiting 정보
LEVEL - 12기본 정보 + Binding 정보 + Waiting 정보

③ SQL 수행

  Trace를 분석 할 SQL 문장을 실행 시킨다.

 
SQL> SELECT *
     FROM EMP E
     WHERE E.EMPNO = 9999999
     AND E.DEPTNO = 10;
    

④ 10046 Trace 비 활성화

  SQL_TRACE 옵션을 FALSE로 Trace 모드를 비 활성화 한다.

 
SQL> ALTER SESSION SET SQL_TRACE=FALSE;
    

⑤ Trace 파일 확인

  ①번 단계에서 조회한 SPID와 동일한 trc 파일이 생성되었는지 확인해 본다.

  • USER_DUMP_DEST(UDUMP)에서 SPID.trc 파일 확인
  • - 일반적인 UDUMP 파일 경로
    • $ORACLE_HOME/admin/Instance Name/udump/spid.trc

⑥ 218038.trc 파일 확인

  아래 예제와 같이 trc 파일은 직관적으로 보기가 어렵다.

 
=====================
PARSING IN CURSOR #2 len=69 dep=0 uid=44 oct=3 lid=44 tim=65620558312435 hv=1079158054 ad='a3a0eaf0'
SELECT *
FROM   EMP E
WHERE  E.EMPNO  = 9999999
AND    E.DEPTNO = 10
END OF STMT
PARSE #2:c=0,e=4143,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=65620558312421
EXEC #2:c=0,e=159,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=65620558312792
FETCH #2:c=10000,e=3280,p=3,cr=4,cu=0,mis=0,r=0,dep=0,og=1,tim=65620558316229
    

⑦ TKPROF Util 사용하여 파일 변환

  tkprof 유틸을 사용하면 분석하기 쉬운 포맷으로 변환한다.

 
tkprof 218038.trc 218038.txt
    

TKPROF 구문
Options설명
SORT = option명령문 정렬 순서(ex. fchela : fetch 하는데 수행시간이 가장 오래 걸린 SQL로 Descending Sort)
EXPLAIN = username/password지정된 schema에서 EXPLAIN PLAN을 실행 함
SYS = NOuser에 의해 실행된 Recursive SQL문의 나열 비 활성화
AGGREGATE = NO다른 user의 동일한 SQL문을 하나의 레코드로 집계하지 않음
WAITS = YESTrace파일에서 발견된 모든 Wait이벤트에 대한 요약 기록 여부

⑧ 변환한 218038.txt 파일 확인

  아래는 tkprof 유틸로 변환한 218038.txt 파일의 내용이다. 자세한 설명은 아래 표를 참고하기 바란다.

 
SELECT *
FROM   EMP E
WHERE  E.EMPNO  = 9999999
AND    E.DEPTNO = 10

-- #보기 1
Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.002          0          0          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        1    0.000        0.028          3          4          0          0
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total        3    0.000        0.031          3          4          0          0

-- #보기 2
Misses in library cache during parse: 1
Optimizer goal: ALL_ROWS
Parsing user: APPS (ID=44)

-- #보기 3
Rows     Row Source Operation
-------  ---------------------------------------------------
      0  STATEMENT
      0   TABLE ACCESS BY INDEX ROWID EMP (cr=4 pr=3 pw=0 time=28400 us)
      1    INDEX UNIQUE SCAN EMP_U1 (cr=3 pr=2 pw=0 time=22438 us)(Object ID 6485271)
    

변환한 218038.txt 파일 설명
구분항목설명
보기1CallParseSQL을 Parsing하는 구간
ExecuteSQL을 실제 수행하는 구간. DML일 경우 이 부분이 표시됨
FetchSQL을 통해 나온 값을 사용자에게 반환하는 구간
CpuCPU에서 수행한 시간(단위 : 초)
Elapsed각 구간에서 시작과 종료까지 총 수행한 시간(단위 : 초)
DiskDisk에서 Block을 읽은 양(Physical Read)
QueryMemory에 Block을 읽은 양(Logical Read)
Current현재의 Session에서 Commit하지 않은 Block을 읽은 양
Rows각 단계별 액세스한 ROWS
보기2Misses in library 
cache during parse
Parse 구간에서 해당 SQL을 Library Cache에서 읽지 못하고 잃어버린 횟수
값은 1씩 증가함
값이 1이면 Hard Parse. 0이면 Soft Parse를 의미함
보기3cr(consistent read)Logical Block Read
pr(Physical Read)Physical Block Read
pw(Physical Write)Physical Block Write
time수행시간(단위 - 1 / 1,000,000 초)


'업무질...' 카테고리의 다른 글

Exception의 종류와 설명  (0) 2014.07.29
Caucho 프로젝트  (0) 2014.07.29
Java의 ClassLoader 이해  (0) 2014.07.28
Enqueue와 Latch  (0) 2014.07.03
웹 접근성(Web accessibility)에 대한 한 마디  (0) 2014.04.03
Posted by 릴라강림
|

Error 예외 종류

CharConversionException 문자 변환으로 발생하는 예외의 base class입니다. 
EOFException 입력의 도중에, 예상외의 파일의 종료, 또는 예상외의 Stream의 종료가 있던 것을 나타내는 시그널입니다.
FileNotFoundException 지정된 패스명으로 나타나는 파일이 열리지 않았던 것을 통지합니다. 
InterruptedIOException 입출력 처리로 세치기가 발생한 것을 통지하는 시그널을 발생시킵니다. 
InvalidClassException 직렬화 런타임이, 클래스에 도착해 다음의 문제의 어떤 것인지를 검출했을 때에 슬로우 됩니다. 
InvalidObjectException 1 개(살) 이상의 직렬화 복원 오브젝트가 검증을 패스하지 않았던 것을 나타냅니다. 
IOException 하등의 입출력 예외의 발생을 통지하는 시그널을 발생시킵니다. 
NotActiveException 직렬화 또는 직렬화 복원이 액티브하지 않는 경우에 슬로우 됩니다. 
NotSerializableException 인스턴스가 직렬화 가능 인터페이스를 가질 필요가 있는 경우에 슬로우 됩니다. 
ObjectStreamException 오브젝트 Stream 클래스에 고유의 예외 모든 슈퍼 클래스입니다. 
OptionalDataException 원시적 데이터가 읽히지 않은지, 또는 데이터의 마지막이 Stream내의 직렬화 오브젝트에 있기 (위해)때문에, 오브젝트의 read 조작이 실패한 것을 나타내는 예외입니다. 
StreamCorruptedException 오브젝트 Stream로부터 읽힌 제어 정보가, 내부 정합성 검사에 위반하고 있었을 경우에 슬로우 됩니다. 
SyncFailedException 동기 (sync) 오퍼레이션이 실패한 것을 통지합니다. 
UnsupportedEncodingException 문자의 인코딩이 서포트되고 있지 않습니다. 
UTFDataFormatException 부정한 구조를 가지는 UTF-8 스트링이, 데이터 입력 Stream내에 읽혔는지, 또는 데이터 입력 인터페이스를 구현하는 클래스에 의해 읽힌 것을 나타냅니다. 
WriteAbortedException 기입 오퍼레이션중에 ObjectStreamException 가 슬로우 된 것을 통지합니다.

java.lang
Java 프로그램 언어의 설계해 기본적인 클래스를 제공합니다. 무엇보다 중요한 클래스는 클래스 계층 루트 Object 와 실행시의 클래스를 나타내는 인스턴스 Class 입니다 
원시적형의 값을 오브젝트와 같이 나타내는 경우에는 자주(잘) 필요하게 됩니다. 래퍼 클래스 Boolean,Character,Integer,Long,Float, 및 Double 가 이 목적으로 사용됩니다. 예를 들어,Double 형의 오브젝트는 double 형의 필드를 포함해, 참조형의 변수에 격납되는 앞에의 참조라고 하는 방법으로 값을 나타냅니다. 이 클래스는 원시적치의 사이에 변환하는 메소드를 제공하는 것과 동시에,equals 및 hashCode 등의 표준 메소드를 서포트합니다 
클래스 Math 는, 탄젠트 (싸인), 여현 (코사인), 평방근이라고 하는 계산으로 자주(잘) 사용되는 함수를 제공합니다. 클래스 String 및 StringBuffer 는 스트링으로 자주(잘) 사용되는 오퍼레이션을 제공합니다 
클래스 ClassLoader,Process,Runtime, SecurityManager, 및 System 는, 동적인 클래스의 로드, 외부 프로세스의 작성, 일자등의 호스트 환경의 조회, 및 시큐러티 폴리시의 실시를 관리하는 「시스템 오퍼레이션」을 제공합니다 
클래스 Throwable 는 throw 문 (§14. 16)에 의해 슬로우 되는 오브젝트를 포함 합니다. Throwable 의 서브 클래스는 에러와 예외를 나타냅니다

예외의 개요 
ArithmeticException 산술 계산으로 예외적 조건이 발생했을 경우에 슬로우 됩니다. 
ArrayIndexOutOfBoundsException 부정한 인덱스를 사용해 배열이 액세스 된 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
ArrayStoreException 부정한 형태의 오브젝트를 오브젝트의 배열에 격납하려고 한 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
ClassCastException 어느 오브젝트를 상속 관계에 없는 클래스에 캐스트 하려고 한 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
ClassNotFoundException 어플리케이션이, 클래스의 스트링명을 사용해 다음의 메소드로 로드하려고 했지만, 지정된 이름의 클래스의 정의가 발견되지 않았던 경우에 슬로우 됩니다. 
CloneNotSupportedException 오브젝트를 복제하기 위해서 Object 클래스의 clone 메소드가 불려 갔지만, 그 오브젝트의 클래스가Cloneable 인터페이스를 구현하고 있지 않는 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
Exception Exception 클래스와 그 서브 클래스는, 통상의 어플리케이션으로 캐치 될 가능성이 있는 상태를 나타내는 Throwable 의 형식의 1 개입니다. 
IllegalAccessException 어플리케이션이, 배열 이외의 인스턴스 작성, 필드의 설정 또는 취득, 메소드의 호출을 시도했을 경우에, IllegalAccessException 가 슬로우 됩니다. 
IllegalArgumentException 부정한 인수, 또는 부적절한 인수를 메소드에 건네준 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
IllegalMonitorStateException 소정의 모니터를 가지지 않는 thread가 오브젝트의 모니터로 기다리는 것을 시도한 것, 혹은 다른 thread가 소정의 모니터를 가지지 않고 오브젝트의 모니터로 기다리는 것을 통지한 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
IllegalStateException 부정 또는 부적절한 때에 메소드가 불려 간 것을 나타냅니다. 
IllegalThreadStateException 요구된 오퍼레이션에 대해서 thread 상태가 부적절한 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
IndexOutOfBoundsException 어떤 종류의 인덱스 (배열, 스트링, 벡터등)가 범위외인 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
InstantiationException 어플리케이션이 Class 클래스의 newInstance 메소드를 사용해 클래스의 인스턴스를 생성하려고 했을 때에, 클래스가 인터페이스 또는 abstract 클래스이기 위해서(때문에) 지정된 오브젝트의 인스턴스를 생성할 수 없는 경우에 슬로우 됩니다. 
InterruptedException 어느 thread가 오랫동안의 대기 상태, 휴지 상태, 또는 일시정지 상태일 때, 다른 thread가 Thread 클래스의 interrupt 메소드를 사용해 이 상태에 세치기를 걸었을 경우에 슬로우 됩니다. 
NegativeArraySizeException 부의 사이즈를 가진 배열을 어플리케이션이 작성하려고 했을 경우에 슬로우 됩니다. 
NoSuchFieldException 지정된 이름의 필드가 클래스에는 없는 것을 통지합니다. 
NoSuchMethodException 특정의 메소드가 발견되지 않는 경우에 슬로우 됩니다. 
NullPointerException 오브젝트가 필요한 경우에, 어플리케이션이 null 를 사용하려고 하면(자) 슬로우 됩니다. 
NumberFormatException 어플리케이션이 스트링을 수치형으로 변환하려고 했을 때, 스트링의 형식이 올바르지 않은 경우에 슬로우 됩니다. 
RuntimeException RuntimeException 는, Java 가상 머신의 통상의 처리로 슬로우 할 수가 있는 각종의 예외의 슈퍼 클래스입니다. 
SecurityException 시큐러티 매니저에 의해 슬로우 되어 시큐러티 위반을 나타냅니다. 
StringIndexOutOfBoundsException String 메소드에 의해 슬로우 되어 인덱스가 부 또는 스트링의 사이즈보다 큰 일을 나타냅니다. 
UnsupportedOperationException 요구된 오퍼레이션이 서포트되어 있지 않은 것을 나타내기 위해서(때문에) 슬로우 됩니다. 

에러의 개요 
AbstractMethodError 어플리케이션이 abstract 메소드를 호출하려고 했을 경우에 슬로우 됩니다. 
AssertionError 선언이 실패한 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
ClassCircularityError 클래스의 초기화시에 루프가 발견되었을 경우에 슬로우 됩니다. 
ClassFormatError Java 가상 머신이 클래스 파일을 읽어들이려고, 파일이 망가져 있다고 판단했을 경우, 또는 클래스 파일로서 해석할 수 없는 경우에 슬로우 됩니다. 
Error Error 는 Throwable 의 서브 클래스에서, 통상의 어플리케이션이면 캐치 해서는 안되는 중대한 문제를 나타냅니다. 
ExceptionInInitializerError static 초기화자로 예상외의 예외가 발생한 것을 통지합니다. 
IllegalAccessError 액세스 할 수 없는 필드에의 액세스나 변경, 혹은 액세스 할 수 없는 메소드의 호출을 어플리케이션이 시도했을 경우에 슬로우 됩니다. 
IncompatibleClassChangeError 클래스 정의에 호환성이 없는 변경이 있었을 경우에 슬로우 됩니다. 
InstantiationError 어플리케이션이 Java 의 new 구문을 사용해 abstract 클래스나 인터페이스의 인스턴스를 생성하려고 했을 때에 슬로우 됩니다. 
InternalError Java 가상 머신내에서 예기치 않은 내부 에러가 발생한 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
LinkageError LinkageError 의 서브 클래스는, 어느 클래스가 다른 클래스에 의존관계(dependencies)가 있는 경우에, 전자의 클래스를 컴파일 한 뒤, 후자의 클래스에의 변경에 의해 호환성이 없어진 것을 나타냅니다. 
NoClassDefFoundError 통상의 메소드 호출해, 혹은 new 식을 사용한 새로운 인스턴스의 생성으로, Java 가상 머신 또는 ClassLoader 인스턴스가 클래스 정의를 로드하려고 했지만, 클래스 정의가 보고 매운 있고 경우에 슬로우 됩니다. 
NoSuchFieldError 오브젝트의 지정된 필드에 어플리케이션이 액세스, 또는 변경을 시도했을 때, 오브젝트에 그 필드가 없는 경우에 슬로우 됩니다. 
NoSuchMethodError 어느 클래스의 특정의 메소드 (static 메소드, 또는 인스턴스 메소드)를 어플리케이션이 호출하려고 했을 때, 벌써 그 클래스에는 불려 간 메소드의 정의가 없는 경우에 슬로우 됩니다. 
OutOfMemoryError 메모리 부족을 위해서(때문에) Java 가상 머신이 오브젝트를 할당하지 못하고, 가베지 수집가에 의해도 사용 가능한 메모리를 더 이상 확보 가능한 있고 경우에 슬로우 됩니다. 
StackOverflowError 어플리케이션에서의 재귀의 회수가 너무 많아서 스택 오버플로우가 일어나는 경우에 슬로우 됩니다.
ThreadDeath ThreadDeath 의 인스턴스는,Thread 클래스의 인수 없음의 stop 메소드가 불려 가면(자), 대상이 되는 thread내에서 슬로우 됩니다. 
UnknownError 미지이지만 중대한 예외가 Java 가상 머신으로 발생했을 경우에 슬로우 됩니다. 
UnsatisfiedLinkError Java 가상 머신이,native 라고 선언된 메소드의 적절한 네이티브 언어의 정의를 찾아낼 수가 없는 경우에 슬로우 됩니다. 
UnsupportedClassVersionError Java Virtual Machine 가, 클래스 파일의 read중에, 그 파일의 메이저 버젼 번호와 마이너 버젼 번호가 서포트되어 있지 않으면 판정했을 경우에 슬로우 됩니다. 
VerifyError 클래스 파일이 적절한 형식에서도, 어떤 종류의 내부 모순 또는 시큐러티상의 문제가 있는 것을 「베리파이아 (verifier)」가 검출했을 경우에 슬로우 됩니다. 
VirtualMachineError Java 가상 머신이 망가져 있는지, 또는 동작을 계속하는데 필요한 자원이 부족하게 된 것을 나타내기 위해서(때문에) 슬로우 됩니다.


java.net
네트워크 대응 어플리케이션을 구현하기 위한 클래스를 제공합니다. 소켓 관련의 각 클래스를 사용해, 인터넷상의 임의의 서버와 통신하거나 독자적인 인터넷 서버를 구현하거나 할 수 있습니다. 인터넷상의 데이터의 취득에 URL (Universal Resource Locator)를 간단하게 사용할 수 있도록, 다수의 클래스를 제공하고 있습니다. 
예외의 개요 
BindException 로컬인 주소 및 포토에 대해서 소켓의 바인드를 시행중에 에러가 발생한 것을 통지합니다. 
ConnectException 리모트인 주소 및 포토에 대해서 소켓의 접속을 시행중에 에러가 발생한 것을 통지합니다. 
MalformedURLException 무효인 서식의 URL 가 발생한 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
NoRouteToHostException 소켓을 리모트 주소 및 포토에 접속하려고 했을 때에 에러가 발생한 것을 나타냅니다. 
PortUnreachableException ICMP 포토 도달 불가능 메세지가 접속된 데이터 그램에 수신된 것을 나타내는 시그널입니다. 
ProtocolException 사용하고 있는 프로토콜로 에러 (TCP 에러등)가 발생한 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
SocketException 사용하고 있는 프로토콜로 에러 (TCP 에러등)가 발생한 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
SocketTimeoutException 소켓의 읽어들여 또는 수락으로 타임 아웃이 발생한 것을 나타내는 시그널입니다. 
UnknownHostException 호스트의 IP 주소를 판정할 수 없었던 경우에 슬로우 됩니다. 
UnknownServiceException 미지의 서비스 예외가 발생한 것을 나타내기 위해서(때문에) 슬로우 됩니다. 
URISyntaxException 스트링을 URI 참조로서 해석할 수 없었던 것을 나타내기 위해서(때문에) 슬로우 된 확인 끝난 예외입니다.

java.sql
JavaTM 프로그램 언어를 사용해 데이터 소스 (통상은 RDB)의 데이터에 액세스 해 처리하는 API 를 제공합니다. 이 API 에 포함되어 있는 체제로, 복수의 드라이버를 인스톨 해 복수의 데이터 소스에 동적으로 액세스 할 수가 있습니다. JDBCTM API 는 주로 SQL 문을 데이타베이스에 건네주기 위해서(때문에) 만들어지고 있습니다만, 겉(표) 형식의 임의의 데이터 소스의 데이터의 read 및 기입을 제공합니다. javax.sql.RowSet 인터페이스 그룹을 개입시켜 사용 가능한 읽어들여/기입 기능은, 스프레드쉬트, 플랫 파일, 또는 다른 겉(표) 형식의 데이터 소스의 데이터를 사용하거나 갱신하기 위해서 커스터마이즈 할 수 있습니다. 
예외의 개요 
BatchUpdateException 배치 갱신 오퍼레이션중에 에러가 발생했을 때에 슬로우 되는 예외입니다. 
DataTruncation JDBC 가 예기 하지 않고 데이터의 값을 잘라 버리는 경우에, DataTruncation 경고를 통지하는 (read시)인가, DataTruncation 예외를 슬로우 하는 (기입시) 예외입니다. 
SQLException 데이타베이스 액세스 에러 또는 그 외의 에러에 관한 정보를 제공하는 예외입니다. 
SQLWarning 데이타베이스 액세스의 경고에 관한 정보를 제공하는 예외입니다.

java.util
이 패키지에는, 콜렉션 체제, 유산 콜렉션 클래스, 이벤트 모델, 일시 기능, 국제화, 및 다양한 유틸리티 클래스 (StringTokenizer, 난수 제너레이터, 및 비트 배열)가 포함되어 있습니다. 
예외의 개요 
ConcurrentModificationException 이 예외는, 오브젝트의 동시 변경을 검출한 메소드에 의해, 그러한 변경이 허가되어 있지 않은 경우에 슬로우 됩니다. 
EmptyStackException Stack 클래스의 메소드에 의해 슬로우 되어 그 스택이 하늘인 것을 나타냅니다 
MissingResourceException 자원이 결핍 하고 있는 것을 통지합니다. 
NoSuchElementException 이 열거에 그 이상의 요소가 없으면Enumeration 의 nextElement 메소드에 의해 슬로우 됩니다. 
TooManyListenersException TooManyListenersException 는, Java 이벤트 모델의 일부로서 통상은 멀티 캐스트의 이벤트 소스를 uni-cast의 특수한 케이스이다고 주석을 붙여 구현하기 위해서 사용합니다.

org.xml.sax 
예외 
SAXException 
SAXNotRecognizedException 
SAXNotSupportedException 
SAXParseException


error 팁 : 1. 예외처리를 해주지 않아도 되지만 초보들이 많이 구경하는 예외가 있습니다.
ArithmeticException -> 산술에러로서 0으로 나눈다든가등의 산술적 계산 오류에서 일어납니다.
ArrayIndexOutofBoundsException -> 배열의 크기가 주어진 값을 넘어갔을 때 일어납니다.
NullPointException -> local변수의 초기화를 해주지 않을 경우 일어납니다.



[출처] Exception 종류와 설명|작성자 어우냐아


'업무질...' 카테고리의 다른 글

TKPROF 관련 정보  (0) 2014.08.26
Caucho 프로젝트  (0) 2014.07.29
Java의 ClassLoader 이해  (0) 2014.07.28
Enqueue와 Latch  (0) 2014.07.03
웹 접근성(Web accessibility)에 대한 한 마디  (0) 2014.04.03
Posted by 릴라강림
|

Caucho 프로젝트

업무질... 2014. 7. 29. 08:57

caucho가 먼가했더니 -_- 스페인어로 고무란다... 먼가 유연하고 그런걸 상징하고자 한건가?

찾아보니 caucho란 것이 resin + php 환경을 지원하는 오픈 프로젝트라고 한다. 

물론 여기서 resin은 상업용 (-ㅅ-) ;;;

대강 기존의 php가 인터프리터 방식으로 작동하면서 가지고 있던 속도의 한계나 로드벨런싱의 어려움 세션 공유의 어려움 등을 해결하기 위한 방식이라고 한다. (난 php를 본 적 없다 ㅎㅎㅎ)

이걸 찾은게 SystemClassLoader 문제로 웹을 뒤지다가 본 클래스 패스에 포함되어 있었던 명칭이다. 

흠 -_-; 이게 자바 프로젝트로 포함이 된건가?

먼지 모르겠네 ;;;

'업무질...' 카테고리의 다른 글

TKPROF 관련 정보  (0) 2014.08.26
Exception의 종류와 설명  (0) 2014.07.29
Java의 ClassLoader 이해  (0) 2014.07.28
Enqueue와 Latch  (0) 2014.07.03
웹 접근성(Web accessibility)에 대한 한 마디  (0) 2014.04.03
Posted by 릴라강림
|

펌 http://xpace.tistory.com/20


클래스 로딩 순서

만약 동일한 클래스가 여러 곳에 설정되어있을 때 로딩 우선순위는 다음과 같다.

1. Xbootclasspath에 설정된 파일 <- BOOT LOADER

2. JAVA_HOME/jre/lib/ext에 있는 파일 <- EXT LOADER

3. MENIFEST.MF의 Class-Path에 설정된 클래스 <- APP LOADER

4. -cp or -classpath에 설정된 파일 <- APP LOADER

5. 환경변수 CLASSPATH에 설정된 파일 <- APP LOADER

* Java -jar로 클래스를 실행한 경우 클래스패스를 추가하고자 하면 JAVA_HOME/jre/lib/ext에 복사하거나 MENIFEST.MF의 Class-Path를 편집하는 방법이 있다

* App Loader를 위한 클래스 패스 설정은 같이 사용할 수 없고 그 중에서 하나를 선택해야 한다


클래스 로더 구조


ClassLoader의 주요 메소드는 findClass, loadClass이다. (각 로더마다 구현해야 함)


Application Server의 ClassLoader

단순한 자바 Application의 ClassLoader는 SystemClassLoader(BootClassLoader), ExtClassLoader, AppClassLoader의 3계층으로 구성된다. 그러나 WAS는 Servlet 컨테이너와 그 아리에 각 Servlet Context를 위한 클래스 로더를 별도로 두고 있다. 



AppClassLoader와 ServletContainerClassLoader는 같이 사용되기도 하지만 보통 분리된다. Tomcat의 경우 ServletContainerClassLoader는 TOMCAT_HOME/common/lib의 클래스들을 로딩한다.


ServletContainerClassLoader나 ServletContextClassLoader는 WAS 벤더에 의해 구현되기 때문에 세부적인 상황이 버전에 따라 다를 수 있다. 따라서 구체적으로 클래스를 어떻게 배치할 것인가는 해당 WAS의 구현을 확인하고 결정해야 한다.


Servlet 2.3 spec for ClassLoader

서블릿 스팩을 보면 WAR를 위한 클래스 로딩 방식이 일반 자바 클래스 로더와 규칙이 다름을 알 수 있다.

Servlet Spec

SRV.9.5 Directory Structure

The web application classloader must load classes from the WEB-INF/ classes directory first, and then from library JARs in the WEB-INF/lib directory.

..

SRV.9.7.2 Web Application Classloader

The classloader that a container uses to load a servlet in a WAR must allow the developer to load any resources contained in library JARs within the WAR following normal J2SE semantics using getResource().

It must not allow the WAR to override J2SE or Java servlet API classes.

It is further recommended that the loader not allow servlets in the WAR access to the web container’s implementation classes.

It is recommended also that the application class loader be implemented so that classes and resources packaged within the WAR are loaded in preference to classes and resources residing in container-wide library JARs.



스팩과 클래스 로더

-         WEB-INF/classes WEB-INF/lib는 동일 로더에 의해 로딩되지만 로더는 WEB-INF/clasess를 먼저 검색/로딩한다(must)

-         Servlet-API를 구현한 서블릿 컨테이너 클래스를 웹 어플리케이션이 Access할 수 없도록 하라(recommend)

-         WAR내부의 클래스를 컨테이너 클래스 패스의 클래스보다 먼저 로딩하라(recommend)

서블릿 스팩의 일부 모호한 점으로 인해 (recommend)형태의 항목은 서브릿 엔진에 따라서 다르게 구현하고 있거나 옵션 처리되어 있을 것이다.

ServletContextClassLoader구현

서블릿 스팩을 근거로 하여 ServletContextClassLoader(이하 SCCL)의 구현하기 위해서는 다음과 같은 형태로 로직이 구현되어야 한다클래스 load 요청이 들어 오면 먼저 자기 자신의 클래스 패스를 검색하고 이후에 parent 로더에게 요청한다.

 protected synchronized Class loadClass(String name, boolean resolve) {

             // First, check if the class has already been loaded

             Class c = findLoadedClass(name);

           If(c == null){

try{

c = findClass(name); ç Own Classpath 먼저 검색

} catch (ClassNotFoundException e) {

if (parent != null) {

                     c = parent.loadClass(name, false);

                  } else {

                     c = findBootstrapClass0(name);

                  }

}

}

             return c;

    }

 

위 로직은 서블릿 스팩을 완전하게 구현한 것이 아니다실제 서블릿 스팩을 보면 servlet API 관련한 클래스는 WAR가 아닌 Servlet Container에서 로딩하도록 되어있다따라서c=findClass(name)을 수행하기 전에 로딩해야 할 클래스가 서블릿 API관련한 클래스인지를 검사하는 로직이 필요하다만약 로딩해야할 클래스가 서블릿API관련 클래스이면 parent.loadClass()를 먼저 호출하도록 구현되어야 한다.


즉 여기서 말하는 건 각 컨텍스트의 독립성(그리고 이동성)을 보장하기 위한 servlet spec에 대한 설명이다. 하지만 밑에서 설명하는 것처럼 이런 방식은 공통 클래스가 각 war에 들어가 있을 경우 (최악의 경우 어떤 war에만 들어가 있을 경우) 버그를 양산하는 문제가 발생된다. 


WAR 개념과 클래스 로딩의 우선순위

근원적으로 컴포넌트 컴포넌트 내부의 정보를 감추고 인터페이스 만으로 외부와 통신한다. WAR는 이러한 컴포넌트 개념을 지원하고 있으며 따라서 동일한 클래스가 WAR 외부와 내부에 존재할 때WAR는 내부의 클래스를 우선적으로 사용해야 한다


 

ContainerClassLoader는 WARClassLoader Parent 클래스이다따라서 Java클래스 로더 정책에 의해서는 Container ClassA가 로딩되어야 한다하지만 Servlet Spec2.3에 의해서 WAR Class A 가 로딩된다컴포넌트 개념에서는 외부 클래스가 아닌 내부 클래스 (Class A)가 사용되어야만 내부 로직이 바뀌어도 외부에 영향을 미치지 않으며컴포넌트(WAR)가 어느 컨테이너에 설치되더라도 내부 로직이 일관되게 동작할 것이다.

그러나 이것은 공통 클래스의 관리를 어렵게 할 가능성이 높다다음 예를 보자.

 



OracleConnection은 컴포넌트에 의존적이라기 보다는 외부자원(DBMS)에 의존적인 클래스 이다. JDBC드라이버가 WAR파일 안에 존재 한다면, JDBC 드라이버의 버전을 관리하는데 있어 모든WAR파일을 재배포해야 하는 상황이 발생하게 된다또한 위와 같이 Container의 공통클래스가DB를 사용하기 위해서 OracleConnection을 사용해야 하는 상황이 발생하고 이 클래스의 내용이WAR파일의 클래스와 참조관계가 형성되는 경우에는 VerifyError혹는 ClassCastException등이 발생할 수 있다.

 

따라서 WAR파일에 JDBC드라이버와 같이 외부 의존적인 클래스 혹은 Framework과 같은 공통 클래스를 같이 두는 것은 좋은 정책이 아니다내부 로직만을 위한 클래스이면서 외부요인에 의해서 변경되지 않아도 되는 라이브러리 클래스(ex. Regexp, Parser) WAR파일 내에 두는 것이 좋다.



'업무질...' 카테고리의 다른 글

Exception의 종류와 설명  (0) 2014.07.29
Caucho 프로젝트  (0) 2014.07.29
Enqueue와 Latch  (0) 2014.07.03
웹 접근성(Web accessibility)에 대한 한 마디  (0) 2014.04.03
HTTP 응답헤더  (0) 2014.01.24
Posted by 릴라강림
|

Enqueue와 Latch

업무질... 2014. 7. 3. 14:09

목적: DBMS의 주요 목적 중 하나인 동시 액세스에 대한 관리를 위해 오라클에서 도입한 serialize(직렬화) 방식


1. Enqueue

queue로 관리되며 대상 자원에 대한 Owner, Waiter, Converter Queue를 관리하면서 먼저 요청한 순서대로 Lock을 획득하는 구조이며 Exclusive 모드 뿐 아니라 다양한 수준의 공유를 허용함

내부적으로 Enqueue Resource 배열과 Enqueue Lock 배열에 저장되고 Resource에 대한 Lock이 요청되면 해당 요청은 Owner(LMODE > 0, REQUeSTS = 0), Waiter(LMODE = 0, REQUEST > 0), Converter(LMODE > 0, REQUESTS > 0) 중 한 개에 대응됨.

2. Latch

별도의 queue를 관리하지 않아 먼저 요청한 서비스가 latch를 획득한다는 보장이 없으며 대부분 Exclusive 모드로 동작됨. Enqueue에 비해 훨씬 단순한 구조로서 매우 짧은 시간 내에 획득되고 해제되므로 하위 레벨에서 Lock의 부하를 최소화하며 동작하는 메커니즘임 (Enqueue 역시 내부적으로 Latch로 동작됨)

Latch는 다양한 종류가 있으며 자주 사용되는 Latch는 다음과 같다.


Shared pool
library cache latch, shared pool latch, row cache objects
Buffer Cache
cache buffers chains latch, cache buffers lru latch, cache buffer handle
Redo log
redo allocation latch, redo copy latch, redo writing latch
OPS
dlm resource hash list

* Willing to wait 모드와 No-wait 모드
Willing to wait 모드는 Latch 획득에 실패하면 좀 더 시간을 끌면서 해당 Latch를 획득할 때까지 재시도함 => Latch wait의 심각성을 판단하는 작업이 필요함
No-wait 모드는 실패할 경우 해당 Latch 획득을 포기하는 방식으로 동일한 기능을 하는 Latch가 여러 개 존재하여 그 중 하나만 획득해도 충분한 경우(모든 Latch에 대해 실패하면 Willing to wait 모드가 될 수 있다)이거나 dead lock을 피하기 위한 목적으로 적용됨

* Parent latch와 Child latch
Latch 중에 동일한 기능을 하는 child latch을 set으로 운영되는 종류(cache buffers chains 등등)와 단일한 latch로 운영되는 종류(shared pool latch 등등)가 있으며 이들에 대한 통계는 V$LATCH_CHILDREN, V$LATCH_PARENT에서 조회 가능함

'업무질...' 카테고리의 다른 글

Caucho 프로젝트  (0) 2014.07.29
Java의 ClassLoader 이해  (0) 2014.07.28
웹 접근성(Web accessibility)에 대한 한 마디  (0) 2014.04.03
HTTP 응답헤더  (0) 2014.01.24
Weblogic의 소스 반영 오류 확인  (0) 2014.01.21
Posted by 릴라강림
|

The power of the Web is in its universality, access by everyone regardless of disability is an essential aspect.

Tim Berners - Lee , W3C Director and inventor of the World Wide Web

'업무질...' 카테고리의 다른 글

Java의 ClassLoader 이해  (0) 2014.07.28
Enqueue와 Latch  (0) 2014.07.03
HTTP 응답헤더  (0) 2014.01.24
Weblogic의 소스 반영 오류 확인  (0) 2014.01.21
인코딩에 대한 검토 방법  (0) 2013.12.18
Posted by 릴라강림
|

HTTP 응답헤더

업무질... 2014. 1. 24. 16:56

웹 관련 일을 하면서 헤더 정보 같은건 사실 거의 중요하게 본 적이 없다.

한동안 해야되니까 -_-; 이제 정보를 잘 봐야겠다.

- 설명 정보

http://umz.kr/04Hml


* HTTP 헤더
    아래 헤더 정보는 텍스트만 있는 HTML 문서에 대한 요청/응답 헤더 입니다.
    HTTP Version 1.1을 기준으로 작성된 헤더정보 입니다 
   (클라이언트 환경은 windows xp,net framework 1.1,ie 6.0 입니다)




요청 헤더 -

     GET /test/test.htm HTTP /1.1 
        요청 method 와 요청 파일정보,http 버전.
        HTTP 
프로토콜은 클라이언트가 서버에게 요청하는 방식에 대한 몇 가지 동작을 정의하고 있습니다.
       
요청 method 란 클라이언트가 서버로의 요청하는 방법을 명시합니다
 

GET

지정된 리소스(URI)를 요청

POST

서버가 클라이언트의 폼 입력 필드 데이터의 수락을 요청.
클라이언트는 서버로 HTTP Body  Data 를 전송한다

HAED

문서의 헤더 정보만 요청.
응답데이터(body) 를 받지 않는다

PUT

클라이언트가 전송한 데이터를 지정한 uri 로 대체 한다
ftp 
 put 와 동일.
역시 클라이언트는 서버로 HTTP Body  Data 를 전송한다

DELETE

클라이언트가 지정한 URI 를 서버에서 삭제

TRACE

클라이언트가 요청한 자원에 도달하기 까지의 경로를 기록하는
루프백(loop back) 검사용.
클라이언트가 요청 자원에 도달하기 까지 거쳐가는 프록시나

게이트웨이의 중간 경로부터 최종 수진 서버까지의 경로를 알아낼 때

사용.


 

 Accept : 클라이언트가 허용할 수 있는 파일 형식(MIME TYPE) 
                 */* 은 특정 유형이 아닌 모든 파일형식을 다 지원한다는 말입니다

 User-Agent : 클라이언트 소프트웨어(브라우저,os의 이름과 버전 등.
                        위의 정보에서는 MS IE 6.0, 윈도우 XP, .NET Framework 1.1 버전이
                        
클라이언트에 설치되어 있음을 나타냅니다

 Host : 요청을 한 서버의 Host 입니다          

 If-Modified-Since : 페이지가 수정되었으면 최신 버전 페이지 요청을 위한 필드.
                                  
만일 요청한 파일이 이 필드에 지정된 시간 이후로 변경되지 않았다면,
                                  
서버로부터 데이터를 전송 받지 않습니다.
                                  
이 경우 서버로부터 net modified (304) 상태코드를 전송 받습니다




   위의 헤더 정보는 동일한 파일을 재 요청 했을 때의 응답헤더 입니다
파일을 변경사항이 없으므로 304(수정되지 않음) Content-Length : 0 (데이터

받지 않음응답을 받았습니다이렇게 함으로써 http 는 요청의 부하를 줄이고 있습니다

 Refer : 위의 요청 헤더에는 나와 있지 않지만 이 정보도 헤더에 자주 등장하는
필드 입니다.
특정 페이지에서 링크를 클릭하여 요청을 하였을 경우에 나타나는 필드로써
링크를 제공한 페이지를 나타냅니다
 

 Cookie : 역시 위의 요청에는 없지만 자주 등장하는 필드 입니다ㅏ.
웹 서버가 클라이언트에 쿠키를 저장해 놓았다면 해당 쿠키의
정보를 이름-값 쌍으로 웹 서버에게 전송합니다
 

 Accept-Language : 클라이언트가 인식할 수 있는 언어
           
우선 순위 지정이 가능합니다

 

 Accept-Encoding : 클라이언트가 인식할 수 있는 인코딩(압축방법
               
위의 내용에서는 서버에서 gzip,deflate 로 압축한 리소스를

                                   클라이언트가 해석 할 수 있다는 말이 됩니다

                                   만일 서버에서 압축을 했으면 응답헤더에 Content-Encoding 헤더에

                                   해당 압축 방법이 명시 됩니다


- 응답 헤더 ?



 HTTP /1.1 200 OK : HTTP 버전과 응답 코드 (200 성공)

   
 Server : 웹 서버 정보를 나타냅니다

                   위의 정보에서는 Microsoft IIS 5.1 입니다. 

 Date :  현재 날짜 

 Content-Type : 요청한 파일의 MIME 타입을 나타냅니다

                               Text/html  text  html 파일임을 나타냅니다 

 Last-Modified : 요청한 파일의 최종 수정일을 나타냅니다

 Content-Length : 
헤더 이후 이어지는 데이터의 길이입니다(바이트 단위)
                                  
이어지는 데이터란 요청한 파일의 데이터라 보시면 됩니다
 

 ETag : 캐쉬 업데이트 정보를 위한 임의의 식별 숫자


 

이상 요청과 응답 시 생성되는 HTTP Header 중 자주 등장하는 필드에 대한

설명 이었습니다. HTTP Header 는 위의 명시된 것 이외에도 많이 있습니다.

아래에 링크로 가시면 HTTP 1.1 기준의 Header 의 상세 정보를 보실 수 있습니다. 

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

'업무질...' 카테고리의 다른 글

Enqueue와 Latch  (0) 2014.07.03
웹 접근성(Web accessibility)에 대한 한 마디  (0) 2014.04.03
Weblogic의 소스 반영 오류 확인  (0) 2014.01.21
인코딩에 대한 검토 방법  (0) 2013.12.18
오라클 내장함수  (0) 2013.12.13
Posted by 릴라강림
|

꽤 좋은 확인 방법 (무슨 -_- 성격 테스트 게임 같긴 하지만 ;;)


http://ailov.blog.me/60185838900


블로그를 보면 확인 방법이 있다.

아래는 주요한 확인 방법의 흐름을 정리한 그림




하나 기억할 건 stage 모드와 no-stage 모드에 대한 내용이다. 결국 복사본을 보여주느냐 원본을 보여주느냐인데 stage 모드로 하면 복사해서 복사한 내용을 보여준다고 한다. (원본 보호 -_-? 그게 되는건가?)

'업무질...' 카테고리의 다른 글

웹 접근성(Web accessibility)에 대한 한 마디  (0) 2014.04.03
HTTP 응답헤더  (0) 2014.01.24
인코딩에 대한 검토 방법  (0) 2013.12.18
오라클 내장함수  (0) 2013.12.13
정규식  (0) 2013.12.13
Posted by 릴라강림
|
Work & Study/TechTalk 2010/11/24 11:22 posted by k16wire

인코딩 타입이란 특정 캐릭터셋으로 만들어진 파일을 보여주는 방식입니다. 전세계 주요 언어문자를 하나의 바이너리 코드로 처리하기 위해서 유니코드(unicode)를 만들었지만 이 코드를 보여주는 인코딩 방식은 다양합니다.

많이 사용하는 인코딩 타입으로는 UTF-8, UTF-16, EUC-KR, ISO8859-1, MS949등이 있는데요, 텍스트 파일이 어떤 인코딩 타입으로 설정되어 있느냐에 따라 똑같은 유니코드 데이터도 제대로 보이기도 안보이기도 합니다. 그럼 이 파일이 어떤 인코딩타입으로 되어 있는지 알아내려면 어떻게 해야 할까요?

BOM이라는게 있습니다. BOM(Byte Order Mask)은 파일이 어떤 인코딩 타입임을 나타냅니다만 어떤 에디터는 이 BOM을 생략하기도 하기때문에 절대적이라고 볼 수는 없습니다. 

그럼 자바로 쉽게 인코딩 타입을 확인할 수는 없을까? ICU를 이용하면 가능합니다.
ICU(International Component for Unicode)는 이와 관련된 라이브러리를 제공합니다. C와 Java를 지원하며 제가 확인한 것은 자바용인 ICU4J입니다. 

1.Maven의 POM에 관련 설정을 추가합니다.
      <dependency>
          <groupId>com.ibm.icu</groupId>
          <artifactId>icu4j</artifactId>
          <version>4.0.1</version>
          <type>jar</type>
          <scope>compile</scope>
      </dependency>
2.유틸리티 함수를 하나 추가합니다. 저의 경우에는 FileUtil이라는 유틸클래스에 추가했습니다.
    public static String readFileToString(File file) throws Exception {
        try {
            CharsetDetector detector = new CharsetDetector();            
            detector.setText(FileUtils.readFileToByteArray(file));
            return FileUtils.readFileToString(file, detector.detect().getName());            
        } catch (IOException e) {
            throw new Exception(e);
        }
    }
테스트해 보니 EUC-KR, UTF8인 경우에는 잘 동작합니다. 많이들 필요할것 같은데 의외로 자료가 없어서 찾는데 애를 좀 먹어서 정리해놓습니다.


'업무질...' 카테고리의 다른 글

HTTP 응답헤더  (0) 2014.01.24
Weblogic의 소스 반영 오류 확인  (0) 2014.01.21
오라클 내장함수  (0) 2013.12.13
정규식  (0) 2013.12.13
MPEG 표준  (0) 2013.12.08
Posted by 릴라강림
|

오라클 내장함수

업무질... 2013. 12. 13. 16:45

자기참조형 hierarchy 테이블에 입력하기 위해서 sys_connect_by_path 이외에 아래 함수를 사용해야 함


- regexp_substr(source, pattern [, position [, occurrence [, match_param [subxpr]]]])

- regexp_count(source, pattern [, position [, match_pattern]])


오늘 찾아 놓은 정규식과 결합해서... 말하자면 구분자로 연결된 것에서 상위를 찾아야 한다.


regexp_count가... 11g에서 적용된 것이라고 한다. (슬프네 ㅠㅠ)

결국 함수를 만들어 쓰던지 해야할 것 같은 느낌

'업무질...' 카테고리의 다른 글

Weblogic의 소스 반영 오류 확인  (0) 2014.01.21
인코딩에 대한 검토 방법  (0) 2013.12.18
정규식  (0) 2013.12.13
MPEG 표준  (0) 2013.12.08
BEP와 CVP  (0) 2013.12.07
Posted by 릴라강림
|