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

2013년 10월 3일 목요일

오라클 논리적 저장 공간, 오라클의 논리적 구성, 데이터베이스 구성,테이블,테이블스페이스,블로그 익스텐트

오라클 논리적 저장 공간, 오라클의 논리적 구성, 데이터베이스 구성,테이블,테이블스페이스,블로그 익스텐트


논리적 저장영역
1. Data Block
- Oracle에서 Data를 저장하는 가장 작은 단위, 블록단위로 DataBase의 DataFile에 있는 저장영역
을 관리한다.
- Data Block의 크기는 최대한계내에는 운영체제 블록크기의 배수여야 한다.
- 구성
  Head : 블록주소와 Segment유형(Data,Index,RollBack…)등의 일반적인 블록정보를 포함
Table Directory : 해당블록에 행을 가지는 Table에대한 정보를 가진다.
Row Directory : 블록내의 실제 행에 대한 정보를 가진다.
Row Data : Table Data Or Index Data를 포함한다.
빈영역
  트랜잭션 입력항목에 사용되는 영역 :  블록내의 하나이상의 행을 Access하는
                                      Insert/Update/Delete/Select등의 명령문은
                                      블록에 하나의 트랜잭션 입력항목을 필요로 한다.
                                      대부분의 운영체제에서는 약23 Byte정도를 필
                                      요로함


2. Extents
- 저장영역할당을 위한 논리적인 단위로 연속적인 몇 개의 Data Block으로 구성된다.
- 각 Segment는 적어도 하나이상의 Extents(RollBack Segment는 2개이상)를 자지고 생성됩니다.
이러한 확장을 initial extents라고 한다.
- 일반적으로 한 Segment의 확장영역은 drop table또는 drop cluster명령으로 개체를 삭제하여
TableSpace에 반환한다.
(예외)truncate … drop storage를 이용하여 Table이나 Cluster를 Truncate시킬수 있슴
    Oracle은 주기적으로 RollBack Segment에 있는 하나이상의 Extents를 해제할수
    있다.
    DBA는 alter table table_name deallocate unused명령을 이용하여 확장영역을 해제할
    수 있다.


3. Segment
- Extents(확장영역)의 집합
A. Data Segment
- DataBase의 SnapShot과SnapShot Log를 포함한 모든 Cluster화 되지 않은 Table은 자신의
Data를 저장하기위해 단일데이터세그먼트(Single Data Segment)를 가진다. Create
Table/SnapShot/SnapShot Log명령을 사용하여 Object를 생성할때 Data Segment를
생성하며 Create Cluster명령이 실행될때 Cluster 에 대한 Data Segment를 생성한다.

B. Index Segment
- Index생성시 Segment할당된다.(Create Index…)

C. RollBack Segment
- Transaction이 RollBack되어야할 경우 트랜잭션 작동을 기록
- 각 DataBase에는 하나이상의 RollBack Segment가 있슴
- Transaction별로 변경되기전의  Data를 기록
- Transaction을 Commit할때 RollBack Segment의 정보를 해체하지만 바로 없애지는 않는다.
Transaction을 Commit 하기전에 시작된 Query에 관련된 Data의 read-consistent  view(읽기
일관성 뷰)를 생성하지위해 data가 RollBack Segment에 남아 있다.
그러한 View를 생성할 가능성이 있는한 RollBack Data를 사용할 수 있도록 Oracle은
RollBack Segment의 확장영역을 순차적으로 사용한다.
RollBack Segment의 마지막 영역이 꽉차면 첫번째 Extents로 돌아가서 RollBack Data를 기록함.
또한 장기적으로 실행되는 Transaction은 RollBack Segment에 새로운 Extents(확장영역)를
요구할수도 있슴.

D. Temp Segment
- Create Index, Select Order By, Select Distinct, Select Group By, Select Union,
Select,Minus,Select ,Intersect등의 명령은 Temp Sefment를 필요로 한다.
예를들어 Query에 Distint,Group By,Order by등이 있으면 Oralce은 두개의 Temp
Segment를 요구할수도 있다. 명령이 완료되면 Oracle은 Temp Segment를 삭제한다.

- Oracle은 사용자 Session기간 동안 필요한만큼의 Temp Segment를 생성한다.
Create User나 Alter User등의 명령에 Temporary TableSpace다음의 TableSpace에 Temp
Segment를 생성한다. 사용자가 Temp Segment를 생성하지 않으면 Default System TableSpace임

예)create user scott identified by tiger default tablespace users temporary
tablespace temp;

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




2013년 8월 5일 월요일

[스트럿츠 한글, 자바프레임워크교육,자바교육,오라클자바오엔제이]Struts 에서 한글 사용하기

Struts 에서 한글 사용하기


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




한글의 경우 필요한 시기에 그때그때 인코딩을 해도 되지만 Servlet2.3에서 제공하는 Filter기능을 이용하는 것처럼 스트럿츠에서도 그러한 기능의 구현이 가능 합니다.

--------------------------------------------------
우선 서블릿의  필터 기능을 이용하여 작성한 예입니다.
--------------------------------------------------

[SetCharacterEncodingFilter.java]

package filters;


import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;



public class SetCharacterEncodingFilter implements Filter {

    protected String encoding = null;

    protected FilterConfig filterConfig = null;


    /**
    * Should a character encoding specified by the client be ignored?
    */
    protected boolean ignore = true;


    public void destroy() {

        this.encoding = null;
        this.filterConfig = null;

    }


    public void doFilter(ServletRequest request, ServletResponse response,
                        FilterChain chain)
        throws IOException, ServletException {

        // Conditionally select and set the character encoding to be used
        if (ignore || (request.getCharacterEncoding() == null)) {
            String encoding = selectEncoding(request);
            if (encoding != null)
                request.setCharacterEncoding(encoding);
        }

        // Pass control on to the next filter
        chain.doFilter(request, response);

    }

    public void init(FilterConfig filterConfig) throws ServletException {

        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        String value = filterConfig.getInitParameter("ignore");
        if (value == null)
            this.ignore = true;
        else if (value.equalsIgnoreCase("true"))
            this.ignore = true;
        else if (value.equalsIgnoreCase("yes"))
            this.ignore = true;
        else
            this.ignore = false;

    }


    protected String selectEncoding(ServletRequest request) {

        return (this.encoding);

    }
}


[web.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>

<!-- Example filter to set character encoding on each request -->
<filter>
 <filter-name>Set Character Encoding</filter-name>
 <filter-class>filters.SetCharacterEncodingFilter</filter-class>
 <init-param>
  <param-name>encoding</param-name>
  <param-value>EUC-KR</param-value>
 </init-param>
</filter>

<!-- Define filter mappings for the defined filters -->
<filter-mapping>
 <filter-name>Set Character Encoding</filter-name>
 <servlet-name>action</servlet-name>
</filter-mapping>

    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
       
        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
            <param-name>debug</param-name>
            <param-value>3</param-value>
        </init-param>
        <init-param>
            <param-name>detail</param-name>
            <param-value>3</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
   
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
 
</web-app>


-------------------------------------------------------------
다음은 스트럿츠의 RequestProcessor 클래스를 이용한 예 입니다.
-------------------------------------------------------------

스트러츠의 RequestProcessor클래스의 processPreprocess라는 메소드를 이용하여 다른 작업이 이루어지기 전에 미리 설정할 것들을 이 메소드에서 정의할 수 있는데 …. 이곳에 한글 인코딩 부분을 기술하여 모든 스트럿츠 애플리케이션에서 적용 되도록 합니다.

아래 파일을 MyFilter.java로 저장 합니다. (WEB-INF/classes/filter에 저장)

package filter;

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

import org.apache.struts.action.RequestProcessor;

public class MyFilter extends RequestProcessor {

        protected boolean processPreprocess(
                HttpServletRequest request,
                HttpServletResponse response) {
               
                try {
                        request.setCharacterEncoding("euc-kr");
                                               
                        return true;
                } catch (Exception e) {               
                        return false;                       
                }
        }
}


이번에 struts-config.xml 파일에 Controller 매핑을 합니다.

<!-- 한글 문제 처리를 위해 -->
    <controller
            contentType="text/html;charset=euc-kr"
            debug="3"           
            locale="true"
            nocache="true"
            processorClass="filter.MyFilter"/>

이상과 같이 설정하면 폼액션을 통해 넘어 오는 데이터에 대해 한글 변환을 일일이 하지 않아도 됩니다.

2013년 8월 2일 금요일

JAVA RandomAccessFile (자바 랜덤파일처리)

임의의 바이트, 텍스트등을 파일내 임의의 위치에 쓸수 있도록 허락
InputStream이나 OutputStream의 서브 클래스는 아니지만 파일의 읽기, 쓰기를 위한 독립적인 메소드를 제공한다. 


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

length() : 파일의 길이 
getFilePointer() : 현재 포인터의 위치 
seek() : 포인터 위치 설정 
readBoolean(), readByte(),readChar(), readShort(), readLong(), readInt(), readFloat(),readDouble(), readLine(), readUTF() : 해당타입의 데이터 읽기 
writeBoolean(), writeByte(),writeChar(), writeShort(), writeLong(), writeInt(), writeFloat(), writeDouble(), writeUTF() : 해당타입의 데이터 쓰기 
close() : 파일 닫기 



import java.io.*; class RandomTest { public static void main(String[] args) throws IOException {      RandomAccessFile raf=new 
                            RandomAccessFile("test.txt","rw");      raf.seek(raf.length());      raf.writeUTF("The end");      raf.close(); } }



----------------
메모장 –  예제
----------------
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class NotePad extends Frame implements ActionListener {
TextArea text = null;
String filename = null;

public NotePad(String title) {
    super(title); // set title
    MenuBar menuBar=new MenuBar();
    Menu fileMenu = new Menu("File");
    menuBar.add(fileMenu);
    MenuItem openItem = new MenuItem("Open...", new MenuShortcut('O'));
    openItem.setActionCommand("Open"); // for getActionCommand
    openItem.addActionListener(this);
    fileMenu.add(openItem);


    MenuItem saveItem = new MenuItem("Save", new MenuShortcut('S'));
    saveItem.setActionCommand("Save"); // for getActionCommand
    saveItem.addActionListener(this);
    fileMenu.add(saveItem);
    MenuItem saveasItem = new MenuItem("Save As...", new MenuShortcut('V'));
    saveasItem.setActionCommand("SaveAs"); // for getActionCommand
    saveasItem.addActionListener(this);
    fileMenu.add(saveasItem);
    fileMenu.addSeparator();
    MenuItem exitItem = new MenuItem("Exit", new MenuShortcut('X'));
    exitItem.setActionCommand("Exit"); // for getActionCommand
    exitItem.addActionListener(this);
    fileMenu.add(exitItem);
    setMenuBar(menuBar);
    text = new TextArea();   


    add(text, "Center");
    addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent we) {
            dispose();
            System.exit(0);
        }
    });
    setSize(500, 400);    setVisible(true);
}
public static void main(String args[]) throws Exception {
    new NotePad("Simple NotePad...");
}
public void actionPerformed(ActionEvent e) {
    String cmd=e.getActionCommand();
    if (cmd.equals("Exit"))
        System.exit(0);
    else if (cmd.equals("Open")) {
        FileDialog dialog=new FileDialog(this, "Text File Open", FileDialog.LOAD);
        dialog.show(); // file dialog is modal
        String filename=dialog.getFile();


      if (filename != null) {
            String directory=dialog.getDirectory();
            if (directory != null)
                filename=directory+filename;
            loadFile(filename);
        }
    }
    else if (cmd.equals("Save")) {
        if (this.filename != null) saveFile(this.filename);
        else {
            FileDialog dialog=new FileDialog(this, "Text File Save", FileDialog.SAVE);
            dialog.show(); // file dialog is modal
            String filename=dialog.getFile();
            if (filename != null) {
                String directory=dialog.getDirectory();
                if (directory != null)
                    filename=directory+filename;
                saveFile(filename);
            }
        }
    }


else if (cmd.equals("SaveAs")) {
        FileDialog dialog=new FileDialog(this, "Text File Save", FileDialog.SAVE);
        dialog.show(); // file dialog is modal
        String filename=dialog.getFile();
        if (filename != null) {
            String directory=dialog.getDirectory();
            if (directory != null)
                filename=directory+filename;
            saveFile(filename);
        }
    }
}


private void loadFile(String filename) {
    BufferedReader in = null; 
    text.setText("");

    try {
        in = new BufferedReader(new FileReader(filename),1024); 
        String string=null;


      while ((string=in.readLine()) != null) {  text.append(string+'\n');    }
        in.close();
    } 
    catch (IOException ie) {System.err.println("File Read Error : "+ie.getMessage()); }
    setTitle("FileName:"+filename);
    this.filename=filename;
}
private void saveFile(String filename) {
    BufferedWriter out = null; 
    try {
        out = new BufferedWriter(new FileWriter(filename));
      String string=text.getText();
        out.write(string); 
      out.close();
  }
    catch(IOException e) { System.err.println("File Read Error : "+e.getMessage()); }
    setTitle("FileName:"+filename);
    this.filename=filename;
}
}