//VO 객체의 독립성을 유지 하기 위해 변경 처리. 

//사용법은 주석 확인. 



package module.common.otherinterface ;


import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;


import com.base.SystemException;

import com.component.parameter.IParameterManagement;

import com.framework.core.Workspace;


/**

 * 각 프로세스(메소드 단위) 시간 1/10000 단위로 점검 프로그램 

 * procTSOBegin -> procTSOWork procTSOWork procTSOWork(프로세스 숫자 만큼) -> procTSOEnd

 * 

 * 1. 로직 instance 호출

 *  ProcessTimeSysOut procTSO = new ProcessTimeSysOut();

 * 

 * 2. 최초 호출

 *  procTSO.procTSOBegin("국내출장);

 * 

 * 3. 각 프로세스 단위로 각 각 사이에 계속 추가. 

 *    procTSO.procTSOWork("신규:신청번호 채번 or 기 신청서 변경 체크");

 *    .

 *    .

 *    procTSO.procTSOWork("출장신청기본/출장예산정보");

 *    .

 *    .

 *    procTSO.procTSOWork("출장자 및 여비정보");

 *    

 * 4. 로직 instance 종료

 *    procTSO.procTSOEnd();

 * 

 * 싱글톤 패턴 구현

 * @since 1.0

 */

public class ProcessTimeSysOut extends Workspace {

PTSOVO ptsovo;

//private static ProcessTimeSysOut procTSO;

/* 복수의 프로그램에서 사용 가능 함에 따라 싱글톤 패턴 사용시 프로세스 누적 시간등이 혼합될 가능성이 있어

 *  싱글톤 패턴 해제함.

 * 

 * private ProcessTimeSysOut(){}

public static ProcessTimeSysOut getInstance(){

if(procTSO==null){

procTSO = new ProcessTimeSysOut();

procTSO.proCnt = 0;

procTSO.fullTime = 0;

procTSO.beforTime = 0;

}

return procTSO;

}

*/

//프로세스 최초시작 및 타이틀 설정

public void procTSOBegin(String processNameParam){

long time = System.currentTimeMillis(); 

this.ptsovo = new PTSOVO();

this.ptsovo.setProcTSOKEY(time);

System.out.println("============================"+processNameParam+" 프로세스 검토 로직 시작 ============================\n");

System.out.println("process key number : "+this.ptsovo.getProcTSOKEY());

this.ptsovo.setBeforTime(time);

this.ptsovo.setProcTitle(processNameParam);

SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");

System.out.println("시작 시간 : "+dayTime.format(new Date(time))+"\n");

}

//프로세스 내의 작업 구분 요청(out 처리)

public void procTSOWork(String workName){

if(this.ptsovo!=null){

long nowtTime  = System.currentTimeMillis(); 

long processTime  = nowtTime - this.ptsovo.getBeforTime();

this.ptsovo.setFullTime(this.ptsovo.getFullTime()+processTime); 

this.ptsovo.setProCnt(this.ptsovo.getProCnt()+1);

//하단 sysout도출시 내용의 길이는 변경 하지 않도록 처리(30글자).

System.out.println(String.format("%03d",this.ptsovo.getProCnt())+"("+this.ptsovo.getProcTSOKEY()+")||"+this.ptsovo.getProcTitle()+" ==> "+String.format("%-30s",workName)+"======>"+processTime+" / "+this.ptsovo.getFullTime()+"\n");

this.ptsovo.setBeforTime(nowtTime);

}

}

//프로세스 검토 종료 로직

public void procTSOEnd(){

if(this.ptsovo!=null){

System.out.println("process key number : "+ptsovo.getProcTSOKEY());

long time = System.currentTimeMillis(); 

//최초 시작시 프로세스 시작 시간을 넣도록 함.

SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");

System.out.println("종료 시간 : "+dayTime.format(new Date(time)));

System.out.println("총 누적 시간: " +this.ptsovo.getFullTime());

System.out.println("검토 프로세스 숫자: "+this.ptsovo.getProCnt()+"\n");

System.out.println("============================"+this.ptsovo.getProcTitle()+" 프로세스 검토 로직 종료 ============================\n");

System.out.println();

}

}


}




package module.common.otherinterface;


import java.math.BigDecimal;

import java.util.ArrayList;


import module.mis.trans.TransItem;

import module.mis.trans.TransVat;




public class PTSOVO {// 프로세스 분석 구조 객체

private int  proCnt = 0;  //프로세스 순번 

private long fullTime =0; //총 누적 소요 시간 

private long beforTime=0; //프로세스 시작 시간

private long procTSOKEY =0 ; //프로세스 생성시 주요키 값 (차후 조회시 대상 키값을 기준으로 조회 할수 있도록 처리.

private String procTitle ;  //프로세스 타이틀

public int getProCnt() {

return proCnt;

}

public void setProCnt(int proCnt) {

this.proCnt = proCnt;

}

public long getFullTime() {

return fullTime;

}

public void setFullTime(long fullTime) {

this.fullTime = fullTime;

}

public long getBeforTime() {

return beforTime;

}

public void setBeforTime(long beforTime) {

this.beforTime = beforTime;

}

public long getProcTSOKEY() {

return procTSOKEY;

}

public void setProcTSOKEY(long procTSOKEY) {

this.procTSOKEY = procTSOKEY;

}

public String getProcTitle() {

return procTitle;

}

public void setProcTitle(String procTitle) {

this.procTitle = procTitle;

}

}















//선언 및 만들어둬야 할것 소스 . 


//class 전역 변수 


int  proCnt = 0;  //프로세스 순번 

long fullTime =0; //총 누적 소요 시간 

long beforTime=0; //프로세스 시작 시간


//class 내 추가메소드 / 별도의 class 로 만들어 외부 접근 해도 무방


public void proTimeSysOut(String processNameParam,String type){

//시작 처리 type : S

if("S".equals(type)){

System.out.println("============================"+processNameParam+" 프로세스 검토 로직 시작 ============================\n");

long time = System.currentTimeMillis(); 

//최초 시작시 프로세스 시작 시간을 넣도록 함.

beforTime = time; 

SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");

System.out.println("시작 시간 : "+dayTime.format(new Date(time))+"\n");

//종료 처리 type : E 

}else if("E".equals(type)){

System.out.println("============================"+processNameParam+" 프로세스 검토 로직 종료 ============================\n");

long time = System.currentTimeMillis(); 

//최초 시작시 프로세스 시작 시간을 넣도록 함.

SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");

System.out.println("종료 시간 : "+dayTime.format(new Date(time))+"\n");

System.out.println("총 누적 시간: " +fullTime+"\n");

System.out.println("검토 프로세스 숫자: "+proCnt);

//종료시 전역 변수 long ,cnt 값을 초기화 한다. 

proCnt = 0;  //프로세스 순번 

fullTime =0; //총 누적 소요 시간 

beforTime=0; //프로세스 시작 시간

//각 프로세스 검토 type : P

}else if("P".equals(type)) {

if(beforTime==0){

System.out.println("프로세스 검토 로직 시작 이 누락 되었습니다.");

}else {

long nowtTime  = System.currentTimeMillis(); 

long processTime  = nowtTime - beforTime;

fullTime += processTime;

//하단 sysout도출시 내용의 길이는 변경 하지 않도록 처리(30글자).

System.out.println(String.format("%03d",++proCnt)+"||"+String.format("%-30s",processNameParam)+"======>"+processTime+" / "+fullTime+"\n");

beforTime = nowtTime;

}

}

}



// 사용법!!!


//성능 검증내 에서 해당 메소드를 호출 . 

//최초

  proTimeSysOut("국내출장","S");


// 각프로세스 마다 첫번째 파라미터에 프로세스 명을 입력  2번째 파라미터는 무조건 "P"

proTimeSysOut("신규:신청번호 채번 or 기 신청서 변경 체크","P");


//종료 

   proTimeSysOut("국내출장","E");




// sysout log 확인시. 아래와 같이 나오면 정상. 



[16. 9. 23   13:20:31:458 KST] 00000272 SystemOut     O ======================================

[16. 9. 23   13:20:31:458 KST] 00000272 SystemOut     O [ module.mis.hrm.main.Hrm_4071]

[16. 9. 23   13:20:31:458 KST] 00000272 SystemOut     O [2016.09.23 13:20:31(458)]

[16. 9. 23   13:20:31:458 KST] 00000272 ExtendAction  I module.common.action.ExtendAction execute 트랜잭션 시작.....

[16. 9. 23   13:20:31:459 KST] 00000272 SystemOut     O [ tmSetTrpRqst ] Transaction Start

[16. 9. 23   13:20:31:459 KST] 00000272 SystemOut     O ============================국내출장 프로세스 검토 로직 시작 ============================


[16. 9. 23   13:20:31:459 KST] 00000272 SystemOut     O 시작 시간 : 2016-20-23 01:20:31


[16. 9. 23   13:20:31:500 KST] 00000272 SystemOut     O 001||신규:신청번호 채번 or 기 신청서 변경 체크     ======>41 / 41


[16. 9. 23   13:20:31:781 KST] 00000272 SystemOut     O 002||출장신청기본/출장예산정보                 ======>281 / 322


[16. 9. 23   13:20:31:964 KST] 00000272 SystemOut     O 003||출장자 및 여비정보                    ======>183 / 505


[16. 9. 23   13:20:32:006 KST] 00000272 SystemOut     O 004||출장지 및 경유지                     ======>41 / 546


[16. 9. 23   13:20:32:055 KST] 00000272 SystemOut     O 005||출장내용                          ======>50 / 596


[16. 9. 23   13:20:32:055 KST] 00000272 SystemOut     O 006||첨부파일 저장                       ======>0 / 596






'JAVA' 카테고리의 다른 글

펌) immutable 이란  (0) 2013.10.15
grid I U D 포멧 JAVA 셋팅 [티폼 기준]  (0) 2013.06.27
디폴트 생성자에 대하여 알아 봅시닥.  (0) 2012.07.10
Swing - windowBuilder 설치 하기.  (0) 2012.06.13
패키지 컴파일러  (0) 2012.05.15
Posted by 사라링

오라클 락 & 킬 lock kill

2016. 8. 12. 14:28

프로젝트에서 LOCK 이 자주 걸리는 문제가 발생하여 연구하던 중에 아래의 sql 문을 이용하여 lock 세션을 찾아서 관리할 수 있다는 것을 알았다. 그러나 이 SQL 은 System 유저만이 사용할 수 있다는  제약이 있다. 

LOCK 이 발생하게 되면 프로그램이 동작하다가 멈추고 기다리게 된다. 원인을 파악하는데 시간이 허비하게 되는데 알고 보니 테이블에 LOCK이 걸린 것이었다면 허탈함을 금할 수 없다.  자주 LOCK 이 걸리는 테이블이라면 SELECT 할 때 WAIT 타임을 1 정도로 주면 1초동안 LOCK 이 풀리기를 대기하다가 오류 처리되므로 개발자가 쉽게 LOCK 걸린 상황을 인지할 수 있다. 

-- 락걸린 테이블 확인 
SELECT  DO.OBJECT_NAME, DO.OWNER, DO.OBJECT_TYPE, DO.OWNER,
        VO.XIDUSN, VO.SESSION_ID, VO.LOCKED_MODE
FROM    V$LOCKED_OBJECT VO, DBA_OBJECTS DO
WHERE   VO.OBJECT_ID = DO.OBJECT_ID;

-- 해당 테이블에 LOCK 이 걸렸는지.
SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME
FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C
WHERE A.SID = B.SID AND B.ID1 = C.OBJECT_ID
AND B.TYPE='TM' AND C.OBJECT_NAME IN ('TB_CO_GENO');

-- 락발생 사용자와 SQL, OBJECT 조회
SELECT DISTINCT X.SESSION_ID, A.SERIAL#, D.OBJECT_NAME, A.MACHINE, A.TERMINAL,
                A.PROGRAM, B.ADDRESS, B.PIECE, B.SQL_TEXT
FROM V$LOCKED_OBJECT X, V$SESSION A, V$SQLTEXT B, DBA_OBJECTS D
WHERE X.SESSION_ID = A.SID AND 
X.OBJECT_ID = D.OBJECT_ID AND A.SQL_ADDRESS = B.ADDRESS 
ORDER BY B.ADDRESS, B.PIECE;

-- 현재 접속자의 SQL 분석
SELECT DISTINCT A.SID, A.SERIAL#,
       A.MACHINE, A.TERMINAL, A.PROGRAM,
       B.ADDRESS, B.PIECE, B.SQL_TEXT
FROM  V$SESSION A, V$SQLTEXT B
WHERE A.SQL_ADDRESS = B.ADDRESS
ORDER BY A.SID, A.SERIAL#, B.ADDRESS, B.PIECE


-- 락 세션 죽이기
  SELECT A.SID,   A.SERIAL#
  FROM V$SESSION A,  V$LOCK B,
       DBA_OBJECTS C
 WHERE A.SID = B.SID
   AND B.ID1 = C.OBJECT_ID
   AND B.TYPE = 'TM'
   AND C.OBJECT_NAME = 'TB_CO_GENO'
   
SID SERIAL#
--- -------
5   1
6   1

2. 다음 명령으로 SESSION들을 KILL한다.  ALTER SYSTEM KILL SESSION 'SESSION_ID, SERIAL#';
SQL> alter system kill session '5, 1';
SQL> alter system kill session '6, 1';


-- 락 세션 죽이는 sql 문 
SELECT DISTINCT X.SESSION_ID, A.SERIAL#, D.OBJECT_NAME, A.MACHINE, A.TERMINAL,
       A.PROGRAM, A.LOGON_TIME, 'ALTER SYSTEM KILL SESSION'''||A.SID||', '||A.SERIAL#||''';'
FROM GV$LOCKED_OBJECT X, GV$SESSION A, DBA_OBJECTS D
WHERE  X.SESSION_ID = A.SID AND X.OBJECT_ID = D.OBJECT_ID
ORDER BY LOGON_TIME;

Posted by 사라링

/* 테이블 컬럼 찾기 */
/* [sqlmap/mapper/com/cmm/sql-comcmm525.xml] selectTableList */SELECT   A.TABLE_NAME        ,B.COMMENTSFROM     ALL_TABLES A        ,ALL_TAB_COMMENTS BWHERE    A.TABLE_NAME = B.TABLE_NAMEAND      A.OWNER = B.OWNERAND      B.OWNER = 'USRFRMOWN'AND      ( A.TABLE_NAME NOT LIKE 'TEST%' AND A.TABLE_NAME NOT LIKE '%TEST' )AND      ( A.TABLE_NAME NOT LIKE 'TEMP%' AND A.TABLE_NAME NOT LIKE '%TEMP' )AND      A.TABLE_NAME LIKE '%%'AND      B.COMMENTS LIKE '%%'ORDER BY TABLE_NAME
/* [sqlmap/mapper/com/cmm/sql-comcmm525.xml] selectColumnList */SELECT   A.TABLE_NAME        ,(SELECT COMMENTS FROM ALL_TAB_COMMENTS WHERE TABLE_NAME = A.TABLE_NAME AND OWNER='USRFRMOWN') AS TABLE_COMMENTS        ,A.COLUMN_NAME        ,B.COMMENTS        ,CASE WHEN C.COLUMN_NAME IS NOT NULL THEN 'PK' END AS PK_YN        ,A.DATA_TYPE        ,A.DATA_LENGTH        ,A.DATA_PRECISION        ,A.DATA_SCALE        ,A.NULLABLE        ,A.COLUMN_IDFROM     ALL_TAB_COLUMNS A        ,ALL_COL_COMMENTS B        ,(    SELECT B.TABLE_NAME                    ,B.COLUMN_NAME              FROM   ALL_CONSTRAINTS A                    ,ALL_CONS_COLUMNS B              WHERE  A.OWNER = B.OWNER              AND    A.TABLE_NAME = B.TABLE_NAME              AND    A.CONSTRAINT_NAME = B.CONSTRAINT_NAME              AND    A.CONSTRAINT_TYPE ='P'              AND    A.OWNER = 'USRFRMOWN' ) CWHERE    A.OWNER = 'USRFRMOWN'AND      A.OWNER = B.OWNERAND      A.TABLE_NAME = B.TABLE_NAME(+)AND      A.COLUMN_NAME = B.COLUMN_NAME(+)AND      A.TABLE_NAME = C.TABLE_NAME(+)AND      A.COLUMN_NAME = C.COLUMN_NAME(+)AND      A.TABLE_NAME LIKE '%%'—AND      A.COLUMN_NAME LIKE '%LINK_RPRJ_NO%'—AND      A.COLUMN_NAME IN ('RSCHFND_APLY_NO','PROOF_SEQ')AND      B.COMMENTS LIKE '%매입%번호%'ORDER BY A.TABLE_NAME

Posted by 사라링

BLOG main image
.. by 사라링

카테고리

사라링님의 노트 (301)
JSP (31)
J-Query (41)
JAVA (24)
VM-WARE (0)
디자인패턴 (1)
스크랩 (0)
스트러츠 (3)
안드로이드 (11)
오라클 (45)
우분투-오라클 (1)
이클립스메뉴얼 (6)
스프링3.0 (23)
자바스크립트 (10)
HTML5.0 (17)
정보처리기사 (1)
기타(컴퓨터 관련) (1)
문제점 해결 (3)
프로젝트 (2)
AJAX (4)
하이버네이트 (3)
트러스트폼 (11)
Jeus (2)
재무관리(회계) (5)
정규식 (5)
아이바티스 (8)
취미 (2)
소프트웨어 보안 관련모음 (0)
정보보안기사 (6)
C언어 베이직 및 프로그램 (3)
보안 관련 용어 정리 (2)
넥사크로 (6)
Total :
Today : Yesterday :