티스토리 뷰

Language/JSP

JDBC, 커넥션풀

MiniNeko 2015. 11. 29. 03:42

참조 : http://blog.naver.com/0moodgirl0/112970983

○ JDBC
1) JDBC 란?
 - 자바 프로그램과 관계형 데이터 원본에 대한 인터페이스이다. JDBC 라이브러리는 관계형 데이터베이스에 접근하고, SQL 쿼리문을 실행하는 방법을 제공한다.
2) JDBC 를 사용하기 위한 설정 ( 오라클 사용시 )
 - oracle>product>10.2.0>db_1>jdbc>lib 의 ojdbc14.jar 파일을 java>jdk1.5.0>jre>lib>ext 안에 복사해서 넣어둔다.
3) JDBC 프로그램 작성
 1. 1단계 - JDBC 드라이버 Load : 인터페이스 드라이버를 구현하는 작업으로 Class 의 forName() 메소드를 사용하여 드라이버를 로드한다. forName(String className) 메소드는 문자열로 주어진 클래스나 인터페이스 이름을 객체로 리턴한다. Class.forName("~")은 드라이버들이 읽히기만 하면 자동 객체가 생성되고 DriverManager 에 등록되며 드라이버 로딩은 프로글매 수행 시 한번만 필요하다.
① MySql 드라이버 로딩


Class.forName("com.mysql.jdbc.Driver");

② Oracle


Class.forName("orcle.jdbc.driver.OracleDriver");

 
 2. 2단계 - Connection 객체 생성 : Connection 객체를 연결하는 것으로 DriverManager 에 등록된 각 드라이버들을 getConnection(String url) 메소드를 사용하여 식별한다. 이때 url 식별자와 동일한 것을 찾아서 매핑한다. 찾지 못하면 no suitable error 가 발생
① MySql 사용시 connection 객체 생성


Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsptext","jspid","jsppass");

② Oracle 사용시 connection 객체생성


Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");
// orcl 은 오라클 sid 이름, scott/tiger 는 디비접속 아이디와 비번


 3. 3단계 - Statement/PrepardStatement/CallableStatement 객체생성 : SQL 쿼리를 생성, 실행하며, 반환된 결과를 가져오게 할 작업 영역을 제공한다. Statement 객체는 Connection 객체의 createStatement() 메소드를 사용하여 생성된다.


Statement stmt = con.createStatement();   // 드라이버 종류와 상관없다.


 4. 4단계 - 쿼리 수행 : Statement 객체가 생성되면 Statement객체의 execute Zuery() 메소드나 executeUpdate() 메소드를 사용해서 쿼리를 처리한다.
① Select 문


ResultSet rs = stmt.executeQuery("select * form 직급");

② Insert, Update, Delete 문


String sql = "update member set passwd = '3579' where id = 'abc';
Stmt.executeUpdate(sql);


 5. 5단계 - ResultSet 처리 : executeQuery() 메소드는 결과로 ResultSet을 반환한다. 5단계는 이 ResultSet 으로부터 원하는 데이터를 추출하는 과정이다. 데이터를 추출하는 방법은 ResultSet 에서 한 행씩 이동하면서 getXxx() 을 이용해서 원하는 필드값을 추출하는데 이때 rs.getString("name") 혹은 rs.getString(1) 로 사용한다. 여기에서 한가지 주의할 사항을 자바 계열에서 ResultSet 의 첫번째 필드는 1부터 시작한다.


While(rs.next()) {
   Out.println(rs.getString("id"));
   Out.println(rs.getString("passwd"));
}


4) JDBC 를 이용한 DB 연동 프로그램
 1. 단순한 DB 연동


import java.sql.*;

public class BoardDAO {
   Connection conn;
   public BoardDAO() {
      try {
         Class.forName("oracle.jdbc.driver.OracleDriver");
         System.out.println("드라이버 연결 성공");
      } catch(Exception e) {
         System.out.println("드라이버 연결 실패 : " + e);
      }
   }
   public void Board() {
      try {
         conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");
         System.out.println("DB 연결 성공");
      } catch(SQLException e) {
         System.out.println("DB 연결 실패 : " + e);
      }
   }
}


 2. DB 에 레코드 삽입 or 추가


import java.sql.*;

public class BoardDAO {
   Connection conn;
   Statement stmt;

   public BoardDAO() {
      try {
         Class.forName("oracle.jdbc.driver.OracleDriver");
         System.out.println("드라이버 연결 성공");
      } catch(Exception e) {
         System.out.println("드라이버 연결 실패 : " + e);
      }
   }
   public void insertBoard(BoardTO b) {
      try {
         conn = DriverManager.getConnection("jdbc:oracle:this:@127.0.0.1:1521:orcl","scott","tiger");
         stmt = conn.createStatement();
         String sql = "insert into ids values('"+b.getId()+"','"+b.getPasswd()+"')";
/*
수정 : String sql = "update ids set passwd='"+b.getPasswd()+"' where id='"+b.getId()+"'";
삭제 : String sql = "delete from ids where id='"+num+"'";
*/
         stmt.executeUpdate(sql);
      } catch(SQLException e) {
         System.out.println("insert 오류 : " + e);
      } finally {
         try { if(stmt != null) stmt.close();
         } catch(Exception ee) {}
         try { if(conn != null) conn.close();
         } catch(Exception ee) {}
      }
   }
}


 3. DB 의 모든 레코드 출력


import java.sql.*;
import java.util.*;

public class BoardDAO {
   Connection conn;
   Statement stmt;
   ResultSet rs;

   public BoardDAO() {
      try {
         Class.forName("oracle.jdbc.driver.OracleDriver");
         System.out.println("드라이버 연결 성공");
      } catch(Exception e) {
         System.out.println("드라이버 연결 실패 : " + e);
      }
   }
   public ArrayList ListBoard() {
      ArrayList list = new ArrayList();

      try {
         conn = DriverManager.getConnection("jdbc:oracle:this:@127.0.0.1:1521:orcl","scott","tiger");
         System.out.println("conn ok");
         stmt = conn.createStatement();
         String sql = "select * from ids";
         rs = stmt.executeQuery(sql);
         while(rs.next()) {
            String id = rs.getString("id");
            String passwd = rs.getString("passwd");
            BoardTO b = new BoardTO();
            b.setId(id);
            b.setPasswd(passwd);

            list.add(b)
         }
      } catch(SQLException e) {
         System.out.println("insert 오류 : " + e);
      } finally {
         try { if(rs != null) rs.close();
         } catch(Exception ee) {}
         try { if(stmt != null) stmt.close();
         } catch(Exception ee) {}
         try { if(conn != null) conn.close();
         } catch(Exception ee) {}
      }
   return list
   }
}



○ 커넥션 풀
1) 커넥션( Connection )
 - 데이터베이스에 연결하기 위한 객체, 커넥션 객체를 만드는데 시스템 자원이 요구되고 메모리와 여러 자원의 초기화 작업등 많은 비용을 요구한다. 데이터베이스에 한번 연결하기 위해서 많은 비용이 드는데 이런 작업을 매번 하다 보면 시스템에 부담이 많이 가기 때문에 이를 해결하기 위해 커넥션 풀을 사용하여 자원을 아낄 수 있다.
2) 커넥션 풀
 1. 커넥션 풀의 정의
  - 자원을 쓰고 다시 회수하는 방법을 쓴다. 한 번 만들어져서 사용된 커넥션 객체는 다시 커넥션 풀로 회수된다.
 2. 커넥션 풀의 조건
  ① service() 메소드(service() 메소드는 요청당 1개씩 매핑)당 1개씩 가지고  쓰게 한다.
   Service
   ■□■□■□
  ② 커넥션의 개수를 제한한다.
  ③ 커넥션 객체 관리자가 다 쓰면 자원을 회수한다.
    ** 웹 브라이저의 요청이 들어오면 커넥션 객체가 있는지 확인하고 없으면 커넥션객체를 생성하여 커넥션을 할당하고 커넥션 객체사용, 반환하는 순으로 처리한다. 객체가 있을 때는 객체를 생성하지 않고 커넥션 할당, 사용, 반환의 순으로만 처리한다.
 3. 커넥션 풀 설정
  ① http://jakarta.apache.org/sit/downloads/downloads_commons.html 사이트에서 자카르타 DBCPAPI 관련 jar 파일 commons-collection-3.1.zip, commons-dbcp-1.2.1.zip, commons-pool-1.2.zip 를 다운받는다.
    ** commons-dbcp-1.2.1jar : 자카르타 DBCP API 관련 jar 파일
      commons-collection-3.1.jar : 자카르타 DBCP API 가 사용하는 자카르타 Pool API jar 파일
      commons-pool-1.2.jar : Pool API 가 사용하는 자카르타 Collection API 의 jar 파일
  ② WEB-INF > lib 에 세 개의 파일을 import 시킨다.
  ③ tomcat > common > lib 폴더에 세 개의 파일을 복사한다.
  ④ Webcontent > META-INF 에 context.xml 파일을 만든다.
  ⑤ 생성된 context.xml 의 기본 코딩은 다 지우고 다음의 내용을 코딩한다.


< Context>
   <Resource name="jdbc/orcl"
      auth="Container"
      driverClassName="oracle.jdbc.driver.OracleDriver"
      type="javax.sql.DataSource"
      url="dbc:oracle:thin:@127.0.0.1:1521:orcl"
      username="scott"
      password="tager"
      maxActive="20"
      maxIdle="10"
      maxWait="-1"/>
< /context>

  ⑥ Webcontent > WEB-INF > web.xml 파일에 다음의 코딩을 추가 한다.


< resource-ref>
   <description>Connection</description>
   <res-ref-name>jdbc/orcl</res-ref-name>
   <res-type>javax.sql.DataSource</res-type>
   <res-auth>Container</res-auth>
< /resource-ref>


 4. 커넥션 풀 사용


import java.sql.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.*;

public class BoardDAO {
   Connection conn;
   Statement stmt;
   ResultSet rs;
   String sql;
   DataSource ds;

   public loginDAO() {
      try {
         Context init = new InitialContext();
         ds = (DataSource)init.lookup("java:comp/env/jdbc/orcl");
         System.out.println("드라이버 연결 성공");
      } catch(Exception e) {
         System.out.println("드라이버 연결 실패 : " + e);
      }
   }
   public boolean newMember(String id, int passwd) {
      boolean check = false;

      try {
         conn = ds.getConnection();
         System.out.println("DB 연결 성공");
         stmt = conn.createStatement();
         sql = "insert into ids values('"+id""','"+passwd+"')";  // 넘어온 값 id, passwd 를 db 에 넣는 sql 문
         stmt.executeUpdate(sql);  // sql 문을 실행

         check = true;  // db 에 값을 넣은 것이 성공했는지 여부, true 면 성공, false 면 실패
      } catch(Exception e) {
         System.out.println("DB 연결 실패 : " + e);
      } finally {
         try { stmt.close(); } catch(Exception e) {}
         try { conn.close(); } catch(Exception e) {}
      }
   return list
   }
}


'Language > JSP' 카테고리의 다른 글

대문자 소문자 변경  (0) 2015.11.29
파일 확장자 구하기  (0) 2015.11.29
날짜비교  (0) 2015.11.29
올림 ceil  (0) 2015.11.29
체크박스 배열로 받기  (0) 2015.11.29
Total
Today
Yesterday
최근에 올라온 글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31