'All Contents'에 해당되는 글 59건

  1. 2010.04.07 Oracle Table Rock 걸린 세션 찾아서 죽이기
  2. 2010.01.11 Quartz의 CronTrigger를 이용한 스케줄링
  3. 2009.10.05 MySql 날짜 함수
Dev Note/DB2010. 4. 7. 15:57
테이블 사용 중 'ORA-00054: 자원이 사용중이고, NOWAIT가 지정되어 있습니다.'
의 오류 메세지가 있는 경우.. 대부분이 테이블 락으로 인한 것이다.
테이블 락이 걸린 세션을 찾아서 죽이는 방법은 아래와 같다.

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='테이블 이름'

결과는 해당 테이블에 락이 걸려있는 세션에 대한 정보 조회가 가능하다.
SID SERIAL#
--- -------
25     12345 

alter system kill session '25, 12345';
로 해당 세션을 죽이면 된다.
Posted by as.wind.914
Dev Note/Java2010. 1. 11. 15:21

유닉스 또는 리눅스를 사용해 본 사용자라면 cron을 잘 알고 있을 것이다.
cron에 실행할 명령문과 주기를 등록해 놓으면 해당 주기마다 등록해 놓은 명령문을 자동으로 실행해주는 데몬이다.

자바에서 비슷한 기능을 제공하는 Timer가 존재하지만 좀더 세부적인 스케줄링 기능이 필요할 때 Quartz를 사용하면 cron과 같이 쉽게 구현이 가능하다.

먼저 아래의 사이트에서 필요한 라이브러리들을 다운 받는다.
Quartz 배포 사이트 : http://www.quartz-scheduler.org/
Apache Commons Collections : http://commons.apache.org/collections/
Apache Commons Logging : http://commons.apache.org/logging/
Apache Log4j : http://logging.apache.org/log4j/1.2/index.html

예제로 할 프로그램은 두개의 Job이 있으면 각각 다른 주기로 스케줄링하여 실행하게 된다.
첫번째 Job은 일반적으로 실행되는 Job이며, 두번째 Job은 실행 된 후 70초 후 종료되는 Job이다.

Job으로 사용할 클래스는 반드시 org.quartz.Job 인터페이스를 구현해야 한다.

[ Job Sample Code ]
package ukzzang.sample.quartz;

import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SampleJob implements Job {
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        StringBuilder trace = new StringBuilder();
            trace.append("SampleJob is execute :: ").append(new Date());
            System.out.println(trace.toString());
    }
}

package ukzzang.sample.quartz;

import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class DelaySampleJob implements Job {
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        StringBuilder trace = new StringBuilder();
        trace.append("DelaySampleJob is execute :: ").append(new Date());

        System.out.println(trace.toString());

        try {
            Thread.sleep(70000);
        } catch (Exception e) { }

        trace = new StringBuilder();
        trace.append("DelaySampleJob is execute end :: ").append(new Date());

        System.out.println(trace.toString());
    }
}

아래는 위의 두개의 job을 스케줄러에 등록해 주는 소스이다.
스케줄러를 생성하고, SampleJob을 매분 0초에 실행하며, DelaySampleJob은 매분 20초에 실행하게 된다.

[ Scheduler Sample Code ]
package ukzzang.sample.quartz;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

public class SampleCronTrigger {
    private SchedulerFactory schedulerFactory = null;
    private Scheduler scheduler = null;

    public SampleCronTrigger() {
        try {
            schedulerFactory = new StdSchedulerFactory();
            scheduler = schedulerFactory.getScheduler();
          } catch (Exception e) {
               e.printStackTrace();
        }
    }

    public void start() {
        try {
            JobDetail job1 = new JobDetail("job1", "group1", SampleJob.class);
            CronTrigger trigger1 = new CronTrigger("trigger1", "group1", "0 * * * * ?");   
            scheduler.scheduleJob(job1, trigger1);
   
            JobDetail job2 = new JobDetail("job2", "group2", DelaySampleJob.class);
            CronTrigger trigger2 = new CronTrigger("trigger2", "group2", "20 * * * * ?");   
            scheduler.scheduleJob(job2, trigger2);
   
            scheduler.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SampleCronTrigger trigger = new SampleCronTrigger();
        trigger.start();
    }
}

위의 예제 코드를 실행하게 되면 아래와 같은 결과가 나오게 된다.

[ Execute Result ]
SampleJob is execute :: Mon Jan 11 10:24:00 KST 2010
DelaySampleJob is execute :: Mon Jan 11 10:24:20 KST 2010
SampleJob is execute :: Mon Jan 11 10:25:00 KST 2010
DelaySampleJob is execute :: Mon Jan 11 10:25:20 KST 2010
DelaySampleJob is execute end :: Mon Jan 11 10:25:30 KST 2010
SampleJob is execute :: Mon Jan 11 10:26:00 KST 2010
DelaySampleJob is execute :: Mon Jan 11 10:26:20 KST 2010
DelaySampleJob is execute end :: Mon Jan 11 10:26:30 KST 2010

참고로 아래 표는 CronTrigger에 작업주기를 설정하는 식을 예로 보여준다.

설정식

설정 의미

"0 0 12 * * ?"

매일 12(정오)에실행

"0 15 10 ? * *"

매일 오전 1015분에 실행

"0 15 10 * * ?"

매일 오전 1015분에 실행

"0 15 10 * * ? *"

매일 오전 1015분에 실행

"0 15 10 * * ? 2005"

2005년의 매일 오전 1015분에 실행

"0 * 14 * * ?"

매일 오후 2시부터 오후 259분까지 매분마다 실행

"0 0/5 14 * * ?"

매일 오후 2시부터 오후 255분까지 매5분마다 실행

"0 0/5 14,18 * * ?"

매일 오후 2시부터 오후 255분까지 매5분마다 실행 그리고

매일 오후 6시부터 오후 655분까지 매5분마다 실행

"0 0-5 14 * * ?"

매일 오후 2시부터 오후 205분까지 매분마다 실행

"0 10,44 14 ? 3 WED"

3월의 매주 수요일 오후 210분과 오후 244분에 실행

"0 15 10 ? * MON-FRI"

매주 월, , , , 금요일 오전 1015분에 실행

"0 15 10 15 * ?"

매월 15일 오전 1015분에 실행

"0 15 10 L * ?"

매월 마지막날 오전 1015분에 실행

"0 15 10 ? * 6L"

매월 마지막 금요일 오전 1015분에 실행

"0 15 10 ? * 6L 2002-2005"

2002년부터 2005년까지의 매월 마지막 금요일 오전 1015분에 실행

"0 15 10 ? * 6#3"

매월 세번째 금요일 오전 1015분에 실행


Posted by as.wind.914
Dev Note/DB2009. 10. 5. 20:02
MySql에서 지원하는 날짜(Date) 관련 함수를 알아보자 ...
Data 값을 기대하는 함수들은 일반적으로 DATETIME 값을 수용하고, TIME 부분은 무시한다. TIME 값을 기대하는 함수들은 일반적으로 DATETIME 값을 수용하고, DATE 부분은 무시한다.

* ADDDATE(date, INTERVAL expr type), ADDDATE(expr, days)
ADDDATE()는 두번째 인자에서 INTERVAL과 함께 사용되면 DATE_ADD()의 별칭이 된다. 마찬가지로 SUBDATE()는 DATE_SUB()의 별칭이 된다.INTERVAL 인자에 관해서는 DATE_ADD() 설명을 참조.
    mysql> SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY);
            -> '1998-02-02'
    mysql> SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY);
            -> '1998-02-02'
MySQL 4.1.1 버전부터 두번째 문법이 허용되었다. expr 가 DATE 또는 DATETIME 형식일 때, daysexpr 에 추가되는 일수이다.
    mysql> SELECT ADDDATE('1998-01-02', 31);
            -> '1998-02-02'
Posted by as.wind.914