레이블이 JAVA OutputStream인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JAVA OutputStream인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 10일 토요일

Raw/Long Raw Type에 관하여

Oracle LongRaw 데이터 타입에 관하여

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



1. 이진 Data또는 Byte문자열을 위한것

2. RAW및 LONG RAW는 Data전송시 인스턴스에 사용자 세션을 접속하는 SQL*Net과
Inport/Export Utility가 문자변환을 수행하지 않는다는 점을 제외하면 Varchar2 Data
Type과 같은 가변길이 Data 유형이다.

3. Oracle이 RAW나 LONG RAW를 CHAR로 상호 변환하는 경우 한 문자에 4bit가 해당되는
16진수 형태로 표현된다.(11001011 은 'CB')

4.  Long Raw는 Index될수 없으나 Raw는 Index 될수있다.

--------------------------
자바에서 LongRaw 예
--------------------------
1. 읽을때(detail이란 컬럼이 longraw 입니다.)

try{
            InputStream vIcode        =null;
            BufferedReader vvcode    =null;

            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(" select name,title,detail,re_id,ip,count,to_char(ilsi,'dd/MON/yyyy(hh:mi)'),path,e_mail,root_id,depth  from db_board where id = "+szID);
            rs.next();
            szName = rs.getString(1);
            szTitle = rs.getString(2);
           
            szDetail= hangul.han(new String(rs.getBytes(3),0));           
            szRe_Id = rs.getString(4);
            szIp = rs.getString(5);
            iCount = rs.getInt(6);
            szIlsi = rs.getString(7);
            szPath = rs.getString(8);
            szE_mail = rs.getString(9);
            szRoot_Id = rs.getString(10);
            szDepth = rs.getString(11);
            iCount++;
            rs.close();
            stmt.executeUpdate(" update db_board set count=count+1 where id = "+szID);
            stmt.close();
   
      }

2. 저장하는 예

PreparedStatement ps = con.prepareStatement("insert into db_board(id,re_id,name,title,detail,passwd,count,ip,ilsi,e_mail,is_re,board_gbn,path,root_id,depth) values (?,0,?,?,?,?,0,?,sysdate,?,'N',?,?,?,0)");

          ps.setInt(1,iId);
          ps.setString(2,hangul.han(szName));
          ps.setString(3,hangul.han(szTitle));

//////////////////////////////////////////////////////////////////////////
          StringBuffer szbWriteDetail = new StringBuffer();
          for( int i = 0,len=szDetail.length() ; i < len ; i++){
              if( szDetail.charAt(i) == ' ')
                  szbWriteDetail.append(" ");
              else if( szDetail.charAt(i) == '<')
                  szbWriteDetail.append("<");
              else if( szDetail.charAt(i) == '>')
                  szbWriteDetail.append(">");
              else if( szDetail.charAt(i) == '\n')
                  szbWriteDetail.append("<br>");
              else
                  szbWriteDetail.append(szDetail.charAt(i));
          }
////////////////////////////////////////////////////////////////////////////

          StringBufferInputStream abc = new  StringBufferInputStream(szbWriteDetail.toString());
          ps.setBinaryStream(4,abc,szbWriteDetail.length());
          ps.setString(5,szPasswd);
          ps.setString(6,szIp);
          ps.setString(7,szE_mail);
          ps.setString(8,szBoard_Gbn);
          ps.setString(9,szPath);
          ps.setInt(10,iId);

          ps.executeUpdate( );

2013년 8월 9일 금요일

[OracleJavaCommunity,오라클자바커뮤니티]이번 강좌에서는 자바에서의 main 메소드에 대해 자세히 알아 보도록 하겠습니다

이번 강좌에서는 자바에서의 main 메소드에 대해 자세히 알아 보도록 하겠습니다. main 앞에 왜 static이 붙으며 왜 public이 붙는지등에 관한 것을 공부해 보도록 하겠습니다. 잘 알아두시기 바랍니다.


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



main 메소드의 특징 

메인 메소드는 JVM에 의해 자바 프로그램을 실행 할 때 처음 호출되는 메소드 입니다.
메인 메소드는 객체 생성을 위한 첫 실행 메소드 이다. 그러므로 어느 클래스에서 접근이 가능해야 하므로 public 이라는 접근 제어자를 사용 합니다.
해당 클래스로 부터 생성된 모든 객체에서 접근이 가능해야 한다. (static) --> static이라는 말이 붙으면 객체와 관련이 있는 것이 아니라 클래스와 관련이 있으며 초기화가 한번만 일어나며, 클래스가 실행되기 위해 메모리로 로딩되는 시점에 한번만 초기화가 일어 납니다. 즉 전역변수등에 사용되며...등등 [자바기초다지기#7]변수-인스턴스변수, 클래스변수 강좌에서 이미 공부 했던 부분 입니다.
Return 값을 가지지 않습니다.(void)
또한 실행 될 때 인자 값을 받아 들일 수 있습니다.

자바 인터프리터는 Java Application에 주어지는 각 명령형 인자들을 main(String[] args) 메소드에 매개변수로 넘겨 줍니다.
각 명령행 인자는 공백문자(whitespace)로 구분 하며, C/C++에서 메인 함수의 매개변수 개수를 나타내는 argc와 명령형 매개 변수 들을 문자열 배열로 받아 들이는 argv는 결국 Java의 args.length, args로 대체 될 수 있습니다.

[예제]

class ArgTest
{
public static void main (String[] args)
{
for(int i = 0; i < args.length; ++i) //이 프로그램을 실행할때 넘어 오는 아규멘트의 갯수 만큼 루프를 돕니다. >
System.out.println( "args[" + i + "] = " + args[i] );
}
}



[결과1]

java ArgTest test 100 이라고 실행시

args[0] = test
args[1] = 100


[결과2]

java ArgTest "test 100" 이라고 실행시

args[0] = test 100

2013년 8월 8일 목요일

[ORACLEJAVA커뮤니티]struts-config.xml이나 메시지 리소스 파일을 수정 후 웹서버를 Restart하지 않고 변경사항을 반영하는 방법

struts-config.xml이나 메시지 리소스 파일을 수정 후 웹서버를 Restart하지 않고 변경사항을 반영하는 방법 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


1.        새로운 ActionServlet을 하나 만듭니다.

package yfarm;

import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import org.apache.struts.action.ActionServlet;
import java.io.IOException;

//struts-config.xml과 메시지 Resource 파일을 수정 했을 때 자동으로 인식할 수 있게...
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.util.RequestUtils;

public class NewActionServlet extends ActionServlet {
       
    protected void Process (HttpServletRequest request, HttpServletResponse response)
                                  throws IOException, ServletException {
        String uri = request.getRequestURI();
       
        if(uri.indexOf("reload.do") != -1) {
            init();
           
            RequestUtils.selectModule(request, getServletContext());
           
            ModuleConfig config = getModuleConfig(request);
           
            getRequestProcessor(config).init(this, config);
           
            RequestDispatcher dispatcher = request.getRequestDispatcher("/reload.jsp");
           
            dispatcher.forward(request, response);           
        }
        else {
            super.process(request, response);
        }
    }
}
                       
위의 NewActionServlet은 URL에 reload.do가 포함되어 있는 경우 초기화를 수행 하도록 합니다. 초기화는 두 단계로 진행하는데 첫째 ActionServlet의 init() 호출하여 struts-config.xml을 초기화 하며 둘째 RequestProcessor 클래스를 초기화 합니다. RequestProcessor 클래스가 초기화 되지 않으면 struts-config.xml이 수정되기 전에 사용된 Action 클래스들이 재사용 되므로 수정된 내용이 반영되지 않을 수도 있습니다.

2.        web.xml을 수정 합니다.
(사용자의 요청을 NewActionServlet이 수행하도록 수정 합니다.)

<servlet>
                <servlet-name>action</servlet-name>
                <servlet-class>yfarm.NewActionServlet</servlet-class>
                <init-param>
                        <param-name>config</param-name>
                        <param-value>/WEB-INF/struts-config.xml</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>               
        </servlet>

3.        ReloadStrutsConfigAction 클래스를 만듭니다. ( 이 클래스가 reload action인 reload.do에 대해 대응을 하는데 아무 일도 하지 않습니다.)

/*
 * Created on 2005. 5. 6.
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package oraclejava;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author 이종철
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

public class ReloadAction extends Action {
    public ActionForward execute(
        ActionMapping mapping,
        ActionForm form,
        HttpServletRequest  request,
        HttpServletResponse response) throws Exception {
        return null;     
    }
}

4.        struts-config.xml에 아래를 추가 합니다. (action-mappings에 추가)

<action
            path="/reload"
            type="oraclejava.ReloadAction"   
    />


5.        XML파일이나 메시지 리소스 등을 수정 후 URL에서 /reload.do를 불러주면 웹 서버를 재시작 하지 않더라도 수정 사항이 반영 됩니다.

2013년 8월 3일 토요일

[SQL초보실전전문가]조인 방법 변경(USE_MERGE) , 오라클교육,오라클힌트 교육, 자바교육

[Hint]조인 방법 변경(USE_MERGE)
 
구로디지털 오엔제이프로그래밍실무교육센터
 
 
머지 조인(Merge Join)이 일어나도록 유도하는 힌트 구문으로 이 경우 거의 SORT를 동반하므로 SORT MERGE JOIN이라고 부릅니다머지 조인이란 양쪽 테이블에서 대상 로우를 추출 후 조인 컬럼을 기준으로 SORT를 한 후 최종 결과를 만들어 내는 조인 방식 입니다.
 
USE_NL처럼 FROM 절 다음에 위치하는 테이블의 순서는 중요하지 않은데 그 이유는 어차피 독립적으로 정렬된 후 병합이 일어나므로 중요하지 않다고 할 수 있으며 SORT MERGE JOIN에서는 드라이빙 테이블의 의미가 없습니다.
 
[형식]
 
 
[]
아래 예제는 Oracle 10g에서 돌렸습니다.
 
 
select 
       e.empno,
          e.ename,
          d.dname,
          d.loc
from   dept d, emp e
where  e.deptno = d.deptno
 
---------------------------------------------------------------
Operation            Object Name      Rows     Bytes    Cost     
-------------------------------------------------------------
SELECT STATEMENT Optimizer Mode=ALL_ROWS               14                      5
  MERGE JOIN                  14         406       5                                                       
    TABLE ACCESS BY INDEX ROWID         SCOTT.DEPT      4           72         2            
      INDEX FULL SCAN   SCOTT.PK_DEPT             4                        1            
    SORT JOIN                 14         154       3                                                       
      TABLE ACCESS BY INDEX ROWID      SCOTT.EMP        14         154       2            
        INDEX FULL SCAN             SCOTT.IDX_EMP_DEPTNO            13                      1                                                           
 
select 
       e.empno,
          e.ename,
          d.dname,
          d.loc
from   dept d, emp e
where  e.deptno = d.deptno
 
---------------------------------------------------------------------
Operation            Object Name      Rows     Bytes    Cost     
------------------------------------------------------------------
SELECT STATEMENT Optimizer Mode=ALL_ROWS               14                      5
  MERGE JOIN                  14         406       5                                                       
    TABLE ACCESS BY INDEX ROWID         SCOTT.DEPT      4           72         2            
      INDEX FULL SCAN   SCOTT.PK_DEPT             4                        1                SORT JOIN                14         154               3                                                       
      TABLE ACCESS BY INDEX ROWID      SCOTT.EMP        14         154       2            
        INDEX FULL SCAN             SCOTT.IDX_EMP_DEPTNO            13                      1                                                           
 
[실습]
 
-      실습을 위한 예제 테이블 및 데이터는 아래 링크에서 확인 바랍니다.
 
myemp1 : 1000만건
myemp1_old : 100만건
mydept : 5
 
테스트환경 : oracle 11g
 
 
MYEMP1이 비드라이빙 테이블이지만 머지조인 에서는 별 의미 없다.
 
SQL> select
  2         e.ename,
  3         d.dname
  4  from   mydept1 d, myemp1 e
  5  where  e.deptno = d.deptno   ;
 
20000000 개의 행이 선택되었습니다.
 
   : 00:02:22.62
 
 
---------------------------------------------------------------------------------------
| Id  | Operation           | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |         |    20M|   476M|       | 68516   (2)| 00:13:43 |
|   1 |  MERGE JOIN         |         |    20M|   476M|       | 68516   (2)| 00:13:43 |
|   2 |   SORT JOIN         |         |    10 |   100 |       |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| MYDEPT1 |    10 |   100 |       |     3   (0)| 00:00:01 |
|*  4 |   SORT JOIN         |         |    10M|   143M|   459M| 68463   (1)| 00:13:42 |
|   5 |    TABLE ACCESS FULL| MYEMP1  |    10M|   143M|       | 16941   (1)| 00:03:24 |
 
 
SQL> select
  2         e.ename,
  3         d.dname
  4  from   myemp1 e, mydept1 d
  5  where  e.deptno = d.deptno ;
 
20000000 개의 행이 선택되었습니다.
 
   : 00:02:09.58
 
---------------------------------------------------------------------------------------
| Id  | Operation           | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |         |    20M|   476M|       | 68516   (2)| 00:13:43 |
|   1 |  MERGE JOIN         |         |    20M|   476M|       | 68516   (2)| 00:13:43 |
|   2 |   SORT JOIN         |         |    10M|   143M|   459M| 68463   (1)| 00:13:42 |
|   3 |    TABLE ACCESS FULL| MYEMP1  |    10M|   143M|       | 16941   (1)| 00:03:24 |
|*  4 |   SORT JOIN         |         |    10 |   100 |       |     4  (25)| 00:00:01 |
|   5 |    TABLE ACCESS FULL| MYDEPT1 |    10 |   100 |       |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

2013년 8월 2일 금요일

JAVA DataInputStream/DataOutputStream – 예제

import java.io.*;

class InputStreamTest {
  public static void main(String[] args) throws IOException {
    FileInputStream fis=new FileInputStream(args[0]);
    DataInputStream dis=new DataInputStream(fis);
    //BufferedReader dis = new BufferedReader(new InputStreamReader(fis));

    String s;
    while( (s=dis.readLine()) !=null) {  //readLine은 Deprecated 된 Method
                                //ReadLine을 사용하기 위해선 위의 주석된것을 사용
                                //하는것이 바람직하다.
System.out.println(s);
}
    fis.close();
  }
}




===================



import java.io.*;

class OutputStreamTest {
  public static void main(String[] args) throws IOException  {
FileOutputStream fos = new FileOutputStream("test.txt");
DataOutputStream dos=new DataOutputStream(fos);

dos.writeChars("하하하");
//dos.write("홍길동".getBytes()); //Default문자인코디을 따라 byte[]로 만듬
dos.writeUTF("256-1234");
os.writeInt(30);

dos.close();

  }

2013년 8월 1일 목요일

Oracle Database Startup shut down

---------------
 DataBase 시작
 ---------------
 Server Manager를 기동한후 작업실시 svrmgrl(unix), svrmgr30(NT용 Oracle 8.x)

 1. DataBase를 마운트 하지않고 인스턴스 시작
 startup nomount;
 - DataBase 생성주에만 이러한 경우가 발생
 2. DataBase를 마운트한후 인스턴트 시작
 startup mount;
 - 데이터 파일의 이름변경,리두로그 파일추가,삭제,변경
 Redo Log Archive Option 활성화또는 비활성화
 전체 DataBase 복구작업 등의 경우에 사용
 3. 인스턴스 시작후 DB를 Mount하여 Open
 startup open;
 - 사용자들이 일반적인 데이타 Access 작업을 할 수 있다.
 4. DataBase 시작단계에서 Access제한
 startup restrict;
 - 인덱스 재구축이나, DB Export/Import 수행
 SQL*Loader등의 작업 수행
 create session권한이 있는 사용자는 DB에 접속 가능하며, Create session/restriced sesison권한이
 있는 사용자는 DB에 Access 할 수 있슴. 즉 DBA만이 restricted session권한이 있어야 함
 5. Instance 강제시작
 startup force;
 - Instance 시작시 문제가 발생한 경우나, shutdown normal이나 shutdown immediate로 현재의 Instance를
 종료할수 없는 경우에 사용
 6. 인스턴스를 시작하고, DB를 Mount한다음 자동으로 복구
 startup recover;

 ---------------
 DataBase 종료
 ---------------
 1. 정상종료
 shutdown normal;
 - 사용자들이 모든 Session을 끊을때까지 기다린후 shutdown
 다시 시작할때 인스턴스 복구가 필요없슴.
 2. 즉시종료
 shutdown immediate;
 - 현재 Client의 모든 SQL명령이 즉시종료
 Commit안된 Session은 RollBack됨
 현재 session을 RollBack한후 즉시 Connection을 끊어버림
 3. 인스턴스중지
 shutdown abort;
 - DB를 즉시 종료할 경우에 사용
 인스턴스를 시작할때 문제가 발생한 경우
 Client의 SQL명령이 즉시 종료되며 Commit안된 Transaction은 RollBack안되며, 즉시 종료됨 
 

자바의 OutputStream (JAVA OutputStream)

OutputStream 클래스는 모든 파일 시스템으로부터 스트림의 한 바이트를 쓴다. 
  public abstract void write(int b): 정수 b를 byte로 변환하여 출력한다.
  public void write(byte b[]): 배열 b의 모든 바이트를 쓴다.
  public void write(byte b[], int off, int len): b의 off 위치로부터 len만큼 쓴다. 
  public void close(): 출력 스트림을 닫는다.
  public void flush(): 버퍼에 남겨진 모든 데이터를 목적지에 보낸다.
  InputStream과 OutputStream은 추상 메소드를 포함하여 바이트들과 바이트 배열들을 읽고 쓰기 위하여 read()와 write()를 사용하는데 실제로 바이트 스트림을 읽고 쓰는 경우가 드물기 때문에 이 메소드는 거이 이용하지 않는다. 왜냐하면 자바에서 문자열은 바이트가 아니라 유니코드로서 일반적으로 숫자, 문자열, 객체형태로 입출력되기 때문이다. 


public class Iotest { //입력 문자열을 그대로 출력 
      public static void main(String []args) throws java.io.IOException {
            int i;
            while ((i=System.in.read())!=-1)
                System.out.write(i); // 정수 i를 문자로 바꾸어 출력한다.
      }
 }