2010년 4월 22일 목요일

[java] DbUtil 사용하기

[View Article] Commons-DbUtils 설명 및 예제  자바(EJB,JSP,JAVA) 

2007/06/15 09:52

복사http://blog.naver.com/atonikkaz/10018521924

I. 어디서 다운을 받나요?

 

http://jakarta.apache.org/site/downloads/downloads_commons-dbutils.cgi

http://jakarta.apache.org/commons/dbutils/apidocs/index.html

 

II. 설치는 어떻게 하나요?

다운 받은 commons-beanutils.jar는 자신의 /WEB-INF/lib/ 에 복사합니다

 

III. DbUtils란 무엇인가요?

DbUtils는 JDBC 작업을 좀더 쉽게 할수있도록 해주는 작은 클래스 집합입니다.

 

IV. 왜 DbUtils를 사용해야 하는가요?

① resource 누출에 대한 어떠한 가능성도 없습니다
  JDBC코딩을 하는데 있어서 쉽지않고 양도 만만치 않으며 지루해 지기 쉽습니다
  이러다 보면 자기도 모르게 Connection 누수를 발생시킬수 있는데 이러한 가능성을 배재해 줍니다


② 코드의 가독성이 높아집니다
  데이터베이스 처리하는데 필요한 코드의 양을 절대적으로 줄여야 합니다.
  남아있는 코드로 당신의 의도를 정확하게 나타내어야 합니다.


③ ResultSet으로 부터 JavaBean property로 세팅을 해줍니다!
  더이상 setter메소드를 이용하여 ResultSet으로부터 컬럼값을 가져오는 코딩을 하지 않아도 됩니다
  ResultSet 각각의 row는 bean instance의 에 완벽하게 전달해 줍니다

 

V. 어떻게 사용하나요?

 ① Connection, Statement, ResultSet 의 close를 간단하게!

    이럴때는 org.apache.commons.dbutils.DbUtils 클래스를 이용하자!

    이 클래스는 모두 static 메소드들로 구성되어있습니다

   

    사용예)

    DbUtils.close(conn);  
    DbUtils.close(stmt);
    DbUtils.close(rs);
    DbUtils.closeQuietly(conn);
    DbUtils.closeQuietly(stmt);
    DbUtils.closeQuietly(rs);
    DbUtils.closeQuietly(conn, stmt, rs);
    DbUtils.commitAndClose(conn);

    DbUtils.commitAndCloseQuietly(conn);
    DbUtils.loadDriver("com.mysql.jdbc.Driver");
    DbUtils.rollback(conn);

 

    closeQuietly 메소드처럼 뒤에 Quietly라고 붙어 있는 메소드는 익셉션 처리는 자체적으로 처리합니다,

    즉 자신을 call한곳으로 throw 하지 않습니다

    commitAndCloses는 connection을 commit 후 close 하며 rollback는 connection을 rollback 합니다

    loadDriver 는 JDBC 드라이버를 로딩 합니다

 

 ② 파일로 저장된 SQL을 사용하자!

    이럴 때는 org.apache.commons.dbutils.QueryLoader 클래스를 이용합니다

    이 클래스는 SingleTone 패턴의 클래스입니다

    즉 파일로 저장된 SQL을 읽어 HashMap으로 로드하는 클래스 입니다

   

    사용예)

    QueryLoader queryloader = QueryLoader.getInstance();   //싱글톤
    HashMap hashmap = queryloader.load("sql");      

    queryloader.unload("sql");

 

    queryloader는 싱클톤이므로 위와같이 객체를 얻어옵니다

    load 함수는 Properties 클래스를 이용하여 sql.properties 파일을 읽어

    HashMap으로 저장하여 리턴하여 줍니다

    unload는 load시 따로 메모리에 저장해 놓았던 sql 정보를 해제합니다

 

 ③  Setter함수로 더이상 머리 아프지 말자!

   이럴때는 org.apache.commons.dbutils.QueryRunner 클래스를 이용합니다

 

   사용예)

    ...  

    BoardVO boardVO = null;

    ArrayList arraylist = new ArrayList();

 

    resultset = statement.executeQuery("SELECT * FROM board_t");

    while (resultset.next()) {

        boardVO = new BoardVO();

        boardVO.setTitle("title");

        boardVO.setContent("content");

        boardVO.setWriter("writer");

        arraylist.add(boardVO);      

    }

    ..

   와 같은 코드는 다음과 같이 간략화 됩니다

 

   ResultSetHandler rsh= new BeanListHandler(BoardVO.class);
   QueryRunner queryRunner = new QueryRunner();

   List list = (List)queryRunner.query(conn, "SELECT * FROM board_t", rsh);

 

   정말 간단해 집니다 만약 테이블에 컬럼이 30~40개가 된다면..

   select 한문장 할려면 코드수가 몇십줄 입니다. 더이상 노가다 하지 맙시다~

 

   QueryRunner는 다음과 같은 함수를 지원합니다

   사용예)

   QueryRunner queryrunner = new QueryRunner();
   QueryRunner queryrunner = new QueryRunner(DataSource ds);
//datasource를 바로 이용할 수 있다

   queryRunner.query(Connection conn, String sql, ResultSetHandler rsh)
   queryRunner.query(Connection conn, String sql, Object param, ResultSetHandler rsh)
   queryRunner.query(Connection conn, String sql, Object[] params, ResultSetHandler rsh)

 

   여기서 말하는 Object param은 파라미터 전달시 사용됩니다

   ArrayList params = new ArrayList();
   params.add("100");

   params.add("200");

   ResultSetHandler rsh = new BeanListHandler(BoardVO.class);
   QueryRunner queryRunner = new QueryRunner();

   List list = (List)queryRunner.query(conn, "SELECT * FROM board_t WHERE boardNo > ? and boardNo < ?", params.toArray(), rsh);

 

   select 뿐만 아니라 update, delete역시 가능합니다

   사용예)

   QueryRunner queryRunner = new QueryRunner();

   queryRunner.update(Connection conn, String sql)
   queryRunner.update(Connection conn, String sql, Object param)
   queryRunner.update(Connection conn, String sql, Object params[])

 

   ArrayList params = new ArrayList();
   params.add(boardId);
   queryRunner.update(connection, "UPDATE board_t SET read = read + 1 WHERE boardNo = ?", params.toArray());

   와 같이 사용할 수 있습니다

 

 

VI. 샘플코드

public class DbUtilsExample() {

   public static void main(String[] args) {

       HashMap map = QueryLoader.getInstance().load("sql");  // (주의) load함수는 실행할때마다 파일을 읽습니다

 

       Connection conn = null;

       try {

           DbUtils.loadDriver("com.mysql.jdbc.Driver");

           conn = DriverManager.getConnection("jdbc:mysql://localhost/mysql", "root", "");

 

           ArrayList params = new ArrayList();
           params.add(args[0]);

 

           ResultSetHandler rsh = new BeanListHandler(BoardVO.class);

           QueryRunner qr = new QueryRunner();

           List list = (List)qr.query(conn, (String)map.get("select"), params.toArray(), rsh);

 

           for (int i = 0; i < list.size(); i++) {

               BoardVO board = (BoardVO)list.get(i);

               System.out.println(board.getTitle());

               System.out.println(board.getContent());

               System.out.println(board.getWriter());

          }

       } catch (Exception e) {

           System.out.println(e);

       } finally {

           DbUtils.closeQuietly(conn);

       }

   }

}

 

 

DbUtils 몇가지 예제

 

DBUtils 기본은 다음 링크를 참조하세요

http://www.jakartaproject.com/article/jakarta/1108193481660

 

① 설정방법

   DB유틸 설정 방법은 특별히 없습니다  그냥 다운받은 클래스 패스 잡으시면 됩니다

   Application에서 사용시에는 환경변수나 실행시 클래스 패스를 잡으면 되고요,

   웹에서 사용한다면 해당 어플리케이션의 /WEB-INF/lib/ 에 commons-beanutils.jar 를 복사하면 됩니다

 

   기본적인 문서는 http://www.jakartaproject.com/article/jakarta/1108193481660 를 보세요

 

   Download http://jakarta.apache.org/site/downloads/downloads_commons-dbutils.cgi

   API http://jakarta.apache.org/commons/dbutils/apidocs/index.html

 

② SELECT 예제 (여러건)

 

<%@ page contentType="text/html;charset=EUC_KR" %>
<%@ page import="com.jakartaproject.board.vo.*,org.apache.commons.dbutils.*,java.sql.*,java.util.*, org.apache.commons.dbutils.handlers.*" %>

<%
       Connection conn = null;

       try {

           DbUtils.loadDriver("com.mysql.jdbc.Driver");

           conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "test", "1111");

 

           ArrayList params = new ArrayList();
           params.add("1%");

 

           ResultSetHandler rsh = new BeanListHandler(BoardVO.class);

           QueryRunner qr = new QueryRunner();

           List list = (List)qr.query(conn, "SELECT boardTitle, boardContent, userNick FROM board_test_t WHERE userIp like ?", params.toArray(), rsh);

 

           for (int i = 0; i < list.size(); i++) {

               BoardVO board = (BoardVO)list.get(i);

               System.out.println(board.getBoardTitle());

               System.out.println(board.getBoardContent());

               System.out.println(board.getUserNick());

          }

       } catch (Exception e) {

           System.out.println(e);

       } finally {

           DbUtils.closeQuietly(conn);

       }
%>

 

③ SELECT 예제 (한건)

select 처리 건수가 1건일 경우에는 MapHandler를 사용하면 됩니다

<%@ page contentType="text/html;charset=EUC_KR" %>
<%@ page import="org.apache.commons.dbutils.*,java.sql.*,java.util.*, org.apache.commons.dbutils.handlers.*" %>

<%
       Connection conn = null;

       try {

           DbUtils.loadDriver("com.mysql.jdbc.Driver");

           conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "test", "1111");

 

           ResultSetHandler rsh = new MapHandler();

           QueryRunner qr = new QueryRunner();

           Map map = (Map)qr.query(conn, "SELECT count(*) cnt FROM board_test_t", rsh);

           System.out.println(map.get("cnt"));

           

       } catch (Exception e) {

           System.out.println(e);

       } finally {

           DbUtils.closeQuietly(conn);

       }
%>

핸들러에는 아래와 같이 여러 종류의 핸들러 들이 있으며,

ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler

그때그때 맞춰 사용하면 됩니다

 

 

④ UPDATE 예제

이 예제는 Unicorn 소스에 있는 예입니다

Unicorn 소스를 다운받아 /src/com/jakartaproject/admin/dao/AdminMySqlDAO.java 를 열어 보시면 Update, Insert 예제를 볼수 있습니다

 

public void setBoardCommonSecurity(ConnectionContext connectioncontext,

                                                  AdminForm adminForm) throws BaseException {


        String updateQuery = "UPDATE board_common_t SET badIp=?, badId=?, badNick=?, badContent=?, inputPerMin=?, tryLogin=?";

        try {
            ArrayList params = new ArrayList();
            params.add(encode(adminForm.getBadIp()));
            params.add(encode(adminForm.getBadId()));
            params.add(encode(adminForm.getBadNick()));
            params.add(encode(adminForm.getBadContent()));
            params.add(String.valueOf(adminForm.getInputPerMin()));
            params.add(String.valueOf(adminForm.getTryLogin()));

            QueryRunner queryRunner = new QueryRunner();
            queryRunner.update(connectioncontext.getConnection(), encode(updateQuery), params.toArray());

        } catch (Exception e) {
            logger.error("Error at AdminDAO.setBoardCommonSecurity",e);
            BaseException baseException = new BaseException("errors.sql.problem");
            throw baseException;
        }

        logger.info("AdminDAO.setBoardCommonSecurity was executed");
    }

 

 

 

 

 

 

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

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

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

2010년 4월 10일 토요일

[아이폰] OS 4.0 설치후기

http://bassist.tistory.com/113

 

후후 벌써 설치하신분이 있네요...

멀티태스킹에, 폴더기능 지원.

이두개만으로 4.0이라고 까지 하긴 좀 그렇지 않을까요??

 

해킹때문에 주식못하는 저같은 사람에게는 꽤 괞찮을듯합니다.

대신 빨리 탈옥이 나와야^^

 

필요한 사양
1. OS : Mac OS X(10.5.8이상이면 쉽게 할수 있음), 해킨도 상관없는것으로 사료됨. 본인도 해킨에서 설치했음
2. 아이튠스 스토어 접속 가능해야함
   (Safari가 4버전 이상이어아 접속 가능, 10.5.7 이하에서는 설치 불가함, 10.5.7이하에서 설치방법 아래설명)
오늘 날 괴롭혔던 주범 사파리


간략한 작업 진행 방법
1. Hosts 파일을 수정.
2. 아이튠스에서 옵션+업데이트를 눌러 업데이트 진행.

진짜 간단하다!!!!! 근데 이걸한다고 아침부터 저녁 5시까지 대삽질을 하다니 -_-;



◇iPhone OS 4.0 깔기

○ iPhone OS 4.0 파일 다운로드
4.0 OS가 필요하다. 토렌트등에 떠돌고 있으니 각자 알아서 구하자. 용량은 370MB정도 였다.

○ Hosts 파일 수정.
1. 먼저 파인더를 띄우고 응용프로그램->유틸리티->터미널을 띄운다.
응용프로그램->유틸리티
유틸리티->터미널 선택

2. 터미널이 뜨면 터미널에 sudo vi /etc/hosts 라고 타이핑을 한다.


3. 호스트 파일의 내용 마지막에에 "127.0.0.1   albert.apple.com"을 추가한다.
  터미널에서 2번의 내용을 타이핑하면 유닉스의 텍스트파일 편집기인 vi가 hosts 파일의 내용을 뿌려주게된다.
  이상태에서 화살표키를 눌러 가장 아래쪽 라인으로 내려가서 Shift+A를 누르면 입력모드로 변하게 된다.
  그상태에서 엔터키를 한번 입력해 줄을 바꿔주고 127.0.0.1    albert.apple.com 을 입력하자.
  127.0.0.1과 albert.apple.com 사이는 Tab키를 눌러서 띄워주면 된다.
해당내용을 수정한 hosts 파일
초기화면에서 커서를 가장 오른쪽 하단부로 내리고 i를 타이핑해 입력모드로 들어가도 무방하다.

4. 입력을 마치면 ESC키를 누르자. ESC키를 누르면 입력모드가 종료된다. 그상태에서 :wq 를 타이핑후 엔터키를 입력한다.
저장하고 빠져나가는 :wq 명령어를 입력하자.(별 상관없는 이야기지만 write, quit 앞자 조합이 아닌가 싶다)


이렇게 저장하고 빠져나오면 hosts 파일 수정은 끝! 이제 아이폰에 OS 4.0만 심어주면 된다.


○ 아이튠스를 통해 iPhone OS 4.0 업데이트

1. 아이튠스를 실행하고 아이폰도 케이블을 연결해 컴퓨터에 연결한다.
2. 아이폰 항목을 선택하면 나오는 업데이트 확인 단추를 이용하여 업데이트할 것이다.
   옵션키를 누른채로 업데이트 확인 버튼을 누르자
옵션+복원으로는 하지말자 골치 아파진다.

3. 옵션+업데이트 확인을 눌러주면 아래처럼 ipsw파일을 지정할수 있는데 아까 받아둔 iPhone OS 4.0을 지정해주면 된다.



4. 시간이 지나고 아이폰에 사과모양이 몇번 뜨고나면 자동으로 초기화면이 뜰것이다.

업데이트 끝!!!!!!!!!!!!!





◇ 각종 에러 해결 방법

○ 옵션+복원을 눌러 4.0을 설치한 경우

아마 액티베이션이 안된다는 메세지를 띄우고 아이폰은 긴급전화만 할수있는 멍청이 상태가 되어있을 것이다.
그때는 어쩔수 없이 3.1.3으로 복원하는수밖에 없는데 그 상태에서는 아이튠스에 복원 버튼도 볼수 없기때문에 다음과 같은
방법을 쓰면 된다.

1. 복원 가능한 모드 만들기
아이폰의 전원 버튼과 홈버튼을 같이 계속 누르고 있는다. 그러면 빨간 화살표 모양의 전원끄는 화면이 뜨게되는데 그 상태에서도 누르고있는 버튼은 떼지 말고 계속 누르고 있다보면 어느순간 아이폰 화면 까맣게 변하게 된다.
그러면 전원버튼은 떼고 홈키만 계속 누르고 있으면 사과 로고가 떴다가 iTunes에 연결하라는 아이폰 화면이 나올것이다.
그리고 컴퓨터의 iTunes에서는 복원할 아이폰을 찾았다는 팝업창이 뜬다. (이게 DFU 모드가 맞는지는 모르겠다)

2. 1015 에러 해결
 - irecovery 다운 및 실행
이렇게 하고나면 복원이 가능한데 실컷 복원을 다해놓으면 1015라는 에러창이 하나 뜨게 될것이다.
그상태에서 승인을 누르고 첨부한 iRecovery 라는 프로그램을 다운받는다.
libusb-0.1.4.dylib 파일은 /usr/local/lib 폴더에 복사해주면 된다.
그리고 응용프로그램->유틸리티->터미널을 실행시켜준다.
irecovery 프로그램이 있는 디렉토리로 이동해서 iRecovery -s 라고 타이핑을하고 엔터를 친다.

※ 2010/04/10 추가 사항
  해킨 10.5.7버전과 리얼맥(유니맥)에서 확인한 결과 /usr/local 이라는 디렉토리가 존재하지 않았고
  이런 경우에는 /usr/lib 디렉토리에 libusb-0.1.4.dylib 파일을 넣어주면 됩니다.

 - irecovery를 통한 에러 해결
그러면 글들이 쭉 뜨고 마지막에 명령어를 입력할수 있도록 커서가 깜빡이는데 거기에서
setenv auto-boot 타이핑후 엔터
saveenv 타이핑후 엔터
reboot 타이핑후 엔터
를 하고나면 아이폰이 재부팅되면서 3.1.3 초기로 돌아가며 복원이 된다.

※ 2010/04/10 추가사항
  만약 이렇게 했는대도 아이폰에서 비상전화 화면만 띄우고 있다면
  수정했던 호스트 파일을 원상태로 복구시켜 주시면 순정 3.1.3으로 복원이 가능합니다.



○ MAC OS X의 버전이 낮아 사파리 4.0을 설치 못하는경우
개인적으로는 이부분때문에 거의 70%이상의 시간을 허비했다.
거의 윈도우만 쓰다보니 사파리 4.0이 깔리지 않으면 아이튠스 스토어에 접속을 못한다는걸 몰라서 -_-;;
나는 10.5.7 버전을 쓰고 있었는데 간단히 버전 정보만을 수정하는것으로 사파리 4를 설치할수 있었다.
10.5.7에서 사파리 4 설치 방법

1. 파인더를 실행한다.
2. Shift+Command+G 를 눌러 이동하는 창을 띄운뒤 /system 을 입력
3. system/library/coreservices 폴더로 이동한다.
4. SystemVersion.plist 파일을 찾아 데스크탑(바탕화면)에 드래그한다(복사)
5. 바탕화면의 SystemVersion.plist 파일을 열어 버전 항목에 10.5.7 부분을 10.5.8로 바꾸어준다(2개 바꿔줘야함)
이런식으로 아랫쪽에 버전 정보에 10.5.8이라고 바꿔주면 된다.

6. 데스크탑에있는 파일을 다시 system/library/coreservices로 드래그하여 덮어쓰기한다.
7. 이 매킨토시에 대해서 메뉴에서 MAC OS X 버전이 10.5.8로 바뀐지 확인한다.
8. http://apple.com/safari 에서 사파리 4 레오파드용을 다운받아 설치한다.

이렇게 하면 설치가 되고 아이튠스 스토어가 문제없이 동작할 것이다.
(만약 이렇게 하고 에러가 뜬다면 http://x86osx.com 에서 정보를 구하는것이 빠를것이다)

2010년 4월 6일 화요일

[아이폰] good reader document 경로

/private/var/mobile/Applications/3415098F-7300-44FD-8F27-683930A44399/Documents

 /private/var/mobile/Applications/C90CD922-804D-4E89-B49A-920913E5120D

2010년 3월 27일 토요일

[ORACLE] 펌 spfile 과 pfile (startup pfile='/xxxx/xxxx/init<SID>.ora')

출처 : http://blog.naver.com/khi830/20097894487

#############################

 파라미터 파일

#############################
1.pfile (text file) : $ORACLE_HOME/dbs/initsid.ora

 Dynamic parameter : java_pool_size, large_pool_size .... : 명령으로 수정 가능   -> 그러나 파라미터 파일에 내용은 변화되지 않는다.
 Static  parameter : log_buffer ...                       : 명령으로 수정 불가능 -> 수정이 필요하면 파라미터 파일을 수정한 뒤 restartup

2.spfile (binary file) : $ORACLE_HOME/dbs/spfilesid.ora  --> persistent(지속) 파라미터 파일

 Dynamic parameter : java_pool_size, large_pool_size .... : 명령으로 수정 가능 -> 파라미터 파일의 내용이 자동으로 수정된다.
 Static  parameter : log_buffer ...                       : 명령으로 수정 가능 -> scope=spfile 옵션을 붙여서 수정한 뒤 restartup

 cf.Startup 할 경우의 파라미터 파일 우선 순위

   SQL> startup         --> $ORACLE_HOME/dbs/spfilesid.ora
                        --> $ORACLE_HOME/dbs/spfile.ora
                        --> $ORACLE_HOME/dbs/initsid.ora
                        --> 에러

   SQL> startup pfile = '/home/oracle/myinit.ora'

##################################################################################################

=================================
 Pfile을 사용할 경우
=================================

SQL> !rm $ORACLE_HOME/dbs/spfiletestdb.ora

SQL> startup force

SQL> show parameter

SQL> show parameter db_cache_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
db_cache_size                        big integer            64M

SQL> show parameter pool_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
global_context_pool_size             string
java_pool_size                       big integer            24M
large_pool_size                      big integer            0
olap_page_pool_size                  big integer            0
shared_pool_size                     big integer            72M
streams_pool_size                    big integer            0

SQL> alter system set large_pool_size=4m;

alter system set large_pool_size=4m
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-04033: Insufficient memory to grow pool

SQL> alter system set java_pool_size=16m;
SQL> alter system set large_pool_size=4m;

SQL> show parameter pool_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
global_context_pool_size             string
java_pool_size                       big integer            16M
large_pool_size                      big integer            4M
olap_page_pool_size                  big integer            0
shared_pool_size                     big integer            72M
streams_pool_size                    big integer            0

SQL> show parameter log_buffer

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- -------------------
log_buffer                           integer                29276

SQL> alter system set log_buffer=4m;

alter system set log_buffer=4m
                 *
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified         

SQL> !vi $ORACLE_HOME/dbs/inittestdb.ora

# 다음 파라미터를 가장 마지막 라인에 추가하세요.

log_buffer = 4194304

SQL> startup force

=================================
 spfile을 사용할 경우
=================================

(1) spfile 생성 : 반드시 pfile이 있어야 가능

SQL> !ls -l $ORACLE_HOME/dbs

-rw-r-----  1 oracle oinstall      3584  1월 14 09:56 spfileorcl.ora
-rw-r--r--  1 oracle oinstall       399  1월 14 11:54 inittestdb.ora

SQL> select instance_name from v$instance;

INSTANCE_NAME
--------------------------------
testdb

SQL> create spfile from pfile;   --> 기본위치의 기본 pfile로 기본위치에 기본 spfile을 생성

SQL> !ls -l $ORACLE_HOME/dbs

-rw-r-----  1 oracle oinstall      3584  1월 14 09:56 spfileorcl.ora
-rw-r--r--  1 oracle oinstall       399  1월 14 11:54 inittestdb.ora
-rw-r-----  1 oracle oinstall      1536  1월 14 12:09 spfiletestdb.ora

SQL> show parameter spfile

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
spfile                               string

SQL> startup force               --> pfile과 spfile이 모두 있으므로, spfile을 이용해서 startup 된다.

SQL> show parameter spfile

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
spfile                               string                 /u01/app/oracle/product/10.2.0
                                                            /db_1/dbs/spfiletestdb.ora

SQL> show parameter pool_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
global_context_pool_size             string
java_pool_size                       big integer            24M
large_pool_size                      big integer            0
olap_page_pool_size                  big integer            0
shared_pool_size                     big integer            72M
streams_pool_size                    big integer            0

SQL> alter system set java_pool_size=16m;      --> spfile을 이용할 경우 이 명령은 파라미터 파일도 수정한다.
SQL> alter system set large_pool_size=4m;

SQL> startup force              

SQL> show parameter pool_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
global_context_pool_size             string
java_pool_size                       big integer            16M
large_pool_size                      big integer            4M
olap_page_pool_size                  big integer            0
shared_pool_size                     big integer            72M
streams_pool_size                    big integer            0

(2) spfile을 사용하면서 dynamic 파라미터 변경

SQL> alter system set large_pool_size=4m scope=both;        --> both가 디폴트이며 memory와 spfile이 모두 변경된다.
SQL> alter system set large_pool_size=4m scope=memory;      --> memory만 변경된다. 효과는 즉시 발휘된다. 하지만 restartup하면 이 변경은 사라진다.
SQL> alter system set large_pool_size=4m scope=spfile;      --> spfile만 변경된다. 효과는 restarup을 해야 발휘된다.

(3) spfile을 사용하면서 static 파라미터 변경

SQL> alter system set log_buffer = 4194304 scope=both;      --> 에러
SQL> alter system set log_buffer = 4194304 scope=memory;    --> 에러
SQL> alter system set log_buffer = 4194304 scope=spfile;    --> restartup을 해야 한다.

    cf.pfile을 재료로 spfile 생성

      SQL> create spfile='/home/oracle/my.ora' from pfile;               
      SQL> create spfile='/home/oracle/my.ora' from pfile='/etc/day.txt';

    cf.spfile을 재료로 pfile 생성

      SQL> create pfile from spfile;               


===============================================
 원하는 파라미터 파일을 이용해서 starup 하기
===============================================

(1) 원하는 pfile로 시작

SQL> !cp $ORACLE_HOME/dbs/inittestdb.ora /home/oracle/myday.ora

SQL> !vi /home/oracle/myday.ora

  # 다음 파라미터의 값을 100에서 20으로 수정

  processes     = 20

SQL> shutdown abort

SQL> startup pfile='/home/oracle/myday.ora'

SQL> show parameter processes

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------

processes                            integer                20


(2) 원하는 spfile로 시작

SQL> create spfile='/home/oracle/myspday.ora' from pfile='/home/oracle/myday.ora';

SQL> shutdown abort

SQL> startup pfile='/home/oracle/myspday.ora'       -- 에러 : ORA-01078: failure in processing system parameters
SQL> startup spfile='/home/oracle/myspday.ora'      -- 에러 : SP2-0714: invalid combination of STARTUP options

SQL> !vi /home/oracle/a.txt
 
  spfile=/home/oracle/myspday.ora

SQL> startup pfile='/home/oracle/a.txt' 

SQL> show parameter spfile

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
spfile                               string                 /home/oracle/myspday.ora

== 파라미터 파일 ==


1.pfile (text file) : $ORACLE_HOME/dbs/initsid.ora

 Dynamic parameter : java_pool_size, large_pool_size .... : 명령으로 수정 가능   -> 그러나 파라미터 파일에 내용은 변화되지 않는다.
 Static  parameter : log_buffer ...                       : 명령으로 수정 불가능 -> 수정이 필요하면 파라미터 파일을 수정한 뒤 restartup

2.spfile (binary file) : $ORACLE_HOME/dbs/spfilesid.ora  --> persistent(지속) 파라미터 파일

 Dynamic parameter : java_pool_size, large_pool_size .... : 명령으로 수정 가능 -> 파라미터 파일의 내용이 자동으로 수정된다.
 Static  parameter : log_buffer ...                       : 명령으로 수정 가능 -> scope=spfile 옵션을 붙여서 수정한 뒤 restartup

 cf.Startup 할 경우의 파라미터 파일 우선 순위

   SQL> startup         --> $ORACLE_HOME/dbs/spfilesid.ora
                        --> $ORACLE_HOME/dbs/spfile.ora
                        --> $ORACLE_HOME/dbs/initsid.ora
                        --> 에러

   SQL> startup pfile = '/home/oracle/myinit.ora'

##################################################################################################

=================================
 Pfile을 사용할 경우
=================================

SQL> !rm $ORACLE_HOME/dbs/spfiletestdb.ora

SQL> startup force

SQL> show parameter

SQL> show parameter db_cache_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
db_cache_size                        big integer            64M

SQL> show parameter pool_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
global_context_pool_size             string
java_pool_size                       big integer            24M
large_pool_size                      big integer            0
olap_page_pool_size                  big integer            0
shared_pool_size                     big integer            72M
streams_pool_size                    big integer            0

SQL> alter system set large_pool_size=4m;

alter system set large_pool_size=4m
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-04033: Insufficient memory to grow pool

SQL> alter system set java_pool_size=16m;
SQL> alter system set large_pool_size=4m;

SQL> show parameter pool_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
global_context_pool_size             string
java_pool_size                       big integer            16M
large_pool_size                      big integer            4M
olap_page_pool_size                  big integer            0
shared_pool_size                     big integer            72M
streams_pool_size                    big integer            0

SQL> show parameter log_buffer

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- -------------------
log_buffer                           integer                29276

SQL> alter system set log_buffer=4m;

alter system set log_buffer=4m
                 *
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified         

SQL> !vi $ORACLE_HOME/dbs/inittestdb.ora

# 다음 파라미터를 가장 마지막 라인에 추가하세요.

log_buffer = 4194304

SQL> startup force

=================================
 spfile을 사용할 경우
=================================

(1) spfile 생성 : 반드시 pfile이 있어야 가능

SQL> !ls -l $ORACLE_HOME/dbs

-rw-r-----  1 oracle oinstall      3584  1월 14 09:56 spfileorcl.ora
-rw-r--r--  1 oracle oinstall       399  1월 14 11:54 inittestdb.ora

SQL> select instance_name from v$instance;

INSTANCE_NAME
--------------------------------
testdb

SQL> create spfile from pfile;   --> 기본위치의 기본 pfile로 기본위치에 기본 spfile을 생성

SQL> !ls -l $ORACLE_HOME/dbs

-rw-r-----  1 oracle oinstall      3584  1월 14 09:56 spfileorcl.ora
-rw-r--r--  1 oracle oinstall       399  1월 14 11:54 inittestdb.ora
-rw-r-----  1 oracle oinstall      1536  1월 14 12:09 spfiletestdb.ora

SQL> show parameter spfile

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
spfile                               string

SQL> startup force               --> pfile과 spfile이 모두 있으므로, spfile을 이용해서 startup 된다.

SQL> show parameter spfile

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
spfile                               string                 /u01/app/oracle/product/10.2.0
                                                            /db_1/dbs/spfiletestdb.ora

SQL> show parameter pool_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
global_context_pool_size             string
java_pool_size                       big integer            24M
large_pool_size                      big integer            0
olap_page_pool_size                  big integer            0
shared_pool_size                     big integer            72M
streams_pool_size                    big integer            0

SQL> alter system set java_pool_size=16m;      --> spfile을 이용할 경우 이 명령은 파라미터 파일도 수정한다.
SQL> alter system set large_pool_size=4m;

SQL> startup force              

SQL> show parameter pool_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
global_context_pool_size             string
java_pool_size                       big integer            16M
large_pool_size                      big integer            4M
olap_page_pool_size                  big integer            0
shared_pool_size                     big integer            72M
streams_pool_size                    big integer            0

(2) spfile을 사용하면서 dynamic 파라미터 변경

SQL> alter system set large_pool_size=4m scope=both;        --> both가 디폴트이며 memory와 spfile이 모두 변경된다.
SQL> alter system set large_pool_size=4m scope=memory;      --> memory만 변경된다. 효과는 즉시 발휘된다. 하지만 restartup하면 이 변경은 사라진다.
SQL> alter system set large_pool_size=4m scope=spfile;      --> spfile만 변경된다. 효과는 restarup을 해야 발휘된다.

(3) spfile을 사용하면서 static 파라미터 변경

SQL> alter system set log_buffer = 4194304 scope=both;      --> 에러
SQL> alter system set log_buffer = 4194304 scope=memory;    --> 에러
SQL> alter system set log_buffer = 4194304 scope=spfile;    --> restartup을 해야 한다.

    cf.pfile을 재료로 spfile 생성

      SQL> create spfile='/home/oracle/my.ora' from pfile;               
      SQL> create spfile='/home/oracle/my.ora' from pfile='/etc/day.txt';

    cf.spfile을 재료로 pfile 생성

      SQL> create pfile from spfile;               


===============================================
 원하는 파라미터 파일을 이용해서 starup 하기
===============================================

(1) 원하는 pfile로 시작

SQL> !cp $ORACLE_HOME/dbs/inittestdb.ora /home/oracle/myday.ora

SQL> !vi /home/oracle/myday.ora

  # 다음 파라미터의 값을 100에서 20으로 수정

  processes     = 20

SQL> shutdown abort

SQL> startup pfile='/home/oracle/myday.ora'

SQL> show parameter processes

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------

processes                            integer                20


(2) 원하는 spfile로 시작

SQL> create spfile='/home/oracle/myspday.ora' from pfile='/home/oracle/myday.ora';

SQL> shutdown abort

SQL> startup pfile='/home/oracle/myspday.ora'       -- 에러 : ORA-01078: failure in processing system parameters
SQL> startup spfile='/home/oracle/myspday.ora'      -- 에러 : SP2-0714: invalid combination of STARTUP options

SQL> !vi /home/oracle/a.txt
 
  spfile=/home/oracle/myspday.ora

SQL> startup pfile='/home/oracle/a.txt' 

SQL> show parameter spfile

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
spfile                               string                 /home/oracle/myspday.ora