- Connection - pool
: Connection들이 모여있는 곳(서버 측)
: 다중 사용자가 서버에 접근하는 경우, DB에 접근(로그인)할 때 발생한다.
: Connection이 많을 때 효율성을 위해서 사용한다.
: Connection - pool을 사용하면 속도가 빨라지고 자원을 아낄 수 있다.
- Connection - pool 설정
- Connection - pool 설정 소스
<Resource
name="jdbc/jsptest"
auth="Container" type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
loginTimeout="10" maxWait="5000"
username="system" password="123456"
testOnBorrow="true"
url = "jdbc:oracle:thin:@localhost:1521:XE"
/>
<Resource
name="jdbc/jsptest"
auth="Container" type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
loginTimeout="10" maxWait="5000"
username="system" password="123456"
testOnBorrow="true"
url = "jdbc:oracle:thin:@localhost:1521:XE"
/>
</Context>
- ConnectionTest.jsp 소스
<%@page import="member.MemberBean"%>
<%@page import="java.util.Vector"%>
<%@page import="member.MemberDao"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
MemberDao d = new MemberDao();
Vector<MemberBean> v = d.getAllMember();
out.println(v.size());
%>
</body>
</html>
- MemberDao.java 소스
package member;
import java.sql.*;
import java.util.Vector;
import javax.naming.Context; // Context
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class MemberDao {
Connection con;
PreparedStatement pstmt;
ResultSet rs;
// 데이터 베이스에 접근하는 메소드
public void con(){
try {
// 이렇게 하면 서버가 관리하기 때문에 자원반납 과정이 필요 없어짐 - close.con()
// 서버의 환경설정 파일을 읽어드리기 위해서 Context 객체를 생성
Context initctx = new InitialContext();
// jsp 톰캣 서버 환경설정파일을 불러옴
Context envctx = (Context) initctx.lookup("java:comp/env");
// jsp 서버에 설정된 Datasource 객체 이름을 불러옴
DataSource ds = (DataSource) envctx.lookup("jdbc/jsptest");
// 데이터 소스에 이미 url, id, pass, classname이 모두 설정되어있음.
con = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
}
// 멤버 데이터를 저장하는 메소드
public void insertMember(MemberBean mbean){
// 데이터베이스에 접근
this.con();
// 쿼리 준비
String sql = "insert into member values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
try {
// 쿼리를 날리기위한 객체를 선언
pstmt = con.prepareStatement(sql);
// 데이터 입력
pstmt.setString(1, mbean.getId());
pstmt.setString(2, mbean.getPass());
pstmt.setString(3, mbean.getName());
pstmt.setString(4, mbean.getGender());
pstmt.setString(5, mbean.getHobby1());
pstmt.setString(6, mbean.getHobby2());
pstmt.setString(7, mbean.getAddress());
pstmt.setString(8, mbean.getEmail());
pstmt.setString(9, mbean.getPhone1());
pstmt.setString(10, mbean.getPhone2());
pstmt.setString(11, mbean.getPhone3());
pstmt.setString(12, mbean.getIntroduce());
// 쿼리실행
pstmt.executeUpdate();
// 자원을 닫음
pstmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 모든 회원에 대한 정보를 가져오는 메소드
public Vector<MemberBean> getAllMember(){
Vector<MemberBean> vector = new Vector<>();
MemberBean bean;
// 커넥션 연결
this.con();
// 쿼리 준비
String sql = "select * from member";
try{
// 쿼리 실행
pstmt = con.prepareStatement(sql);
// 쿼리 실행 후 결과를 resultset이 받아줌
rs = pstmt.executeQuery();
// 반복문을 이용하여 데이터를 빈클래스에 담은후에 그 Bean 클래스를 벡터에 저장
while(rs.next()){
bean = new MemberBean();
bean.setId(rs.getString(1));
bean.setPass(rs.getString(2));
bean.setName(rs.getString(3));
bean.setGender(rs.getString(4));
bean.setHobby1(rs.getString(5));
bean.setHobby2(rs.getString(6));
bean.setAddress(rs.getString(7));
bean.setEmail(rs.getString(8));
bean.setPhone1(rs.getString(9));
bean.setPhone2(rs.getString(10));
bean.setPhone3(rs.getString(11));
bean.setIntroduce(rs.getString(12));
// 빈클래스에 담은 데이터를 백터에 추가
vector.add(bean);
}
con.close();
pstmt.close();
rs.close();
} catch(Exception e){
e.printStackTrace();
}
return vector;
}
// 선택한 회원에 대한 정보를 가져오는 메소드
public MemberBean getSelectMember(String id){
MemberBean bean = new MemberBean();
// 커넥션 연결
this.con();
// 쿼리 준비
String sql = "select * from member where id = ?";
try{
// 쿼리 실행
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
// 쿼리 실행 후 결과를 resultset이 받아줌
rs = pstmt.executeQuery();
rs.next();
bean.setId(rs.getString(1));
bean.setName(rs.getString(3));
bean.setAddress(rs.getString(7));
bean.setEmail(rs.getString(8));
bean.setPhone1(rs.getString(9));
bean.setPhone2(rs.getString(10));
bean.setPhone3(rs.getString(11));
bean.setIntroduce(rs.getString(12));
con.close();
pstmt.close();
rs.close();
} catch(Exception e){
e.printStackTrace();
}
return bean;
}
// 멤버 데이터를 수정하는 메소드
public void updateMember(String phone1, String phone2, String phone3, String email, String id){
// 데이터베이스에 접근
this.con();
// 쿼리 준비
String sql="update member set phone1 = ?, phone2 = ?, phone3 = ?, email = ? where id = ?";
try {
// 쿼리를 날리기위한 객체를 선언
pstmt = con.prepareStatement(sql);
pstmt.setString(1, phone1);
pstmt.setString(2, phone2);
pstmt.setString(3, phone3);
pstmt.setString(4, email);
pstmt.setString(5, id);
// 쿼리실행
pstmt.executeUpdate();
// 자원을 닫음
pstmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 멤버 데이터를 삭제하는 메소드
public void deleteMember(String id){
// 데이터베이스에 접근
this.con();
// 쿼리 준비
String sql="delete from member where id = ?";
try {
// 쿼리를 날리기위한 객체를 선언
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
// 쿼리실행
pstmt.executeUpdate();
// 자원을 닫음
pstmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
- MemberBean.java 소스
package member;
public class MemberBean {
// form 데이터의 name과 똑같은 이름의 멤버변수를 만듬
private String id;
private String pass;
private String name;
private String gender;
private String hobby1;
private String hobby2;
private String address;
private String email;
private String phone1;
private String phone2;
private String phone3;
private String introduce;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getHobby1() {
return hobby1;
}
public void setHobby1(String hobby1) {
this.hobby1 = hobby1;
}
public String getHobby2() {
return hobby2;
}
public void setHobby2(String hobby2) {
this.hobby2 = hobby2;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone1() {
return phone1;
}
public void setPhone1(String phone1) {
this.phone1 = phone1;
}
public String getPhone2() {
return phone2;
}
public void setPhone2(String phone2) {
this.phone2 = phone2;
}
public String getPhone3() {
return phone3;
}
public void setPhone3(String phone3) {
this.phone3 = phone3;
}
public String getIntroduce() {
return introduce;
}
public void setIntroduce(String introduce) {
this.introduce = introduce;
}
}
- 결과