Search

'Java'에 해당되는 글 28건

  1. 2009.01.08 [log4j] 사용례
  2. 2009.01.06 CLASSPATH
  3. 2007.11.27 [JDBC] 06 PL/SQL
  4. 2007.11.27 [JDBC] 05 ResultSet
  5. 2007.11.27 [JDBC] 04 JDBC - Connection Pool...
  6. 2007.11.27 [JDBC] 03 3일째
  7. 2007.11.27 [JDBC] 02 2일째
  8. 2007.11.27 [JDBC] 01 JDBC 시작

[log4j] 사용례

프로그래밍/Library 2009. 1. 8. 17:12 Posted by galad
패턴에 따른 로그의 예
1.
log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

2009-01-08 16:27:37,464 ERROR [main] xml.XMLMain       ( XMLMain.java:165)     - JOURNALREQ03.xml XML 파일 전송 실패

2.
log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} %3x - %m%n

2009-01-08 16:35:14,335 INFO  [main] xml.XMLMain           - ===== 프로그램 종료 =====


로그 레벨 순서

OFF/FATAL/ERROR/WARN/INFO/DEBUG/TRACE/ALL의 순서. 맞나???

CLASSPATH

프로그래밍/Java 2009. 1. 6. 17:44 Posted by galad
http://www.ibm.com/developerworks/kr/library/j-classpath-windows/index.html

E:\workspace\java_run_test>javac -verbose -d bin -sourcepath src src\test\xml\XMLMain.java

jdk설치 디렉\jre\lib\ext에 넣어둔 라이브러리도 참조해버렸다...
dom4j관련 에러가 나야 정상일 듯 싶은데...

역시나 jdk설치 디렉\jre\lib\ext에 넣었던 dom4j 관련 라이브러리 삭제 후 실행했더니 에러 발생.
그래서 다음과 같이 해봤더니,

E:\workspace\java_run_test>javac -verbose -d bin -sourcepath src -classpath E:\workspace\java_run_test\Lib src\test\xml\XMLMain.java

E:\workspace\java_run_test\Lib 여기에 dom4j관련 라이브러리가 있는데도 에러가 난다.
왜 그런가 봤더니
"완전하고, 개별적으로 컴파일 된 서드 파티 라이브러리를 사용하지 않는 경우를 가정했다. 만약 그렇다면, 이들을 classpath에도 추가해야 한다. 라이브러리는 junit.jar 또는 icu4j.jar 같은 JAR 파일로 배포된다. 이 경우, classpath에 추가하는 것은, JAR 파일 그 자체이다. 이것을 포함하고 있는 디렉토리가 아니다." - from IBM(위의 링크 참조)
랜다.

서드 파티 라이브러리 사용시엔 jar파일 자체를 추가해야 된단 말인가라고 생각하여

E:\workspace\java_run_test>javac -verbose -d bin -sourcepath src -classpath E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar src\test\xml\XMLMain.java

로 했더니 깔끔하게 컴파일되었다.
음. 나름 이 업계서 먹고 살아왔는데도 기본을 잘 모르는군... 반성 반성...

이제 남은 건 실행.
bin폴더에 컴파일했으므로 bin폴더로 이동해서 다음과 같이 실행

E:\workspace\java_run_test\bin>java test.xml.XMLMain

당연히 될리 없다. dom4j관련 라이브러리 참조를 위해 classpath 지정

E:\workspace\java_run_test\bin>java -classpath E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar test.xml.XMLMain

왠걸. 에러다.
Exception in thread "main" java.lang.NoClassDefFoundError: test/xml/XMLMain
Caused by: java.lang.ClassNotFoundException: test.xml.XMLMain
        at java.net.URLClassLoader$1.run(Unknown Source)

현재 지정된 클래스패스에서 test.xml.XMLMain를 못찾고 있다. 컴파일 타겟인 bin폴더를 지정안했으니 당연한 것인가라고 생각해서 다시 시도

E:\workspace\java_run_test\bin>java -classpath bin;E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar test.xml.XMLMain

역시 에러. bin폴더에서 bin을 지정하고 있으니 문젠가 싶어서 상위 폴더로 이동 후 재실행

E:\workspace\java_run_test>java -classpath bin;E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar test.xml.XMLMain

옷. 된다. (사실 또다른 라이브러리가 필요해서 에러가 발생했으나 문제는 파악되었으니 무시무시)

이게 완성된 실행문

E:\workspace\java_run_test>java -classpath bin;E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar;E:\workspace\java_run_test\Lib\jaxen-1.1-beta-6.jar test.xml.XMLMain
java.net.ConnectException: Connection refused: connect --> 에러났으나 실행은 되었으니까 무시.

결론

javac -verbose -d bin(타겟 디렉토리) -sourcepath src(소스 디렉토리) -classpath E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar(컴파일에 필요한 서드 파티 라이브러리의 경우 디렉토리path가 아닌 fie path) src\test\xml\XMLMain.java(실제 컴파일할 자바 소스-main()이 있는 클래스만 해도 연관된 것은 자동으로)


java -classpath bin;E:\workspace\java_run_test\Lib\dom4j-1.6.1.jar;E:\workspace\java_run_test\Lib\jaxen-1.1-beta-6.jar(실행 시 필요한 서드 파티 라이브러리&컴파일된 class파일이 있는 디렉토리) test.xml.XMLMain(실행시킬 풀 클래스명)

[JDBC] 06 PL/SQL

프로그래밍/DB 2007. 11. 27. 14:05 Posted by galad

★ PL/SQL 간단 예제

SQL> ed an_1             // an_1.sql을 생성해서 간단한 PL/SQL문을 작성한다.


// 넘버 2개를 입력받아 첫번째 넘버에 해당하는 데이터의 age를 2배하여

// 두번째 넘버에 해당하는 데이터의 age에 넣는다.


accept a_one_num prompt '검색할 넘버는? '
accept a_two_num prompt '갱신할 넘버는? '

declare
   v_one_age NUMBER;    // 변수 이름이 먼저 온다. ㅡ.ㅡ;;
begin
   select age into v_one_age from test10_tbl where num = &a_one_num;
   update test10_tbl set age = (2 * v_one_age ) where num = &a_two_num;
end;


!!! 주의

첫번째 넘버로 검색했을 때, 데이터가 여러개가 나오면 에러 발생

"실제 인출은 요구된 것보다 많은 수의 행을 추출합니다"

-> 루프문으로 해결해야 한다.


★ 간단 예제2

SQL> ed an_2             // an_2.sql을 생성해서 간단한 PL/SQL문을 작성한다.


set echo off   // 에코 없애기
set verify off   // 마찬가지


accept a_sal prompt '얼마 원해?'
variable v_result varchar2(40);


declare
   v_sal number := &a_sal;
begin
   if(v_sal > 500) then
      :v_result := '진짜야? 짤리고 싶어?';
   elsif(v_sal > 300) then                      // else if 가 아니다 ㅡ.ㅡ;;
      :v_result := '그래? 일 열심히 했어?';
   else
      :v_result := '그거 가지고 괜찮아?';
   end if;
end;
/


print v_result   // 결과 출력


set verify on
set echo on



★ 프로시져 간단 예제

- empno를 입력받아 그 사람의 sal을 a_sal 로 돌려준다.


create or replace procedure proc1(a_empno in number, a_sal out number)
is
begin
   select sal into a_sal from emp where empno = a_empno;
end;
/


show errors   // 오류가 있나 체크



// 오라클 서버에 저장이 되어서 나중에 간단하게 실행시킬 수 있다.


SQL> variable v_salary number;      // 변수 선언?? - 결과값을 받는다.
SQL> exec proc1(7566, :v_salary);  // 프로시져 실행


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


SQL> print v_salary;   // 결과값 출력


  V_SALARY
----------
      2975


'프로그래밍 > DB' 카테고리의 다른 글

[펌] PL/SQL 02  (0) 2007.11.27
[Oracle/펌] PL/SQL 01  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 04 JDBC - Connection Pool...  (0) 2007.11.27
[JDBC] 03 3일째  (0) 2007.11.27

[JDBC] 05 ResultSet

프로그래밍/DB 2007. 11. 27. 13:58 Posted by galad

★ ResultSet

DB에 JDBC 드라이버를 이용하여 SQL의 수행을 요청하고 결과를 받아 내는 인터페이스이다.
JDBC 2.0 API에는 SQL 수행 결과를 스크롤되는 ResultSet으로도 저장할 수 있도록 한다.
 
next() - 다음 데이터
previous() - 이전 데이터
first() - 맨 처음 데이터
last() - 맨 마지막 데이터
beforeFirst()  - 제일 처음 위치
afterLast() - 맨 마지막 위치
absolute(int row) - 절대 위치로 간다. 시작부터 계산해서 row행으로.
relative(int row)  - 현재 위치를 기준으로 이동한다.
                                    현재 위치 + row행으로.
deleteRow()
insertRow()
  updateRow()
……
……
 
ScrollableResultSet :
     ResultSet을 스크롤 가능하게 만들어 커서를 원하는 레코드로 옮길 수도 있다.(JDBC 2.0)

UpdateableResultSet :
     ResultSet에서의 데이터 변경을 데이터베이스에 반영하도록 하는 기능을 제공.(JDBC 2.0)
 
 ■ ResultSet.TYPE_SCROLL_SENSITIVE
     ResultSet스크롤 가능하며 업데이트가 발생하면 바로 데이터베이스에 반영된다.

 ■ ResultSet.TYPE_SCROLL_INSENSITIVE
     ResultSet스크롤 가능하며 업데이트가 발생해도 데이터베이스에 반영되지 않는다.

 ■ ResultSet.TYPE_FORWARD_ONLY
     ResultSet 스크롤이 되지 않으며 다음 Row만 진행된다.
        Default값.

 ■ ResultSet.CONCUR_UPDATABLE
     ResultSet에서 데이터 변경을 가능하도록 설정한다.

 ■ ResultSet.CONCUR_READ_ONLY
     ResultSet에서 데이터 변경을 불가능하고 조회만 가능하도록 설정한다.
        Default값.
 
 


/******************************************************************************
*   파일      : RS_Scroll.java
*   용도      : ResultSet 을 Scroll 가능하게 해서 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 07. 27
*   Version : 1.0
******************************************************************************/

package ResultSet;

import java.sql.*;

import ConnectionPool.DBConnectionMgr;

public class RS_Scroll
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        DBConnectionMgr mgr = DBConnectionMgr.getInstance();
       
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select * from test10_tbl";
       
        try
        {
            conn = mgr.getConnection();
            pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,

                                                         ResultSet.CONCUR_UPDATABLE);
            /*
             * ResultSet_Type                       ResultSet_Concurrency
             * TYPE_FORWARD_ONLY              CONCUR_READ_ONLY
             * TYPE_SCROLL_INSENSITIVE       CONCUR_UPDATABLE
             * TYPE_SCROLL_SENSITIVE
             */
           
            rs = pstmt.executeQuery();
           
            // rs를 맨 위에서부터 순차적으로 탐색한다.
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                             + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            System.out.println("순차탐색 끝");
           
            // rs가 afterLast에 있지않으면 - afterLast로 보낸다.
            if(rs.isAfterLast())
                rs.afterLast();
           
            // rs를 맨 밑에서부터 역순으로 탐색한다.
            while(rs.previous())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                             + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
           
            System.out.println("역순탐색 끝");
           
            // rs를 5번째 행으로 보낸다. 절대위치로 이동
            rs.absolute(5);
           
            // 5번으로 이동한 후, 그 이전 것 즉, 4번부터 출력한다.
            while(rs.previous())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                             + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            System.out.println("절대위치로 이동후, 역순으로 탐색 끝");
           
            // 맨 위로 이동해 있는 rs를 상대적으로 이동시키려 했으나, 오류 발생
            // java.sql.SQLException: 현재 행이 아닙니다: relative - 맨 위로 이동해서 현재 위치가

            // beforeFirst라서 데이터가 없으므로 상대적으로 이동불가
            // 따라서 rs.next를 해서 데이터가 있는 곳으로 간 뒤, 상대적으로 이동시킨다.
            rs.next();           // 현재 위치 1번.
            rs.relative(7);     // 상대적으로 7칸 이동. 현재 위치 8번
            rs.relative(-3);    // 다시 위로 3칸 이동. 현재 위치 5번.
           
            // 5번 다음 것부터 출력하므로 6번부터 나온다.
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                             + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
           
            pstmt.close();
            conn.close();
            mgr.freeConnection(conn);
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}


★ ResultSet의 TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE, 

    CONCUR_UPDATABLE에 대해서


① stmt1(Statement개체)이 ResultSet을 INSENSITIVE, UPDATABLE로 생성한 후, 사용하는 경우

stmt1은 rs를 통해서 DB를 업데이트 할 수 있다.

하지만, stmt2(즉 다른 사용자라고도 볼 수 있는)가 DB를 바꾸었을 때, 그 바뀐 내용을 가져오지는못한다.

그래서

② SENSITIVE 옵션이 필요하다.

SENSITIVE 옵션을 주어 생성한 rs는 변경된 DB의 내용을 가져올 수 있다.

하지만, refreshRow() 메소드는 각 행별로 변경된 내용을 가져오므로, 미리 가져와서 사용하고 있는 rs의 행의 수와 변경된 DB의 행의 수가 다를 경우에는 문제가 생긴다.



/******************************************************************************
*   파일      : RS_InDel.java
*   용도      : ResultSet을 Update가능하게 해서 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 07. 27
*   Version : 1.0
******************************************************************************/

package ResultSet;

import java.sql.*;

import ConnectionPool.DBConnectionMgr;

public class RS_InDel
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        DBConnectionMgr mgr = DBConnectionMgr.getInstance();
       
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select num, id, name, age from test10_tbl";
       
        try
        {
            conn = mgr.getConnection();
            pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,

                                                         ResultSet.CONCUR_UPDATABLE);
            /*
             * ResultSet_Type                       ResultSet_Concurrency
             * TYPE_FORWARD_ONLY              CONCUR_READ_ONLY
             * TYPE_SCROLL_INSENSITIVE       CONCUR_UPDATABLE
             * TYPE_SCROLL_SENSITIVE
             */
           
            rs = pstmt.executeQuery();
       
            // String sql = "select * from test10_tbl";

            // - 데이터를 추가하기 위해서는 컬럼명을 직접 입력해줘야 한다.
            // 이렇게 *로 하면 인식 못한다.
            // 데이타 추가 ------------------------------------------------------

            // 데이터를 추가하기 위해서 데이터 추가가 가능한 ROW로 이동. 맨 밑.
            rs.moveToInsertRow();      
            rs.updateInt (1, 1001);
            rs.updateString (2, "ID44");
            rs.updateString (3, "JUNG");
            rs.updateInt (4, 71);
            rs.insertRow();     // 데이터를 추가한다. DB도 변경된다.
           
            rs.moveToInsertRow();
            rs.updateInt (1, 1002);
            rs.updateString (2, "ID66");    // 2번까지만 넣어주면, 나머지는 이전에 사용했던 것들,
                                                     // 즉 (3, JUNG), (4, 71) 값이 들어가게 된다.
            rs.insertRow();
                   
            //rs.close ();  // 여기서 close 해버리면 밑에서 rs를 다시 얻기 전에는 사용불가.
            //------------------------------------------------------------------
           
            System.out.println ("데이타 추가 후 =============");
           
            System.out.println ("지금 쓰고 있는 rs의 내용-----");
            rs.beforeFirst();
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                           + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            // rs는 변경되었고 UPDATABLE 옵션이 있었으므로 DB도 변경되었다.
           
            rs.close ();
           
            System.out.println ("DB의 내용을 다시 받아온다.-----");
            rs = pstmt.executeQuery();
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                           + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            // DB의 내용이 변경된 것을 볼 수 있다.
           
            // 데이타 삭제 -----------------------------------------------------
            if (!rs.isBeforeFirst())   
            {
                rs.beforeFirst();
            }
           
            while (rs.next())  
            {
                if (rs.getInt(1) == 1001)
                {
                    rs.deleteRow();
                    break;
                }
            }
            //rs.close ();
            //-----------------------------------------------------------------
           
            System.out.println ("데이타 삭제 후============ ");
           
            System.out.println ("지금 쓰고 있는 rs의 내용-----");
            rs.beforeFirst();
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                            + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            // 역시 마찬가지로 rs는 변경되었고 UPDATABLE 옵션이 있었으므로 DB도 변경되었다.
           
            //rs.close ();
           
            System.out.println ("DB의 내용을 다시 받아온다.-----");
            rs = pstmt.executeQuery();
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                            + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            // DB의 내용이 변경된 것을 볼 수 있다.
           
            // 테이블 원상태로 복원 -------------------------------------------
            // 새롭게 생성한 stmt1이 DB의 내용을 변경한다.
            // 이렇게 변경된 DB의 내용은 지금은 rs에 반영할 수 없다. SENSITIVE 옵션이 없으므로.
            // 하지만 stmt가 사용하던 rs의 내용이 변경되지 않았다고 하더라도

            // DB는 이미 변경된 상태이므로
            Statement stmt1 = conn.createStatement ();
            stmt1.execute("DELETE FROM test10_tbl WHERE num=1001 OR num=1002");
            //stmt1.execute("COMMIT");
            stmt1.close();
           
            System.out.println ("데이타 복원 후============ ");

            System.out.println ("지금 쓰고 있는 rs의 내용-----");
            rs.beforeFirst();
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                            + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            // stmt가 사용하던 rs의 내용은 그대로이다.
           
            rs.close ();
           
            System.out.println ("DB의 내용을 다시 받아온다.-----");
            rs = pstmt.executeQuery();
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                            + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            // stmt1이 변경한 이후의 DB의 내용이 새롭게 rs에 들어간다.
            // stmt1이 변경한 값이 DB에 반영되어 있는 것을 알 수 있다.
           
            pstmt.close();
            conn.close();
            mgr.freeConnection(conn);
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

'프로그래밍 > DB' 카테고리의 다른 글

[Oracle/펌] PL/SQL 01  (0) 2007.11.27
[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 04 JDBC - Connection Pool...  (0) 2007.11.27
[JDBC] 03 3일째  (0) 2007.11.27
[JDBC] 02 2일째  (0) 2007.11.27

[JDBC] 04 JDBC - Connection Pool...

프로그래밍/DB 2007. 11. 27. 13:55 Posted by galad

★ 처음에 DB에 접속하는 과정이 가장 부하가 많이 걸린다.

getConnection() 할 때 부하가 가장 크다. 그래서 나온게 Connection Pool.


Connection Pool 이란, DB에 접근할 때마다 연결을 했다 끊었다 하는게 아니라,

자바 프로그램에서 미리 몇 개의 연결을 해 놓은 후 - 이게 Connection Pool -

필요할 때마다 Pool에서 연결을 빌려와서 사용한 후, 다시 돌려준다. - 끊는게 아니다.


Pool을 너무 크게 해놓으면 - 연결을 너무 많이 해 놓으면 - 메모리의 소모가 크고,

너무 적게 해놓으면 대기하는 시간이 길어진다.

적당한 크기로 설정해야 한다. 웹사이트에 걸리는 부하에 따라 조정해야 한다.


★ Connection Pool 을 사용하는 방법

① 인터넷 상에 공개된 소스

  DBConnectionMgr.java - 별로라는데...?

② Oracle Connection Pool

  오라클에서 제공하는 드라이버에만 있는 것. 오라클에 쓰기에는 좋다.

③ Tomcat WAS - DBCP


/*******************************************************************************************
*   파일        : DBConnectionPoolClient.java
*   용도        : 오라클이 제공하는 ConnectionPool을 사용한 예제
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

package ConnectionPool;

import java.sql.*;

import javax.sql.*; // 오라클의 Connection Pool 기능은 여기에 들어있다.
import oracle.jdbc.driver.*;
import oracle.jdbc.pool.*;

public class DBConnectionPoolClient
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        try
        {
            OracleConnectionPoolDataSource ocpds = new OracleConnectionPoolDataSource();
           
            ocpds.setURL("jdbc:oracle:thin:@61.109.232.128:1521:ora92");
            ocpds.setUser("scott");
            ocpds.setPassword("tiger");
           
            // Connection Pool 생성
            PooledConnection pc = ocpds.getPooledConnection();
           
            Connection con = null;
            PreparedStatement pstmt = null;
            String sql = "select * from emp";
            ResultSet rs = null;
           
            // 강제로 무한루프 - Connection Pool을 테스트한다.
            while(true)
            {
                // Pool 에서 하나 빌려온다.
                con = pc.getConnection();
                pstmt = con.prepareStatement(sql);
                rs = pstmt.executeQuery(); //질의문 수행
               
                while (rs.next())
                {
                    String str = "empno: " + rs.getInt("empno") + "\t"

                                  + "ename: " + rs.getString("ename");
                   
                    System.out.println(str);
                }
               
                // close지만 실제로 연결을 끊는게 아니라 Pool에 돌려준다.
                con.close();
            }
        }
        catch(Exception e)
        {}

    }

}



/*******************************************************************************************
*   파일        : DBConnectionPoolClient.java
*   용도        : 오라클이 제공하는 ConnectionPool을 사용한 예제와
*                   인터넷에서 구할 수 있는 Connection Pool을 관리해주는 클래스인 DBConnectionMgr을 이용한 예제
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

package ConnectionPool;

import java.sql.*;
import javax.sql.*; // 오라클의 Connection Pool 기능은 여기에 들어있다.
import oracle.jdbc.driver.*;
import oracle.jdbc.pool.*;

public class DBConnectionPoolClient
{
    // Oracle Connection Pool을 쓸 것인가 DBConnectionMgr Class를 쓸 것인가
    public static final boolean IsUsedOCPDS = false;

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        OracleConnectionPoolDataSource ocpds = null;
        PooledConnection pc = null;
       
        DBConnectionMgr mgr = null;
       
        Connection conn = null;
        PreparedStatement pstmt = null;
        String sql = "select * from member";
        ResultSet rs = null;
       
        try
        {
            if(IsUsedOCPDS)
            {
                ocpds = new OracleConnectionPoolDataSource();
               
                ocpds.setURL("jdbc:oracle:thin:@61.109.232.128:1521:ora92");
                ocpds.setUser("lonelycat");
                ocpds.setPassword("ora123");
               
                // Connection Pool 생성
                pc = ocpds.getPooledConnection();
            }
            else
            {
                mgr = DBConnectionMgr.getInstance();
            }
           
            // 강제로 무한루프 - Connection Pool을 테스트한다.
//            while(true)
//            {
                if(IsUsedOCPDS)
                {

                    // Pool 에서 하나 빌려온다.
                    conn = pc.getConnection();
                }
                else
                {
                    conn = mgr.getConnection();
                }
               
                pstmt = conn.prepareStatement(sql);
                rs = pstmt.executeQuery(); //질의문 수행
               
                while (rs.next())
                {
                    String str = "ID: " + rs.getString("id") + "\t" + "Name: " + rs.getString("name");
                   
                    System.out.println(str);
                }
               
                // close지만 실제로 연결을 끊는게 아니라 Pool에 돌려준다.
                conn.close();
               
                if(!IsUsedOCPDS)
                    mgr.freeConnection(conn);
//            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

}


★ 파일명이 이상하게 들어갔지만, 원래 이름은

Pool.properties

DBConnectionMgr.java

이다.

'프로그래밍 > DB' 카테고리의 다른 글

[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 03 3일째  (0) 2007.11.27
[JDBC] 02 2일째  (0) 2007.11.27
[JDBC] 01 JDBC 시작  (0) 2007.11.27

[JDBC] 03 3일째

프로그래밍/DB 2007. 11. 27. 13:55 Posted by galad

★ 다음과 같이 하지 말 것!!!

SQL> select * from emp;

SQL> SELECT * from emp;

SQL> Select * from Emp;


-> 결과는 모두 같다. 그러나, 오라클 서버에 걸리는 부하가 커진다.


SQL> select * from emp;

-> 이걸 실행하면 오라클 서버는 임시 메모리 버퍼에 이 명령에 대한 결과를 저장한다.

-> 그래서 다음번에 같은 명령이 내려오면

SQL> select * from emp;

-> 원래 갖고 있던 결과를 보여준다.


그러나 위의 경우와 같이 대소문자가 섞이면, 각각 다른 명령으로 인식하여 부하가 커지게 된다.


★ createStatement, prepareStatement

최근에는 createStatement 를 사용하지 않는다.

prepareStatement 를 사용하면 오라클에 이미 저장되어 있는 명령어의 경우에는 그 결과를 가져오고 없을 경우에는 새로 결과를 만들어내므로, 항상 결과를 새로 만들어내는 createStatement 보다 오라클 서버에 걸리는 부하가 적다.


PreparedStatement 클래스의 객체는 Statement 클래스와는 다르게 객체를 생성하면서 기준 Query를 만들어 둔다. 이것은 동적 Query의 기초가 되는 것임과 동시에 하나의 특정 Query에 대해 조건만 바뀐 상태의 빠른 실행을 만들어 줄 수 있다. 필요한 부분을 "?"로 체크한 후 원하는 값을 해당 위치에 배치할 수 있다.


/*******************************************************************************************
*   파일        : BatchTest.java
*   용도        : addBatch, executeBatch 의 테스트
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version     : 1.0
*******************************************************************************************/

import java.sql.*;

public class BatchTest
{
 /**
  * @param args
  */
 public static void main(String[] args)
 {
  // TODO Auto-generated method stub
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
       
        // 실제 현장에서는 url, id, pw 등을 텍스트 파일로 저장해 놓고,
        // 그걸 읽어와서 사용하는 방식으로 한다.
        String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
        String id = "lonelycat";
        String pw = "ora123";
       
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection(url, id, pw);
            stmt = con.createStatement();
           
            rs = stmt.executeQuery("select * from test10_tbl");
            while(rs.next())
            {
                String strTemp = rs.getInt("num") + "\t";
                strTemp += rs.getString("id") + "\t";
                strTemp += rs.getString("name") + "\t";
                strTemp += rs.getInt("age");
               
                System.out.println(strTemp);
            }
           
            // Batch에 실행할 SQL문을 저장한다. 실행은 하지 않는다. 할 작업만 모아 놓는다.
            stmt.addBatch("insert into test10_tbl values(11, 'test01', '김종식', 20)");
            stmt.addBatch("insert into test10_tbl values(21, 'test02', '이종식', 21)");
            stmt.addBatch("insert into test10_tbl values(31, 'test03', '삼종식', 22)");
            stmt.addBatch("insert into test10_tbl values(41, 'test04', '사종식', 23)");
           
            // 위에서 모아놓은 작업을 한꺼번에 실행한다.
            // int[] batchCnt 에는 변경된 행의 수가 차례로 저장된다. 여기서는 1, 1, 1, 1.
            int[] batchCnt = stmt.executeBatch();
           
            System.out.println("-----------------배치 작업 이후의 테이블 정보-------------");
           
            rs = stmt.executeQuery("select * from test10_tbl");
            while(rs.next())
            {
                String strTemp = rs.getInt("num") + "\t";
                strTemp += rs.getString("id") + "\t";
                strTemp += rs.getString("name") + "\t";
                strTemp += rs.getInt("age");
               
                System.out.println(strTemp);
            }
           
            for(int i =0; i < batchCnt.length; i++)
                System.out.println(batchCnt[i]);
           
            stmt.close();
            con.close();           
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
 }

}


/*******************************************************************************************
*   파일        : ExecuteTest.java
*   용도        : execute 의 테스트
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version     : 1.0
*******************************************************************************************/

import java.sql.*;
import java.io.*;
import java.net.*;

public class ExecuteTest{
  public static void main (String args [])  {
   Connection conn = null;
   Statement stmt = null;
   ResultSet rs = null;
   String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
   String id = "tikle00";
   String pw = "tikle1234";
 try{
  Class.forName ("oracle.jdbc.driver.OracleDriver");
  conn = DriverManager.getConnection(url,id,pw);  
  stmt = conn.createStatement ();

  System.out.println("다음 중 작업을 선택하세요.");
  System.out.println("1. select * from test10_tbl;");
  System.out.println("2. insert into test10_tbl values(11,'test99','김종식',22);");

        // System.in 만으로는 1byte만 받으므로, 한글 등의 입력이 불가
        // InputStreamReader 가 1byte로 입력받은 것을 2bytes로 바꿔주므로, 한글 입력도 가능
        // BufferedReader 는 데이터를 모아서 한꺼번에 처리해준다. 속도의 비약적인 향상
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  String choice = br.readLine();

  String sql=null;

  if(choice.equals("2")){
   sql="insert into test10_tbl values(11,'test99','김종식',22)";
  }
  else {
   sql="select * from test10_tbl";
  }

        // insert, create 등은 executeUpdate() 를 통해서 실행해야하고,
        // select 문은 executeQuery() 를 통해서 실행해야 하므로,
        // 어떤게 실행될 지 모르는 지금은 둘 다 실행할 수 있는 execute() 를 통해서 실행한다.
  boolean result = stmt.execute(sql);
        // execute() 의 결과로는, select 문이 실행되었을 경우 true,
        // 그 외의 문이 실행되었을 경우에는 false 가 반환된다.
  // 따라서 result 가 true 면 select 문이 실행되어 그 결과가 있으므로 rs를 통해서 결과를 출력한다.
  if(result) {
   System.out.println("조회 결과는 다음과 같습니다.");
   rs = stmt.getResultSet();
   while (rs.next()) {//ResultSet의 각 레코드행 이동
    String s=rs.getString("num")+"\t";
    s += rs.getString("id")+"\t";
    s += rs.getString("name")+"\t";
    s += rs.getString("age");

    System.out.println(s);
      }
     }else {
   System.out.println("변경된 행의 수는 : " + stmt.getUpdateCount());
  }
 }catch(SQLException e){
  e.printStackTrace();
 }catch(Exception e){
  e.printStackTrace();
 }
  }
}


/*******************************************************************************************
*   파일        : SelectPreTest.java
*   용도        : preparedStatment 의 테스트
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

import java.sql.*;

public class SelectPreTest{
 public static void main (String args []) {
  if(args.length < 1){
   System.out.println("검색할 num 조건을 입력하세요.");
   return;
  }

  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
  String id = "lonelycat";
  String pw = "ora123";
  try{
   Class.forName ("oracle.jdbc.driver.OracleDriver");
        conn = DriverManager.getConnection(url,id,pw);
   
   pstmt = conn.prepareStatement( "select * from test10_tbl where num >= ?");
   pstmt.setInt(1,Integer.parseInt(args[0]));
   
   rs=pstmt.executeQuery();

   while(rs.next()){
    System.out.println(rs.getInt("num") + " : " + rs.getString("id") + " : " + rs.getString("name") + " : " + rs.getInt("age"));
   }
   pstmt.close();
   conn.close();
  } catch (SQLException e){
   e.printStackTrace();
  } catch (ClassNotFoundException e){
   e.printStackTrace();
  } catch (Exception e){
   e.printStackTrace();
  }
 }
}


/*******************************************************************************************
*   파일        : Exam04_01.java
*   용도        : preparedStatment 의 테스트
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

import java.sql.*;
 
public class Exam04_01 {
    public static  void main(String[] args){
        Connection conn = null;
     PreparedStatement pstmt = null;
     String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
     String user = "lonelycat";      
     String passwd = "ora123";
 
     try {
        Class.forName("oracle.jdbc.driver.OracleDriver");  
        conn = DriverManager.getConnection(url, user, passwd);
                   
        String sql = "insert into test10_tbl values( ?, ?, ?, ?)";
        pstmt = conn.prepareStatement(sql); //SQL문 전송 객체 생성

        pstmt.setInt(1, 100 ); //데이타 인덱스별 설정
        pstmt.setString(2, "id_temp");
        pstmt.setString(3, "작업맨" );
        pstmt.setInt(4, 30 );

        int result = pstmt.executeUpdate(); //질의문 수행
            
        System.out.println(result + "개의 Data 입력 성공!!");
     }catch(Exception e) {
        System.out.println(e.getMessage());
     }finally {
        try{  if(pstmt != null) pstmt.close();
              if(conn != null)  conn.close();
        }catch(Exception ex) {}
     }
  }    
}// class end



/*******************************************************************************************
*   파일        : SearchZipcode.java
*   용도        : 우편번호 검색 프로그램
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.*;

public class SearchZipcode
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
       
        String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
        String id = "lonelycat";
        String pw = "ora123";
       
        String dong = "";
        String result = "";
        String result2 = "";
        int i = 0;  // vector 용
        Vector dongList = new Vector();
       
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");           
            conn = DriverManager.getConnection(url,id,pw);
           
            pstmt = conn.prepareStatement( "select * from zipcode where dong like ?");
           
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
           
            while(true)
            {
                System.out.print("동 이름을 입력해주세요>>  ");
                dong = br.readLine();
               
                if(dong.length() > 0)
                    break;
            }
           
            pstmt.setString(1,"%" + dong + "%");
           
            rs=pstmt.executeQuery();
           
            // 1차 결과 출력
            while(rs.next())  
            {//ResultSet의 각 레코드행 이동
                result = rs.getInt("SEQ") + "\t"
                        + rs.getString("ZIPCODE").trim() + " "
                        + rs.getString("SIDO").trim() + " "
                        + rs.getString("GUGUN").trim() + " "
                        + rs.getString("DONG").trim() + " "
                        + rs.getString("RI").trim() + " "
                        + rs.getString("BLDG").trim() + " "
                        + rs.getString("ST_BUNJI").trim() + " "
                        + rs.getString("ED_BUNJI").trim();
               
                result2 =   rs.getString("ZIPCODE").trim() + " "
                            + rs.getString("SIDO").trim() + " "
                            + rs.getString("GUGUN").trim() + " "
                            + rs.getString("DONG").trim() + " ";
               
                if(rs.getString("RI") != null)
                    result2 += rs.getString("RI").trim() + " ";
               
                if(rs.getString("BLDG") != null)
                    result2 += rs.getString("BLDG").trim() + " ";
               
                if(rs.getString("ST_BUNJI") != null)
                    result2 += rs.getString("ST_BUNJI").trim() + " ";
               
                if(rs.getString("ED_BUNJI") != null)
                    result2 += rs.getString("ED_BUNJI").trim() + " ";
               
                dongList.add(result2);
               
                System.out.println("" + (++i) + ": " + result);
            }
           
            // 동 선택
            while(true)
            {
                System.out.print("살고 있는 곳을 선택해주세요>>  ");
                dong = br.readLine();
               
                if(dong.length() > 0)
                    break;
            }
           
            // 선택한 동 주소
            i = Integer.parseInt(dong);
           
            // 나머지 주소
            while(true)
            {
                System.out.println("나머지 주소를 입력해주세요>>  ");
                dong = br.readLine();
               
                if(dong.length() > 0)
                    break;
            }
           
            String str = (String)dongList.get(i-1);
            str = str + dong;
           
            System.out.println(str);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

}


'프로그래밍 > DB' 카테고리의 다른 글

[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 04 JDBC - Connection Pool...  (0) 2007.11.27
[JDBC] 02 2일째  (0) 2007.11.27
[JDBC] 01 JDBC 시작  (0) 2007.11.27

[JDBC] 02 2일째

프로그래밍/DB 2007. 11. 27. 13:54 Posted by galad

★ 오라클 서버 설치된 컴퓨터에서 방화벽 설정하기

오라클 서버 기본 포트: 1521

방화벽에서 1521 포트를 열어주더라도 작동을 하지 않는다.

오라클은 기본적으로 1521을 사용하나, 클라이언트가 접속하면 랜덤하게 포트를 설정해서
클라이언트에게 할당한다. 따라서 이 임의의 포트는 방화벽에 막히므로 접속 불가.

그렇다고 방화벽을 열 수도 없는 노릇.

따라서 방화벽 설정 중에서 포트 단위가 아니라, 프로그램 단위로 접속을 허용하게 해 준다.
oracle.exe, tnslsnr.exe(? 암튼 이거 비슷한거)를 열어주면 된다.


★ JDBC에서 내리는 모든 명령어는 Auto Commit 이다.

Create든 Insert든...

Auto Commit 을 막는 설정도 있다고 한다.


/*******************************************************************************************
* 파일  : Exam03_01.java
* 용도  : 오라클 DB에 연결한 후, 테이블을 생성한다.
* 작성자 : 성홍제
* 작성일 : 2006. 07. 24
* Version : 1.0
*******************************************************************************************/


// ① 관련 패키지 임포트
import java.sql.*;


public class Exam03_01
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main (String args[])
    {  
      Connection conn = null;
      Statement stmt = null;
      String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";


      // ② 드라이버 로딩  
      try
      {
         Class.forName("oracle.jdbc.driver.OracleDriver");
      }
      catch(ClassNotFoundException ex1)
      {
         System.out.println("드라이버 로딩 에러 : "+ ex1.toString());
         return;
      }
      catch(Exception ex2)
      {
         System.out.println("DB 접속 실패 : "+ ex2.toString());
         return;
      }


      String sql=
"CREATE TABLE member(id CHAR(10) CONSTRAINT mb_id_pk PRIMARY KEY, pw CHAR(10) CONSTRAINT mb_pw_nn NOT NULL, name VARCHAR2(10) CONSTRAINT mb_name_nn NOT NULL, sex CHAR(1) CONSTRAINT mb_sex_ck CHECK (sex IN ('F', 'M')), ssn NUMBER(13) CONSTRAINT mb_ssn_uk UNIQUE)";
 
      try
      {
         // ③ 오라클 연결
         conn = DriverManager.getConnection(url, "lonelycat", "ora123");
         System.out.println("DB연결 성공");


         // ④ sql 명령문 구문 객체 생성
         stmt=conn.createStatement();
         // ⑤ sql query 실행
         stmt.executeUpdate(sql);

      }
      catch(Exception ex3)
      {
         System.out.println("SQL 문 수행 오류 : "+ ex3.toString());
         return;
      }
      finally
      {
         // ⑥ 연결 객체 반납
         try
         {
            stmt.close();
            conn.close();
         }
         catch(Exception ex4)
         {}
      }
       
   System.out.println("DB 접속 및 SQL 문 수행 성공!");
   }// main end
}//class end



/*******************************************************************************************
* 파일  : Exam03_02.java
* 용도  : 오라클 DB에 연결한 후, Exam03_01에서 생성한 테이블에 데이터를 넣는다.
* 작성자 : 성홍제
* 작성일 : 2006. 07. 24
* Version : 1.0
*******************************************************************************************/

import java.sql.*;


public class Exam03_02
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static  void main(String[] args)
    {
        Connection conn = null;
        Statement stmt = null;
        String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";


        try
        {
           Class.forName("oracle.jdbc.driver.OracleDriver");
        }
        catch(ClassNotFoundException ex1)
        {
            System.out.println("드라이버 로딩 에러 : "+ ex1.toString());
            return;
        }
        catch(Exception ex2)
        {
            System.out.println("DB 접속 실패 : "+ ex2.toString());
            return;
        }
       
        try
        {
            conn = DriverManager.getConnection(url, "lonelycat", "ora123");
            System.out.println("DB연결 성공");
           
            stmt = conn.createStatement();
            String sql =

                  "insert into member values( 'lonelycat', 'ora123', '성홍제', 'M', 7901161069111)";
            System.out.println("SQL : " + sql);
           
            int result = stmt.executeUpdate(sql);
            System.out.println(result + "개의 Data 입력 성공!!");
        }
        catch(Exception e)
        {
            System.out.println("Data 입력 실패!! : " + e.getMessage());
        }
        finally
        {
            try
            {
               if(stmt != null)
                  stmt.close();


               if(conn != null)
                  conn.close();

            }
            catch(Exception ex)
            {}
        }
    }

   
    /*static String toDB(String str) throws UnsupportedEncodingException{
        return new String(str.getBytes("KSC5601"), "8859_1");
    }
   
    static String fromDB(String str) throws UnsupportedEncodingException{
        return new String(str.getBytes("8859_1"), "KSC5601");
    }*/
}// class end



/*******************************************************************************************
* 파일  : Exam03_03.java
* 용도  : 오라클 DB에 연결한 후, Exam03_01에서 생성한 테이블의 데이터를 확인한다.
* 작성자 : 성홍제
* 작성일 : 2006. 07. 24
* Version : 1.0
*******************************************************************************************/

import java.sql.*;

public class Exam03_03
{
    public static  void main(String[] args)
    {
        Connection conn = null;
        Statement stmt = null;
        String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";

        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(url, "lonelycat", "ora123");
        }
        catch(ClassNotFoundException ex1)
        {
            System.out.println("드라이버 로딩 에러 : "+ ex1.toString());
            return;
        }
        catch(Exception ex2)
        {
            System.out.println("DB 접속 실패 : "+ ex2.toString());
            return;
        }

        try{
            stmt = conn.createStatement();
            String sql = "SELECT * FROM member";
            ResultSet rs = stmt.executeQuery(sql);

            while(rs.next())
            {
                String s = rs.getString("id")+ "\t";
                s += rs.getString("pw")+"\t";
                s += rs.getString("name")+"\t";
                s += rs.getString("sex")+"\t";
                s += rs.getLong("ssn");
                System.out.println(s);
            }
        }
        catch(Exception e)
        {
            System.out.println("SELECT 실패! : " + e.getMessage());
        }
        finally
        {
            try
            {   
                if(stmt != null)
                    stmt.close();

                if(conn != null)
                    conn.close();
            }
            catch(Exception ex)
            {
            }
        }
    } // main end
}// class end



/*******************************************************************************************
* 파일  : Exam03_04.java
* 용도  : 오라클 DB에 연결한 후, 입력 받은 id를 이용해서 테이블을 검색한다.
* 작성자 : 성홍제
* 작성일 : 2006. 07. 24
* Version : 1.0
*******************************************************************************************/

// ① 관련 패키지 임포트
import java.io.*;
import java.sql.*;

public class Exam03_04
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main (String args[])
    {  
        Connection conn = null;
        Statement stmt = null;
        String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";

        // id 입력받기
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String id = "";

        try
        {

            System.out.print("ID를 입력해주세요>> ");
            id = in.readLine();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        //System.out.println(id);

        // ② 드라이버 로딩  
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(url, "lonelycat", "ora123");
        }
        catch(ClassNotFoundException ex1)
        {
            System.out.println("드라이버 로딩 에러 : "+ ex1.toString());
            return;
        }
        catch(Exception ex2)
        {
            System.out.println("DB 접속 실패 : "+ ex2.toString());
            return;
        }

        String sql=
        "SELECT * FROM member WHERE id = '" + id.trim() + "'";

        System.out.println(sql);

        try
        {
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            while(rs.next())
            {
                String s = rs.getString("id")+ "\t";
                s += rs.getString("pw")+"\t";
                s += rs.getString("name")+"\t";
                s += rs.getString("sex")+"\t";
                s += rs.getLong("ssn");
                System.out.println(s);
            }
        }
        catch(Exception e)
        {
            System.out.println("SELECT 실패! : " + e.getMessage());
        }
        finally
        {
            // ⑥ 연결 객체 반납
            try
            {
                stmt.close();
                conn.close();
            }
            catch(Exception ex4)
            {}
        }

        System.out.println("DB 접속 및 SQL 문 수행 성공!");
    }// main end
}//class end

'프로그래밍 > DB' 카테고리의 다른 글

[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 04 JDBC - Connection Pool...  (0) 2007.11.27
[JDBC] 03 3일째  (0) 2007.11.27
[JDBC] 01 JDBC 시작  (0) 2007.11.27

[JDBC] 01 JDBC 시작

프로그래밍/DB 2007. 11. 27. 13:53 Posted by galad

DB : Oracle 9i

JAVA : Sdk 1.5.0_06


1. 오라클 설치 후 환경 설정


시스템의 환경변수 설정 화면에서


---\Oracle\jre\1.3.1\bin;

---\Oracle\jre\1.1.8\bin;


을 삭제한다.

오라클 설치 시 인스톨 되는 jre 버젼과 우리가 자바를 설치했을 때 인스톨 한 jre 버젼이

맞지 않아서 생기는 문제를 없앤다.


2. JDBC로 DB에 접속하는 4가지 타입

① Type 1 : JDBC-ODBC Bridge Plus ODBC Driver
  ■ Bridge 방식은 현존하는 DB의 ODBC driver를 그대로 이용하여 JDBC access를 지원하는 module
  ■ ODBC는 각 database client에 install되어 있는 Native code를 사용
  ■ Failure Point 발생 가능성


② Type 2 : Native API
  ■ Native database client library를 이용하여 작성
  ■ Driver는 JDBC 호출을 번역하여 database client library의 API로 변경
  ■ Library는 DBMS provider에 의해 제공
  ■ 플랫폼에 독립적이지 못하므로 플랫폼에 맞는 곳에서만 사용가능


③ Type 3 : JDBC-Net
  ■ Client와 Server사이의 중간에서 통신을 수행
  ■ 중간 Server의 Protocol에 특정적으로 동작 해야 함. JDBC 메소드를 호출해서 DBMS에 독립적인 네트웍 프로토콜로 전환해 주는 드라이버
  ■ No native code model
  ■ DB를 바꾸더라도 Middleware만 교체해주면 된다.
  ■ 주로 규모가 큰 회사에서 사용 - Middleware가 필요하므로 비용이 많이 들어서.


④ Type 4 : Native Protocol
  ■ JDBC 호출을 DBMS에서 사용하는 Network protocol로 곧바로 번역 함
  ■ Client에서 Database로의 direct 호출이 가능
  ■ Best Performance
  ■ 사용하는 DBMS를 변경할 때는 유연하지 못함
  ■ 가장 많이 사용하는 방식.


3. Oracle에서 JDBC를 사용하기 위해서 해주어야 할 일

① 환경변수 - 클래스패스에 D:\Java\jdk1.5.0_06\lib\classes12.zip; 를 추가해주어야 한다.

 classes12.jar 는 JSP에서 사용하고, zip은 자바 응용 프로그램에서 사용하므로 주의!!!


/*******************************************************************************************
* 파일  : Test.java
* 용도  : JDBC 시작
* 작성자 : 성홍제
* 작성일 : 2006. 07. 21
* Version : 1.0
*******************************************************************************************/


// ① 패키지 임포트
import java.sql.*;


public class Test
{
  // Fields
  // Constructor
  // Methods
  // Main

  public static void main(String[] args)
  {
    Connection con = null; // DB가 연결될 때 그 정보를 받는다
    Statement stmt = null; // SQL 명령어를 사용하기 위한 변수
    ResultSet rs = null;  // SQL 명령을 실행한 후, 그 결과를 받기 위한 변수


    System.out.println("지금부터 시작합니다");


    // ② 드라이버 로딩 - 드라이버 로딩에 실패할 경우에 대비하여 try-catch
    try
    {
      Class.forName("oracle.jdbc.driver.OracleDriver");  // 글자 틀리지 말 것
      System.out.println("오라클 드라이버 로딩 성공");
    }
    catch(Exception e)
    {
      System.out.println(e);
    }

 

    // thin: Type4 방식을 사용하여 접속
    // 서버 IP, 1521: 포트 번호 - default: 1521
    // ora92: DB 이름
    String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";  // 글자 틀리지 말 것


    try
    {
      // ③ 오라클 데이터베이스 연결
      con = DriverManager.getConnection(url, "scott", "tiger"); // 임시로 scott으로 접속

      System.out.println("오라클 데이터베이스 연결 성공");
    }
    catch(Exception e)
    {
      System.out.println("오라클 데이터베이스 연결 실패");
    }


    try
    {
      // ④ Statement 객체 생성
      stmt = con.createStatement();


      // ⑤ SQL 구문 실행

      // DB에서 실행할 뿐, 결과는 ResultSet으로 받는다.
      rs = stmt.executeQuery("select * from emp");


      // ⑥ ResultSet 결과 사용하기
      while(rs.next()) // 다음 데이터가 없을 때 까지 무한루프
      {

        // rs의 결과중 1번째 것: empno. empno는 number이므로 getInt로 가져온다.
        //String empno = rs.getInt(1);  
       int empno = rs.getInt("empno"); // rs의 결과중 컬럼 이름이 empno인 것.


       // 마찬가지로 결과중 2번째 것: ename. varchar2이므로 getString으로 가져온다.
       //String ename = rs.getString(2);  

       // 숫자로 몇 번째 것: 보다는 이렇게 컬럼명을 사용하는게 좋다.
       String ename = rs.getString("ename");


       System.out.print("empno: " + empno + "\t");
       System.out.println("ename: " + ename);
     }
   }
   catch(Exception e)
   {
      e.printStackTrace();
   }
   finally  // 예외가 발생하든 안하든 반드시 자원을 반납해주어야 서버가 다운되지 않는다.
   {
      try
      {
        // ⑦ 자원 반납
        stmt.close();
        con.close();
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }


      System.out.println("객체 반납");
    }
  }
}

'프로그래밍 > DB' 카테고리의 다른 글

[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 04 JDBC - Connection Pool...  (0) 2007.11.27
[JDBC] 03 3일째  (0) 2007.11.27
[JDBC] 02 2일째  (0) 2007.11.27