달력

5

« 2024/5 »

  • 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
  • 31
2012. 10. 9. 14:45

tomcat catalina.out 처리 Enjoy/etc2012. 10. 9. 14:45

오래되면 catalina.out  로그파일 대용량이 된다~!

catalina.out 로그파일 쌓이는걸 막아야겠다~!

tomcat 로그는 catalina.out  대신 catalina.YYYY-MM-DD.log 파일을 보면 될듯...


수정하기

$TOMCAT_HOME/bin/catalina.sh


  touch "$CATALINA_OUT"

  if [ "$1" = "-security" ] ; then

    if [ $have_tty -eq 1 ]; then

      echo "Using Security Manager"

    fi

    shift

    "$_RUNJAVA" "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \

      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \

      -Djava.security.manager \

      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \

      -Dcatalina.base="$CATALINA_BASE" \

      -Dcatalina.home="$CATALINA_HOME" \

      -Djava.io.tmpdir="$CATALINA_TMPDIR" \

      org.apache.catalina.startup.Bootstrap "$@" start \

      #>> "$CATALINA_OUT" 2>&1 & 주석처리

      >> /dev/null 2>&1 & 라인추가

  else

    "$_RUNJAVA" "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \

      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \

      -Dcatalina.base="$CATALINA_BASE" \

      -Dcatalina.home="$CATALINA_HOME" \

      -Djava.io.tmpdir="$CATALINA_TMPDIR" \

      org.apache.catalina.startup.Bootstrap "$@" start \

      #>> "$CATALINA_OUT" 2>&1 & 주석처리

      >> /dev/null 2>&1 & 라인추가

  fi



위와 같이 처리 하면 catalina.out  파일 사이즈가 늘어나지 않는다~! 



그외 방법들


펌 : http://tenny.egloos.com/1226439


우선, 톰켓 로그 설정법은

이런 곳 http://tomcat.apache.org/tomcat-5.5-doc/logging.html

그리고 또 이런 곳에 잘 나와있다. http://minaret.biz/tips/tomcatLogging.html

하지만, 이런 곳에는 http://tomcat.apache.org/faq/logging.html

톰켓은 기본적으로 catalina.out 파일을 rotate하지 않는다고 한다.
톰켓 입장에서는 당신이 로깅패키지를 쓰면 되기 때문에 문제가 없다고 하는데,,, 글쎄다...
어떻게든 로그가 계속 쌓이는 것은 막아야하지 않겠는가... ( 정말 쉬운 방법이 있으면 가르침을 주시면 참 고마울 것 같다)

System.out and System.err both print to catalina.out. But you can suppress this via the swallowOutput property and sent to different log files. 
catalina.out does not rotate. But it should not be an issue because nothing should be printing to standard output since you are using a logging package, right? a thread about rotation of catalina.out



방법1. cronolog 로테이트 로깅 프로그램 사용

http://marc.info/?l=tomcat-user&m=105645816302666&w=2 

방법2. log4j 사용

http://minaret.biz/tips/tomcatLogging.html


첫 번째 방법은 패키지 설치가 귀찮아서 안해봤고, 두 번째 방법을 해보니, 로깅은 되는데, catalina.out은 계속 쌓이는 듯 하다. 뭔가 설정을 잘못한 것일 수도 있지만, 분석을 해봐도 뜻대로 catalina.out에 로깅이 중단되지는 않았다.

해보지는 않았지만, pipe 처리를 해서 rotate를 완전 다른 프로세스에게 넘기는 첫번째 방법이 더 쉬워보이기는 한다. 하지만 이 역시, 톰켓을 kill할 때, 가끔 cronolog가 혼자 살아있다는 bug report 가 있기는 하다.


이제 귀찮고 해서, shell script를 만들고 crontab에 넣어 버렸더니, 잘되기는 한다.

rotateTomcatLog.sh

#!/bin/sh

LOG_DIR=/tomcat/log/dir
DATE=`/bin/date +%Y-%m-%d`

/bin/nice /bin/cp  $LOG_DIR/catalina.out $LOG_DIR/catalina.$DATE.out
/bin/nice /bin/cat /dev/null > $LOG_DIR/catalina.out
rm -Rf $LOG_DIR/*.log


#
# delete out-of-date catalina.log
#

DELETE_DATE=`/bin/date +%Y-%m-%d --date '20 day ago'`
#DELETE_DATE`/bin/date +Y-%m-%d --date '1 month ago'`

echo "$LOG_DIR/catalina.$DELETE_DATE.out"

for file in $LOG_DIR/*
do
        if [[ "$file" < "$LOG_DIR/catalina.$DELETE_DATE.out" ]]
        then
                rm -f $file
        fi
done

# end of file

위 스크립트는 cataline.out 하루에 한 번씩 rotate하고, backup 파일은 20일 동안 보관한다.
뭐 취향에 맞게 바꿔써도 무방할 것 같지만, 괜하게 log를 copy하는 부하가 맘에 걸린다.

/etc/logrotate.d/ 밑의 설정처럼 rotate도 하면서 backup 파일 보관 기간까지 설정하면서,
날짜와 크기 제한까지 같이 두는 설정이 있으면 좋겠다. 
(log4j는 날짜로 로테이트하면서, 크기 제한까지 두지는 못하는 것 같다.)




:
Posted by 라면스프
2012. 7. 24. 09:40

synchronized : 동기화(Lock) Enjoy/JAVA2012. 7. 24. 09:40

출처 : http://blog.naver.com/sang_it/156495940


package com.thread;
/*
 * 동기화 : 쓰레드 Lock걸기,Synchronized를 걸면 동시 접속이 안된다 
하나의 자원(데이터)에 대해서 여러 스레드가 사용하려고 할때 
한 시점에서 하나의 스레드만 사용할 수 있도록 하는 것이다.
synchronized 식별자는 보통 메소드의 선언부에 쓰고 
이 키워드가 붙은 메소드는 한번에 하나의 스레드만 접근이 가능하며
메소드가 사용중일 때 다른 스레드가 메소드를 호출하면 앞의 스레드가 종료될때까지 기다려야 한다.
*/
class ATM implements Runnable{
 private long depositeMoney = 10000;


 @Override
 public void run() {
  synchronized (this) {
   for(int i=0; i<10 ; i++){
    try{
     Thread.sleep(100);
    }catch (Exception e) {
     e.printStackTrace();
    }
    //현재 디파짓을 반환
    if(getDepositMoney() <=0)
     break;
    whithDraw(100);
   }
  }  
 }


 private void whithDraw(int i) {
  if(0< depositeMoney)
   depositeMoney -= i;
  System.out.println(Thread.currentThread().getName()+ ","+depositeMoney);
 }


 private long getDepositMoney() {
  return depositeMoney;
 }

}

public class SynchronizedTest {
 public static void main(String[] args) { 
  ATM atm = new ATM();
  Thread t1 = new Thread(atm,"First");
  t1.start();
  
  Thread t2 = new Thread(atm,"Second");
  t2.start(); 


 }

}
==========결과 ====================

First,9900
First,9800
First,9700
First,9600
First,9500
First,9400
First,9300
First,9200
First,9100
First,9000
Second,8900
Second,8800
Second,8700
Second,8600
Second,8500
Second,8400
Second,8300
Second,8200
Second,8100
Second,8000

 

 

 

 

****첫번째로 들어온 쓰레드가 끝나면 다음 쓰레드 실행

:
Posted by 라면스프
2012. 7. 24. 09:34

[Java] replaceAll 로 공백 제거하기 Enjoy/JAVA2012. 7. 24. 09:34

출처 : http://vicki.tistory.com/583


정규식에서 공백은 정확하게 공백으로 인식을 못하는 것 같았습니다.
Pattern JavaDoc 에서 내용을 확인하였습니다.
http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

POSIX character classes (US-ASCII only)
\p{Lower}A lower-case alphabetic character: [a-z]
\p{Upper}An upper-case alphabetic character:[A-Z]
\p{ASCII}All ASCII:[\x00-\x7F]
\p{Alpha}An alphabetic character:[\p{Lower}\p{Upper}]
\p{Digit}A decimal digit: [0-9]
\p{Alnum}An alphanumeric character:[\p{Alpha}\p{Digit}]
\p{Punct}Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph}A visible character: [\p{Alnum}\p{Punct}]
\p{Print}A printable character: [\p{Graph}\x20]
\p{Blank}A space or a tab: [ \t]
\p{Cntrl}A control character: [\x00-\x1F\x7F]
\p{XDigit}A hexadecimal digit: [0-9a-fA-F]
\p{Space}A whitespace character: [ \t\n\x0B\f\r]


그래서 아래와 같이 수정하였습니다.
  1. String str = "Vicki Yi";   
  2.   
  3. System.out.println(str + " : " + str.replaceAll("\\p{Space}"""));  
1.String str = "Vicki Yi";
2. 
3.System.out.println(str + " : " + str.replaceAll("\\p{Space}"""));


결과는~~~ 원하는 결과가 나왔습니다.
Vicki Yi : VickiYi

:
Posted by 라면스프
2012. 7. 24. 09:30

Java && Excel 연동 Enjoy/JAVA2012. 7. 24. 09:30

출처 : http://dualist.tistory.com/151


참조 : http://www.javapattern.info/

         http://www.okjsp.pe.kr/

 

자바로 엑셀을 핸들링 할 수 있는 방법은 크게 두가지로 나누어 진다.
1. Java Excel API    
    참조 : http://jexcelapi.sourceforge.net/
2. POI 
    참조 : http://jakarta.apache.org/poi/index.html

 

    흔히 POI를 엑셀을 핸들링 하기 위한 것으로만 오해하기 쉬운데,
    POI 프로젝트는 마이크로소프트 OLE 2 복합도큐먼트포맷형식의 파일을 순수 자바를 이용하여 핸들링하는 APIs로 구성되어있다.
    OLE 2 복합도큐먼트포맷형식의 파일은 마이크로소프트 엑셀 혹은 워드파일 등의 대부분의 오피스파일들을 나타낸다.

 

일반적으로 엑셀에 대한 핸들링만을 수행할 때에는 Jxl을 권장한다.
엑셀을 핸들링 할 때 엑셀에서 가장 작은 단위는 알고 있듯이 "셀"이다.
모든 작업은 이 셀을 중심으로 이루어진다.

 

주의할 점)
1) 엑셀 쉬트상에 "C15"라는 셀에 데이터가 있다고 가정하자.( 15행 C열을 나타낸다.)
이 때 Jxl에서는  A1( 1행 A열)부터  C15까지는 실제 데이터가 없을 경우에라도 null이 아닌 빈데이터가 있다고 인식한다.
즉 D열 이상이나, 16행 이상을 접근 할 때에 null로 인식한다.

하지만 POI에서는 C15 이내에 있다 하더라도 실제 데이터가 없을 때에는 null로 인식한다.

2) Jxl에서는 각 셀의 데이터 타입을 실제 엑셀 파일에서 지정된 셀의 타입을 따르고, 
   POI에서는 셀의 실제 데이터 형을 따른다. 
   예를 들어 특정 셀의 타입을 text 로 잡아놓고, 데이터를 1234로 입력하면
   Jxl에서는 "12345"로 인식하고, POI에서는 12345.00 이런식으로 인식한다.

 

EX ) Java Excel API를 이용한 Excel 읽기

import jxl.*;

// .. 중간생략

    Workbook workbook = null;
    Sheet sheet = null;
    Cell cell = null;

    try
    {
        //엑셀파일을 인식
        workbook = Workbook.getWorkbook( new File( szFileName));

        //엑셀파일에 포함된 sheet의 배열을 리턴한다.
        //workbook.getSheets();

        if( workbook != null)
        {
            //엑셀파일에서 첫번째 Sheet를 인식
            sheet = workbook.getSheet(0);

            if( sheet != null)
            {
                //셀인식 Cell a1 = sheet.getCell( 컬럼 Index, 열 Index);
                //셀 내용 String stringa1 = a1.getContents();

                //기록물철의 경우 실제 데이터가 시작되는 Row지정
                int nRowStartIndex = 5;
                //기록물철의 경우 실제 데이터가 끝 Row지정
                int nRowEndIndex   = sheet.getColumn( 2).length - 1;

                //기록물철의 경우 실제 데이터가 시작되는 Column지정
                int nColumnStartIndex = 2;
                //기록물철의 경우 실제 데이터가 끝나는 Column지정
                int nColumnEndIndex = sheet.getRow( 2).length - 1;

                String szValue = "";

                for( int nRow = nRowStartIndex; nRow <= nRowEndIndex; nRow++ )
                {
                    for( int nColumn = nColumnStartIndex; nColumn <= nColumnEndIndex ; nColumn++)
                    {
                        szValue = sheet.getCell( nColumn, nRow).getContents();

                        System.out.print( szValue);
                        System.out.print( "\t" );
                    }
                    System.out.println();
                }
            }
            else
            {
                System.out.println( "Sheet is null!!" );
            }
        }
        else
        {
            System.out.println( "WorkBook is null!!" );
        }
    }
    catch( Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        if( workbook != null)
        {
            workbook.close();
        }
    }

EX ) POI를 이용한 Excel 파일 읽기

import org.apache.poi.hssf.usermodel.*;

// .. 중간 생략

    HSSFWorkbook workbook = null;
    HSSFSheet sheet = null;
    HSSFRow row = null;
    HSSFCell cell = null;

    try
    {
        workbook = new HSSFWorkbook( new FileInputStream( new File( szFileName)));

        if( workbook != null)
        {
            sheet = workbook.getSheetAt( 0);

            if( sheet != null)
            {

                //기록물철의 경우 실제 데이터가 시작되는 Row지정
                int nRowStartIndex = 5;
                //기록물철의 경우 실제 데이터가 끝 Row지정
                int nRowEndIndex   = sheet.getLastRowNum();

                //기록물철의 경우 실제 데이터가 시작되는 Column지정
                int nColumnStartIndex = 2;
                //기록물철의 경우 실제 데이터가 끝나는 Column지정
                int nColumnEndIndex = sheet.getRow( 2).getLastCellNum();

                String szValue = "";

                for( int i = nRowStartIndex; i <= nRowEndIndex ; i++)
                {
                    row  = sheet.getRow( i);

                    for( int nColumn = nColumnStartIndex; nColumn <= nColumnEndIndex ; nColumn++)
                    {
                        cell = row.getCell(( short ) nColumn);
                        
                        if( cell == null)
                        {
                            continue;
                        }
                        if( cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC)
                        {
                            szValue = String.valueOf( cell.getNumericCellValue());
                        }
                        else
                        {
                            szValue = cell.getStringCellValue();
                        }

                        System.out.print( szValue);
                        System.out.print( "\t" );
                    }
                    System.out.println();
                }
            }
            else
            {
                System.out.println( "Sheet is null!!" );
            }
        }
        else
        {
            System.out.println( "WorkBook is null!!" );
        }

    }catch(Exception e){
        e.printStackTrace();
    }


EX ) Jxl을 이용하여 Excel에 데이터 저장하기

import jxl.*;

// .. 중간생략

    WritableWorkbook workbook = null;
 WritableSheet sheet = null;

 File excelFile = new File( szFileName);
 Label label = null;

 long start = 0;
   long end = 0;
   
    try
    { 
        for(int i = 0 ; i < 10; i++)
        {
            workbook = Workbook.createWorkbook( excelFile);
            workbook.createSheet("sheet1", 0);
            sheet = workbook.getSheet(0);
            for( int j = 0; j < 10000; j++){
                label = new Label( j, 0, "test cell");
                sheet.addCell( label);
            }

            kidsbook.write();
            kidsbook.close();
        }
    }
    catch( Exception e)
    {
    }

// .. 중간생략


EX ) POI를 이용한 브라우저에서 Excel에 데이터 저장하여 보여주기

import org.apache.poi.hssf.usermodel.*;

// ... 생략

public void writeStream( PTSEvaluation[] arrPTSEvaluation) throws Exception
{
    try
    {

        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet( "new sheet");
        HSSFRow row = null;
        HSSFCell cell = null;
        HSSFCellStyle style = null;

        ServletOutputStream excelOut = ServiceContext.getResponse().getOutputStream();
        ServiceContext.getResponse().setHeader( "Content-Disposition", "attachment;filename=EvaluationCompensationList.xls");
        ServiceContext.getResponse().setContentType( MimeType.getMimeType( "xls"));

        //로우 생성
        row = sheet.createRow( ( short)0);
        row.setHeightInPoints( 30);

        //셀에 적용한 스타일을 생성한다.
        style = PTSUtil.setExcelHeaderStyle( wb);

        // 셀 생성
        cell = row.createCell( (short)0);

        //한글 처리
        cell.setEncoding( HSSFCell.ENCODING_UTF_16); 

        //셀에 데이터 입력하기
        cell.setCellValue( "값");

        //셀에 스타일 적용하기
        cell.setCellStyle(style);

        //.. 중간생략 ( 이런 방식으로 로우와 셀을 증가 시키면서 작업을 수행하면 된다.

        wb.write( excelOut);
        excelOut.flush();
    }
    catch( Exception e)
    {
        e.printStackTrace();
        throw e;
    }
    finally
    {
        ServiceContext.getResponse().getOutputStream().close();
    }
}

// ... 생략


출처 : Tong - 퀴비님의 자바통


:
Posted by 라면스프
2012. 7. 20. 15:36

1 Tomcat 2 Service Enjoy/JSP2012. 7. 20. 15:36



두개의 Tomcat을 설치하여 server.xml의 포트 부분을 변경하는 방법도 있지만 

너무 번거러운 관계로 server.xml에서 service 부분만 추가하여 포트를 변경하는 방법이다.


<Service name="Catalina">

    <Connector 

        port="8080"

        redirectPort="8443"

        minSpareThreads="25"

        connectionTimeout="20000"

        maxThreads="500"

        maxSpareThreads="75">

    </Connector>

    <Connector

        port="8009"

        redirectPort="8443"

        protocol="AJP/1.3">

    </Connector>

    <Engine

        defaultHost="localhost"

        name="Catalina">

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>

      <Host

          appBase="webapps"

          name="localhost">

       <!-- 아래의 Context 부분은 Tomcat 버전에 따라 따로 설정할 수 있다. -->

       <!--<Context path="/test" docBase="C:\text" debug="0" reloadable="true"/>-->

      </Host>

    </Engine>

  </Service>



  <Service name="Catalina2">

    <Connector

        port="8081"

        redirectPort="8444"

        minSpareThreads="25"

        connectionTimeout="20000"

        maxThreads="500"

        maxSpareThreads="75">

    </Connector>

    <Connector

        port="8010"

        redirectPort="8444"

        protocol="AJP/1.3">

    </Connector>

    <Engine

        defaultHost="localhost"

        name="Catalina2">

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>

      <Host

          appBase="webapps"

          name="localhost">

       <!-- 아래의 Context 부분은 Tomcat 버전에 따라 따로 설정할 수 있다. -->

       <!--<Context path="/test" docBase="C:\text" debug="0" reloadable="true"/>-->

       </Host>

    </Engine>

  </Service>


:
Posted by 라면스프
2012. 7. 20. 15:12

Java Stored Procedure 예제 Enjoy/JAVA2012. 7. 20. 15:12

출처 : http://do3ng.wordpress.com/2007/08/13/java-stored-procedure-%EB%A7%8C%EB%93%A4%EA%B8%B0/



Java Stored Procedure 예제

 

  Java Stored Procedure는 웹 개발시 배치잡(Batch Job) 형태의 작업이나, 많은 데이터의 작업이 필요한 경우 뛰어난 성능 향상을 가져 올 수 있습니다. 또한 PL/SQL로 구현하기 어려우나 Java로 구현이 편리할 경우(예를 들어 OS 파일 핸들링, 암호화..) 사용하면 성능 향상과 동시에 편리하게 사용 할 수 있다.

 

  생성 방법 요약

  1) Writing the JAva Classes

- JAVA 소스생성

  2) Load and Resolve the Java Classes

- loadjava를 이용하여 class를 DB에 Load

  3) Publish the Java Classes

- load된 자바클래스를 이용하여 오라클 프로시저/함수 만들기

  4) Call the Stored Procedure or Function

- 프로시저 또는 함수를 사용

 

  아래 예저는 OS 파일을 읽고, 이름을 변경할 수 있는 Java Stored Procedure 예제입니다.  PL/SQL에서 OS상의 파일에 대한 작업을 하려면 UTL_FILE패키지 이용 할 수 있지만 많은 불편함이 있습니다. Java Stored Procedure를 사용해서 작업하는 예제입니다.

 

① JAVA 소스생성

package com.oracleclub.odd.jsp;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

public class FileUtil {

    /**

     *파일을 읽어서 String으로 반환<br/>

     *@param fileDir  파일 경로와 파일명 String

     *@return 파일 데이터 byte[]

     */

    public static String readFile(String fileDir) {

        byte[] bytes = null;

        String data = "";

        try{

            FileInputStream fis = new FileInputStream(fileDir);

            bytes = new byte[fis.available()];

            fis.read(bytes);

            fis.close();

            data = new String(bytes);

        } catch(IOException ioe){

            System.out.println(" FileUtil.readFile error : "+ioe.getMessage());

        } finally {

        }

        return data;

    }

   

    /**

     *oldFileName을 newFileName 파일명으로 변경.<br/>

     *@param oldFileName String

     *@param newFileName String

     *@return boolean

     */

    public static void renameFile(String oldFileName, String newFileName) {

        try{

            if (File.separatorChar != ‘/’) {

                oldFileName = oldFileName.replace(File.separatorChar, ‘/’);

                newFileName = newFileName.replace(File.separatorChar, ‘/’);

            }

            File oldFile = new File(oldFileName);

            File newFile = new File(newFileName);

            if(!oldFile.exists())

                System.out.println("FileHndr.renameFile() Not Exist Source File : "+ oldFile);

            else

                oldFile.renameTo(newFile);

                System.out.println("파일명이 변경 되었습니다 ?>"+newFile);

        } catch(Exception e){

            System.out.println(" FileUtil.renameFile error : "+e.getMessage());

        }

    }

}

② loadjava를 이용하여 class를 DB에 Load

 E:\class directory>loadjava -u scott/tiger -v FileUtil.class

  -v : verbose모드 옵션

  -u : oracle 사용자

  -resolve : .class파일이 아닌 .java파일을 지정할때 컴파일 함

? 정상적으로 생성되었는지 확인

C:\>SQLPLUS scott/tiger

SQL>SELECT object_name

        FROM USER_OBJECTS

        WHERE object_type=’JAVA CLASS’;

③ load된 자바클래스를 이용하여 오라클 프로시저/함수 만들기

? 파일을 읽어 출력하는 함수 (Java 메소드에서 Return 값이 있으면 함수로 생성)

? NAME 키워드 뒤에 패키지.클래스.메소드 명을 입력 합니다.

CREATE OR REPLACE FUNCTION read_file(fileName VARCHAR2)

    RETURN VARCHAR2

    AS

    LANGUAGE JAVA

    NAME ‘com.oracleclub.odd.jsp.FileUtil.readFile(java.lang.String) return java.lang.String’;

/

? 파일명을 변경하는 프로시저 (Java 메소드에서 Return 값이 없으면 프로시저로 생성)

CREATE OR REPLACE PROCEDURE rename_file(oldName VARCHAR2, newName VARCHAR2)

    AS

    LANGUAGE JAVA

    NAME ‘com.oracleclub.odd.jsp.FileUtil.renameFile(java.lang.String, java.lang.String)’;

/

? 패키지로 생성해서 사용 할 수도 있습니다.

CREATE OR REPLACE PACKAGE file_util IS

    FUNCTION  read_file(fileName VARCHAR2) RETURN VARCHAR2;

    PROCEDURE rename_file(oldName VARCHAR2, newName VARCHAR2);

END file_util;

/

CREATE OR REPLACE PACKAGE BODY file_util IS

    FUNCTION read_file(fileName VARCHAR2) RETURN VARCHAR2

    AS

    LANGUAGE JAVA

    NAME ‘com.oracleclub.odd.jsp.FileUtil.readFile(java.lang.String) return java.lang.String’;

    PROCEDURE rename_file(oldName VARCHAR2, newName VARCHAR2)

    AS

    LANGUAGE JAVA

    NAME ‘com.oracleclub.odd.jsp.FileUtil.renameFile(java.lang.String, java.lang.String)’;

END file_util;

/

④ 프로시저 또는 함수를 사용.

? 파일을 읽고 쓸 수 있는 권한을 부여하기 위해 SYS 유저로 접속

SQL>CONN / AS SYSDBA

? 권한을 부여하지 않으면 "ERROR! Handling File: the Permission" 에러가 발생한다.

SQL> EXEC DBMS_JAVA.GRANT_PERMISSION( ‘SCOTT’, ‘SYS:java.io.FilePermission’,'<<ALL FILES>>’, ‘read ,write, execute, delete’ );

SQL> CONN SCOTT/TIGER

SQL> SET SERVEROUTPUT ON

? 자바출력은 트레이스파일로 쓰여지므로, 출력을 화면에 표시하도록 변경후 프로시저 호출

SQL> CALL DBMS_JAVA.SET_OUTPUT(1000);

 

? 파일을 읽는 함수 호출

SQL> SELECT READ_FILE(‘E:/test.txt’) FROM DUAL;

READ_FILE(‘E:/TEST.TXT’)

??????????????-

2006년 8월 26일 Oracle Developer Day

 

? 파일명을 바꾸는 프로시저 호출

SQL> EXEC RENAME_FILE(‘E:/test.txt’, ‘E:/new.txt’);

파일명이 변경 되었습니다 ?>E:\new.txt

PL/SQL 처리가 정상적으로 완료되었습니다.

?> 파일 이름이 변경되었는지 확인

 

? 바낀 파일을 패키지로 읽어 보겠습니다.

SQL> SELECT FILE_UTIL.READ_FILE(‘E:/new.txt’) FROM DUAL;

FILE_UTIL.READ_FILE(‘E:/NEW.TXT’)

????????????-

2006년 8월 26일 Oracle Developer Day

:
Posted by 라면스프

출처 : http://gurucode.egloos.com/1452887


OS: Microsoft Windows 2000 [Version 5.00.2195]

DBMS: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

작성자: 강명규

작성일: 2004-04-17


이 글은 Oracle and Java Stored Porcedures(www.developer.com/db/article.php/3337411)을 정리한 것임.

이 글에 나오는 예제또한 약간의 첨삭이 있지만, 원문에 충실히 할 것임.


오라클에서 stored procedure/function은 전통적으로 PL/SQL로 작성했었다.

사실, Native언어(C언어등 OS상에서 실행파일을 얻는)나 자바로도 가능하다.

특이하게 자바의 경우 오라클에서 VM을 제공하므로 별다른 복잡한 절자없이

PL/SQL처럼 손쉽게 스토어드 프로시저나 함수를 생성할 수 있다.


그럼, 왜 PL/SQL이 있는데 또 다른 언어를 지원하려는 것일까?

네이티브코드는 성능에 잇점이 있을 수 있다.

몇몇 글을 보면 네이티브코드의 경우, 오라클에 존재하는 PL/SQL로 작성된 패키지들을 전체를

네이티브코드로 변경해야 성능상의 이점을 볼 수 있다고 한다. PL/SQL과 섞어쓰면 성능이

오히려 떨어진다고 한다.


그럼 자바는?

실체 성능적인 부분을 측정해보지는 않았는데 PL/SQL과 혼합해서 써도 무방하다고 한다.


자바를 사용하면 좋은 점은?

어느 정도 데이터베이스와 독립적

PL/SQL을 별도로 배울 필요가 없음

개발팀에서 PL/SQL보다는 자바를 더 능숙하게 다루는 팀원이 많을 경우가 대개일 것임.


자바를 사용하면 찝찝한 점은?

성능이 아무래도 pl/sql로 작성한 것보다는 떨어진다.

오라클 SGA에 자바를 위한 메모리를 할당해줘야 한다.

즉, 성능과 리소스를 더 필요로 한다는 의미.


필자의 생각은?

PL/SQL로 작성하던 놈이라 별다른 것이 없다면 PL/SQL로 작성하고,

PL/SQL로 작성하기 어려우면 JAVA를 고려하는 것이 좋겠다.



들리는 소문에 의하면, 차후 오라클버전에서 PL/SQL을 없애고 자바로 대체한다는

믿거나 말거나 하는 얘기가 떠돈다. 사실 오라클사에서는 현재 PL/SQL은 현상유지 차원에서

계속 지원할 것이라고 하나, 자바쪽으로 비중이 옮겨가는 것은 사실인 것 같다.


결론은?

오라클 8i부터 자바로 stored procedure/function를 사용할 수 있다.

원래 pl/sql을 사용하던 사람은 계속 pl/sql을 쓰고, 처음하는 사람은 자바를 사용하도록 하자.

아무래도 둘이 섞어쓰면 찜찜할 것 같긴하다.

실제 자바소스가 변경되어, 오라클로 reload한후, 호출명세를 다시 설정해주지 않았더니 오라클이 맛가는 현상을 겪었다.

alter system kill session '';으로 어떻게 해보려고 했으나 감감 무소식.. shutdown abort밖에 없었다.



자, 이제 직관적으로 간단명료하게 진행하겠다.

우선 오라클에 테스트용 테이블을 생성한다.

SQL> create table test(id int, name varchar(10), salary float);


테이블이 생성되었습니다.


자바로 로직을 작성하고, loadjava를 이용하여 DB에 집어넣는다.

윈도   c:\oracle\ora92\bin\loadjava.bat

유닉스

[sky@gw1 sky]$ file $ORACLE_HOME/bin/loadjava

/u01/app/oracle/product/9.2.0/bin/loadjava: Bourne shell script text executable



[develope/load class]

D:\temp>type TestDML.java

import java.sql.*;

import oracle.jdbc.*;


public class TestDML

{

        // 리턴값이 없으면 오라클 Stored Procedure

        public static void addPerson(int id, String name, float salary)

        {

                System.out.println("새로운 사용자 등록");


                try

                {

                        Connection conn = DriverManager.getConnection("jdbc:default:connection:");

                        String sql = "insert into test values (?,?,?)";

                        PreparedStatement pstmt = conn.prepareStatement(sql);

                        pstmt.setInt(1,id);

                        pstmt.setString(2,name);

                        pstmt.setFloat(3,salary);

                        pstmt.executeUpdate();

                        pstmt.close();

                }

                catch(SQLException e)

                {

                        System.err.println("ERROR! Adding Employee: " + e.getMessage());

                }

        }


        // 리턴값이 있으면 오라클 Function

        public static float getSalary(int id)

        {

                float salary = 0;

                System.out.println(id + "의 급여");


                try

                {

                        ResultSet rs;

                        Connection conn = DriverManager.getConnection("jdbc:default:connection:");

                        String sql = "select salary from test where id=?";

                        PreparedStatement pstmt = conn.prepareStatement(sql);

                        pstmt.setInt(1,id);

                        rs = pstmt.executeQuery();


                        rs.next();

                        salary = rs.getFloat(1);


                        rs.close();

                        pstmt.close();

                }

                catch(SQLException e)

                {

                        System.err.println("ERROR! Adding Employee: " + e.getMessage());

                }


                return salary;

        }

}


-u : DB계정

-v : verbose feedback

-resolve : .class파일이 아닌 .java파일이므로 컴파일해주라.

D:\temp>loadjava -u kang/xxxxxx -v -resolve TestDML.java

arguments: '-u' 'kang/xxxxxx' '-v' '-resolve' 'TestDML.java'

created  : JAVA$CLASS$MD5$TABLE

creating : source TestDML

created  : CREATE$JAVA$LOB$TABLE

loading  : source TestDML

creating : TestDML

resolving: source TestDML


오라클 kang계정을 보면, 뭔가 생성된 것이 보일 것이다.

SQL> select * from tab;


TNAME                          TABTYPE  CLUSTERID

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

CREATE$JAVA$LOB$TABLE          TABLE

JAVA$CLASS$MD5$TABLE           TABLE

JAVA$OPTIONS                   TABLE

TEST                           TABLE


SQL> select object_name, object_type, status from user_objects

  2  where object_name='TestDML';


OBJECT_NAME     OBJECT_TYPE        STATUS

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

TestDML         JAVA CLASS         VALID

TestDML         JAVA SOURCE        VALID


SQL>


위에서 status필드가 VALID가 아니라면 user_errors를 조회해보라.

loadjava는 .sqlj .properties .ser .jar .zip을 인식한다.

만일, kang계정이외에 maddog계정도 이 놈을 사용하겠다고 하면 다음과 같이 한다.


D:\temp>loadjava -u kang/xxxxxx -resolve -resolver "((* KANG)(* MADDOG)(* PUBLIC))" TestDML.java




[publising classes]

SQL이나 PL/SQL에서 자바로 생성한 클래스파일을 호출하려면 publish를 해야 하는데,

자바 클래스는 호출명세(call specification, call spec 혹은 PL/SQL wrapper이라고 불리기도 함)

를 생성/컴파일함으로써 publish될 수 있다.

호출명세는 자바 메소드의 인자와 리턴형을 오라클 SQL타입과 매핑하는 역활을 한다.


SQL> create or replace procedure add_person(id number, name varchar2, salary number)

  2  as language java

  3  name 'TestDML.addPerson(int, java.lang.String, float)';

  4  /


프로시저가 생성되었습니다.


SQL> create or replace function get_salary(id number) return number 

  2  as language java

  3  name 'TestDML.getSalary(int) return int';

  4  /


함수가 생성되었습니다.



즉, 우리는 이제부터 add_person프로시저와 get_salary함수를 사용하면 되는 것이다.

자바출력은 트레이스파일로 쓰여지므로, 출력을 화면에 표시하도록 변경후 프로시저 호출

SQL> set serveroutput on

SQL> call dbms_java.set_output(2000);


호출이 완료되었습니다.


SQL> exec add_person(1,'강명규', 3000.01);

새로운 사용자 등록


PL/SQL 처리가 정상적으로 완료되었습니다.


SQL> select get_salary(1) from dual;


GET_SALARY(1)

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

      3000.01


함수는 다음과 같이 해도 된다.

SQL> var salary number;

SQL> call get_salary(1) into :salary;

1의 급여


호출이 완료되었습니다.


SQL> print salary;


    SALARY

----------

   3000.01



자바에서 PL/SQL을 호출하는 방법

CallableStatement cstmt = conn.prepareCall("{my_plsql_porc}");




[Usage Scenario]

오라클에서 OS상의 파일에 대한 작업을 하려면 UTL_FILE패키지를 이용해야 한다.

이것은 OS상의 파일에 접근할 수 있는 인터페이스를 제공하지만 여러가지로 불편하다.

이 경우 자바의 File I/O를 이용하면 더 효율적으로 작업할 수 있을 것이다.



D:\temp>type FileTest.java

import java.io.*;


class FileTest

{

        public static String readFile(String usrFile)

        {

                String fileStr = new String();

                String tmpStr = new String();

                try

                {

                        File file = new File(usrFile);

                        FileReader fr = new FileReader(usrFile);

                        LineNumberReader lnr = new LineNumberReader(fr);


                        do{

                                tmpStr = lnr.readLine();

                                fileStr += tmpStr;

                        } while(tmpStr != null);


                        lnr.close();

                        fr.close();


                }

                catch(Exception e)

                {

                        System.err.println("ERROR! Handling File: " + e.getMessage());

                }


                return fileStr;

        }

}



D:\temp>loadjava -u kang/xxxxxx -v -resolve FileTest.java

arguments: '-u' 'kang/xxxxxx' '-v' '-resolve' 'FileTest.java'

creating : source FileTest

loading  : source FileTest

creating : FileTest

resolving: source FileTest



SQL> create or replace package my_java_utils is

  2  function read_file(file varchar2) return varchar2;

  3  end my_java_utils

  4  ;

  5  /


패키지가 생성되었습니다.


SQL> create or replace package body my_java_utils is

  2  function read_file(file varchar2) return varchar2

  3  as language java

  4  name 'FileTest.readFile(java.lang.String) return java.lang.String';

  5  end my_java_utils;

  6  /


패키지 본문이 생성되었습니다.


SQL>



D:\temp>type hello

안녕!

나는 강명규라고 해!



SQL> conn system/xxxxxx

연결되었습니다.

SQL> exec dbms_java.grant_permission( 'KANG', 'SYS:java.io.FilePermission','d:\temp\hello', 'read' );


PL/SQL 처리가 정상적으로 완료되었습니다.


SQL> conn kang/xxxxxx

연결되었습니다.

SQL> set serveroutput on

SQL> call dbms_java.set_output(2000);


호출이 완료되었습니다.

SQL> select my_java_utils.read_file('d:\temp\hello') from dual;


MY_JAVA_UTILS.READ_FILE('D:\TEMP\HELLO')

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

안녕!나는 강명규라고 해!null


SQL>


사실 위에서는 hello라는 파일로 했지만, alert.log파일에 대한 처리로 하면 좀 더 현실적일 것이다.



[작업한 내용 제거]

SQL> conn system/xxxxxx

SQL> exec dbms_java.revoke_permission( 'KANG', 'SYS:java.io.FilePermission','d:\temp\hello', 'read');


PL/SQL 처리가 정상적으로 완료되었습니다.


SQL> connect kang/xxxxxx

연결되었습니다.

SQL> drop package my_java_utils;


패키지가 삭제되었습니다.


SQL> drop function get_salary;


함수가 삭제되었습니다.


SQL> drop procedure add_person;


프로시저가 삭제되었습니다.


D:\temp>dropjava -u kang/xxxxxx TestDML FileTest




This article comes from dbakorea.pe.kr (Leave this line as is)


:
Posted by 라면스프
2012. 7. 6. 09:18

oracle 정보 2012. 7. 6. 09:18

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

발리 항공권(2인권) +  숙박 양도 하려고 합니다.

개인적으로 급한 사정이 생겨서 양도합니다. ㅠㅠ

**참고로 구매하시면 일정상 양도/취소 불가합니다.


[풀빌라이용]

7/19/2012 - 7/22/2012

[비행일정]

  • 출발2012-07-19 (목) [출발시간] 11:05
  • 도착2012-07-23 (월) [도착시간] 08:30


[판매 금액]

항공권 2인 144만원 ->  110만원 (유류세/TAX 포함)

빌라Aria Luxury Villas 숙박 $630(약 70만원) -> 50만원




아래 내용은 현재 예약된 정보입니다. 참고하시기 바랍니다.

010-3694-2690  연락주시기 바랍니다.


[항공권]

인터파크항공 이용해서 예약 된 내용입니다.

상품링크 : http://tour.interpark.com/goods/detail.aspx?GoodsCD=12071916739&cate=7

여행기간3박 5일 2012-07-19(목) ~ 2012-07-23(월)
교통/항공편가루다인도네시아항공 [GA 871]

예약일예약/주문번호항목상품명예약상황

2012.06.0920120609*****땡처리항공권◇찬스!! 특가◆ 발리 땡처리 왕복항공권 5일...예약진행

결제수단결제금액결제일시결제상태
총 결제금액 1,440,000
신용카드KB국민카드1,440,000원2012년 06월 11일결제완료 

 



[풀빌라 예약]

아고다 사이트 이용해서 예약  된 내용입니다.

인도네이시아 발리  Aria Luxury Villas 풀빌라구요

이용기간 및 요금은 아래와 같습니다. 


예약 번호호텔 이름투숙 기간결재된 금액예약 현황아래에 있는 링크를 클릭하여 예약을 수정하시기 바랍니다
1854****Aria Luxury Villas & Spa7/19/2012 - 7/22/2012$630Booking ChargedManage Booking

빌라정보 : http://www.agoda.co.kr/asia/indonesia/bali/aria_luxury_villas_spa.html

  

:
Posted by 라면스프
2012. 7. 4. 15:52

eclipse Ganymede 64bit Enjoy/JAVA2012. 7. 4. 15:52




This build requires a 64-bit JVM, and will not run with a 32-bit JVM.

You can, for example, use the Sun 64-bit 1.5 JVM for AMD64.  Note

that the Sun 1.4.2 JVM for AMD64 is 32-bit and therefore cannot be

used to run this build.


http://archive.eclipse.org/eclipse/downloads/drops/R-3.4.2-200902111700/download.php?dropFile=eclipse-SDK-3.4.2-win32-x86_64.zip

:
Posted by 라면스프