반응형


후암..


잘 다니던 회사를 퇴직하고


오라클이 필요할때... -_-....


어렵다.. 구하기 어렵다..


다행히도 otn 정보는 아직 유효하여


참고 사항을 올린다. ~


1. 오라클 사이트 (https://support.oracle.com ) 방문하여 로그인한다.

   : 예전회사는 OTN 계약을 별도로 했었다... -_-...


 - 로그인 후 우측 상단에 Contact US 를 눌러 아래 화면을 띄운다.

    ※ 참고로 한글 언어셋으로 설정시 안된다는 소문(?)을 들어 영문으로 설정하고 시작하였다.

    Problem Summary : DVD

    => 문제점을 요약하면 : DVD  (ㅋㅋㅋ -_-..)

    Support Identifier : 현재 유효한 8자리 ID값이 출력됨. (우측 상단에 Next를 눌러 넘어감 : 총 3단계!)






 - 2단계 각 화면들이다.

    Problem Type : Software & OS Media Requests

    문제 유형 : 소프트웨어와 OS 미디어 요청


    1) IS this a physical software media shipment request?

       이것은 물리적 소프트웨어 미디어 수송 요청인가?

       -> 난 물리적으로 받고 싶다 -_- Yes ~

    

    2) Which Product line does the media request involve?

        Oracle Database

        미디어 포함 요청에 어떤 제품 라인을 할것인가?

        난 오라클 10g 이므로 Oracle Database

 

    3) Are you requesting a required password for a path download?

        NO

        다운로드 경로를 위한 패스워드가 필요한 요청인가?

        다운로드 한 것에 대한 암호를 설정하는 것 같은데.. 필요 없으므로.. NO.... (잘 모르겠음 -_- ㅋ)




   4) Are you requesting a patch on CD/DVD?

      NO

      당신은 CD/DVD의 패치가 필요한가?

      아니요 


      난 설치본이 필요함 -_-... 패치는 otn에서 걍 받을꺼임...


   5) 4번항목의 패치 필요한 내역을 기재하는 것인데.. 없으므로 난 스킵 (*가 아닌것은 필수 아님)

   6) List the product name and version requested for physical media shipment?( EX: E-business Suite 12.1.1...)

       Oracle Database 10G / Oracle Client 10G

       물리적 미디어 배송을 위한 제품 이름과 버전 목록을 요청하라.

       오라클 데이터베이스 서버 10g와 오라클 클라이언트 10G

   7) What is the OS/platform for the requested media?(EX : Windows 32bit. ....)

       IBM Aix Power 32,64 bit / hp up risc 32/64 bit

       요청한 미디어의 OS(운영체제)와 Platform(플렛폼)은 무엇인가?

      IBM Aix Power 시리즈의 32,64 bit와

      HP ux risc 32/64 비트




 8) Are any language required for this shipment?

     YES

     이번 배송을 위한 어떠한 언어라도 괜찮은가?

  11) Ship to Contact Name :

      배송을 위한 이름 : 

       


12. 배송을 위한 전화번호

     82(국제번호)-10(010이라도 0을 뺌)-xxxx-xxxx


13. 배송을 위한 이메일 주소

     aaa@naaa.aaa


14. 회사명 :



15. 주소1 :

     실제 주소를 알면 -> 다음, 네이버등을 통해 주소 영문 변환으로 검색 뒤 ...

                                  한글 주소를 영문으로 변환하여 붙여넣기 한다.






위와 같이 입력뒤 우측 상단에 Next를 누른다.


아래는 최종 단계인 Contact 확정 단계로


Primary Contact : 이름

Phone Numbers : 전화번호

Email-Address : 이메일 주소

Coontact Method : WEB (웹상에 아래 조회항목을 통해 확인 가능할듯...)

(영어가 약해서 전화오면 챙피해서 죽어버릴지도 모름 -_-....)




위와 같은 최종 확인 뒤 우측 상단에 Submit를 눌러 확정함.





위와 같이 정상 Submit 하고 난뒤 상태를 조회하거나 WEb를 통한 메시지를 확인하고자 할 때는



상단에 Service Requests 메뉴를 클릭뒤


중간부분에 Contact Us Service Reqests 항목에 조회된다.

후암... 간략하게 정리해 봤다...


반응형
반응형

개발자의 실수를 줄여주는 java.sql.Connection 만들기







흔히 close()를 하지 않아서 발생하는 자원 누수 현상을 줄여주는 Connection 클래스를 만들어본다.

JDBC API 사용시 흔히 하는 개발자의 실수

JDBC API를 사용하여 데이터베이스 프로그래밍을 할 때 가장 많이 사용되는 코드는 아마도 다음과 같은 형태일 것이다.

    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    
    try {
        conn = DBPool.getConnection(); //
        stmt = conn.createStatement();
        rs = stmt.executeQuery(..);
        ...
    } catch(SQLException ex) {
        // 예외 처리
    } finally {
        if (rs != null) try { rs.close(); } catch(SQLException ex) {}
        if (stmt != null) try { stmt.close(); } catch(SQLException ex) {}
        if (conn != null) try { conn.close(); } catch(SQLException ex) {}
    }

그런데 위와 같은 프로그래밍을 할 때 흔히 하는 실수가 close()를 제대로 해 주지 않는 것이다. 특히, 하나의 메소드에서 5-10개의 (PreparedStatement를 포함한)Statement와 ResultSet을 사용하는 경우에는 개발자의 실수로 같은 Statement를 두번 close() 하고 한두개의 Statement나 ResultSet은 닫지 않는 실수를 하곤 한다. 이처럼 close() 메소드를 알맞게 호출해주지 않을 경우에는 다음과 같은 문제가 발생한다.

  1. Statement를 닫지 않을 경우, 생성된 Statement의 개수가 증가하여 더 이상 Statement를 생성할 수 없게 된다.
  2. close() 하지 않으므로 불필요한 자원(네트워크 및 메모리)을 낭비하게 된다.
  3. 커넥션 풀을 사용하지 않는 상황에서 Connection을 닫지 않으면 결국엔 DBMS에 연결된 새로운 Connection을 생성할 수 없게 된다.
위의 문제중 첫번째와 두번째 문제는 시간이 지나면 가비지 콜렉터에 의해서 해결될 수도 있지만, 만약 커넥션 풀을 사용하고 있다면 그나마 가비지 콜렉션도 되지 않는다. 따라서 커넥션 풀을 사용하는 경우 Statement와 ResultSet은 반드시 닫아주어야만 한다. 하지만, 제아무리 실력이 뛰어난 개발자라 할지라도 각각 수십에서 수백줄로 구성된 수십여개의 .java 파일을 모두 완벽하게 코딩할 수는 없으며, 따라서 한두군데는 close()를 안 하기 마련이다. 운이 좋으면 빨리 찾을 수 있겠지만, 그렇지 않다면 close() 안한 부분을 찾는 데 몇십분, 몇시간, 심한 경우 1-2일 정도가 걸리기도 한다.

Statement를 자동으로 닫아주는 MVConnection 클래스 구현

실제로 필자도 앞에서 언근했던 문제들 때문에 고생하는 사람들을 종종 봐 왔었으며, 그때마다 그 버그를 고치기 위해서 소스 코드를 일일이 찾아보는 노가다를 하는 개발자들을 보기도 했다. 그래서 만든 클래스가 있는데, 그 클래스의 이름을 MVConnection이라고 붙였다. 이름이야 여러분의 입맛에 맛게 수정하면 되는 것이므로, 여기서는 원리만 간단하게 설명하도록 하겠다.

먼저, MVConnection을 구현하기 전에 우리가 알고 있어야 하는 기본 사항이 있다. JDBC API를 유심히 읽어본 사람이라면 다음과 같은 내용을 본 적이 있을 것이다.

  • Statement를 close() 하면 Statement의 현재(즉, 가장 최근에 생성한) ResultSet도 close() 된다.
  • ResultSet은 그 ResultSet을 생성한 Statement가 닫히거나, 또는 executeQuery 메소드를 실행하는 경우 close() 된다.
MVConnection은 바로 이 두가지 특성을 사용한다. 위의 두 가지 특징을 정리하면 결국 Statement만 알맞게 닫아주면 그와 관련된 ResultSet은 자동으로 닫힌다는 것을 알 수 있다. 따라서 ConnectionWrapper 클래스는 Connection이 생성한 Statement들만 잘 보관해두었다가 각 Statement를 닫아주기만 하면 되는 것이다. PreparedStatement나 CallableStatement는 Statement를 상속하고 있으므로 따로 처리할 필요 없이 Statement 타입으로 모두 처리할 수 있으므로, PreparedStatement와 CallableStatement를 위한 별도의 코드는 필요하지 않다.

다음은 MVConnection 클래스의 핵심 코드이다.

    public class MVConnection implements Connection {
        
        private Connection conn; // 실제 커넥션
        
        private java.util.List statementList; // statement를 저장
        
        public MVConnection(Connection conn) {
            this.conn = conn;
            statementList = new java.util.ArrayList();
        }
        
        public void closeAll() {
            for (int i = 0 ; i < statementList.size() ; i++) {
                Statement stmt = (Statement)statementList.get(i);
                try {
                    stmt.close();
                } catch(SQLException ex) {}
            }
        }
        
        public void close() throws SQLException {
            this.closeAll();            conn.close();
        }
        
        public Statement createStatement() throws SQLException {
            Statement stmt = conn.createStatement();
            statementList.add(stmt);
            return stmt;
        }
        
        public CallableStatement prepareCall(String sql) throws SQLException {
            CallableStatement cstmt = conn.prepareCall(sql);
            statementList.add(cstmt);
            return cstmt;
        }
        
        public PreparedStatement prepareStatement(String sql) throws SQLException {
            PreparedStatement pstmt = conn.prepareStatement(sql);
            statementList.add(pstmt);
            return pstmt;
        }
        
        ...
    }

위 코드를 보면 Statement를 저장하기 위한 List와 그 List에 저장된 Statement 객체를 모두 닫아주는 closeAll() 이라는 메소드가 정의되어 있다. 바로 이 List와 closeAll() 메소드가 이 MVConnection 클래스의 핵심이다. Statement를 생성해주는 메소드(createStatement, prepareCall, prepareStatement)를 보면 생성된 Statement를 statemetList에 추가해주는 것을 알 수 있다. 이렇게 저장된 Statement는 실제로 Connection을 닫을 때, 즉 Connection의 close() 메소드를 호출할 때 닫힌다. (코드를 보면 close() 메소드에서 closeAll() 메소드를 먼저 호출하고 있다.) 따라서, close() 메소드만 호출하면 그와 관련된 모든 Statement와 ResultSet은 자동으로 닫히게 된다.

위 코드에서 다른 메소드들은 모두 다음과 같이 간단하게 구현된다.

    public boolean getAutoCommit() throws SQLException {
        return conn.getAutoCommit();
    }

MVConnection은 java.sql.Connection을 implements 하기 때문에, 그 자체가 Connection으로 사용될 수 있다. 따라서 MVConnection을 사용한다고 해서 특별히 코드가 많이 변경되지는 않으며 다음과 같이 전체적으로 코드가 단순하게 바뀐다.

    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    
    try {
        // MV Connection 생성
        conn = new MVConnection(DBPool.getConnection());
        stmt = conn.createStatement();
        rs = stmt.executeQuery(..);
        ...
    } catch(SQLException ex) {
        // 예외 처리
    } finally {
        // conn 만 close() 해준다.
        if (conn != null) try { conn.close(); } catch(SQLException ex) {}
    }

때에 따라서는 Connection을 close() 하지 않고 커넥션 풀에 되돌려 놔야 할 때가 있다. 그런 경우에는 다음과 같은 형태의 코드를 사용하면 된다.

    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    
    try {
        // MV Connection 생성
        conn = new MVConnection(DBPool.getConnection());
        stmt = conn.createStatement();
        rs = stmt.executeQuery(..);
        ...
    } catch(SQLException ex) {
        // 예외 처리
    } finally {
        if (conn != null) try { 
            ((MVConnection)conn).closeAll();
            DBPool.returnConnection(conn);
        } catch(SQLException ex) {}
    }

즉, Connection을 닫지 않는 경우에는 위와 같이 커넥션 풀에 반환하기 전에 closeAll() 메소드 하나만을 호출해주면 된다. 그러면 Connection과 관련된 모든 Statement, ResultSet 등이 닫히게 된다.

결론

필자의 경우는 이 글에서 작성한 MVConnection을 실제 프로젝트에 응용하여 코드 작성의 편리함 뿐만 아니라 실수로 인해서 발생하는 시스템의 버그 문제를 어느 정도 해결할 수 있었다. 특히, Statement를 생성하거나 ResultSet을 생성할 때 발생하는 커서부족 문제를 획기적으로 줄일 수 있었다. 여러분도 이 클래스를 응용하여 보다 나은 방법으로 코딩의 실수 및 자원의 낭비를 줄일 수 있는 클래스를 작성해보기 바란다.

반응형
반응형

일반적으로 DB link 를 생성하기 위해서는 Client 쪽의 tnsnames.ora 파일에

등록이 되어야 합니다. 하지만 다음과 같이 tnsnames.ora 에 등록할 내용을

직접 사용해서 db link 를 생성할 수 있습니다.

 

CREATE DATABASE LINK link_test

   CONNECT TO scott IDENTIFIED BY tiger
   USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.23.1.13)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=ORCL)))'

반응형

'Database > ORACLE' 카테고리의 다른 글

오라클 exp 명령에서 Query 옵션 사용하기  (0) 2010.08.05
DBMS_METADATA  (0) 2010.08.05
System Account Lock (System 계정 락 걸림)  (0) 2010.07.15
오라클 클론 디비로 복구 하기  (0) 2010.07.13
PL/SQL Exception  (0) 2010.07.06
반응형

1. 나비켓 (Navicat mysql)  

   (속도도 빠르고 좋다고 함) ->   유료

    http://www.sendspace.com/file/6h3q6v

    http://filebeam.com/8b6e269bc3325283fbe2a13d3601d75e

 

2. SQLyog(프리웨어)

    http://www.webyog.com/en/

 

3. Mysql-Front (프리웨어) -> 강추

    http://www.sql-front.com/

 

4. PHPMYADMIN (프리웨어) -> 강추

    http://www.phpmyadmin.net/

 

5. YourSQL

    http://www.mludi.net/YourSQL/

 

6. EMS(프리웨어) -> 강추

    http://www.snapfiles.com/get/emsmysqllite.html

 

7. Toad for mysql(프리웨어) -> 강추

   http://www.toadsoft.com/toadmysql/FreewareDownload.htm

난 oracle 을 사용할 때 DBA가 지원되는 최상위 버젼 토드를 써서 그런지...

왠지 Toad for mysql 조차도 너무 좋음....

단 DBA 관점이라는거....

반응형

'Database > MYSQL' 카테고리의 다른 글

MariaDB SHA2 512 방식으로 암호화 예제  (0) 2019.10.25
Mysql & MariaDB 튜닝 쉘  (0) 2019.08.14
MySQL 백업용 쉘스크립트입니다.  (0) 2010.01.18
C를 이용한 성적관리 예제  (0) 2009.03.06
mysql(latin1 -> euckr 변경)  (0) 2009.03.06

+ Recent posts