DBCP (DataBase Connection Pool) : 다수의 Connection 객체를 미리 생성하여 저장하고
Connection 객체를 반환하는 기능을 제공하는 클래스
ConnectionPool.getInstance() 메소드를 호출하여 ConnectionPool 객체를 반환받아 저장
ConnectionPool.getConnection()
: ConnectionPool 객체에 저장된 Connection 객체 중 하나를 반환받아 저장
ConnectionPool.freeConnection(connection)
: 사용한 Connection 객체를 ConnectionPool 객체에게 다시 반납 처리
# initialCons : 최조로 생성되는 Connection 객체의 갯수
# maxCons : 최대 생성 가능한 Connection 객체의 갯수
url = jdbc:oracle:thin:@localhost:1521:XE
user = scott
passwd = tiger
driver = oracle.jdbc.driver.OracleDriver
initialCons = 2
maxCons = 3
block = true
timeout = 10000
//업체에서 ConnectionPool.java 라는 ConnectionPool 제공받아 작성
public class ConnectionPoolApp {
public static void main(String[] args) throws SQLException {
//ConnectionPool 클래스의 생성자가(private static ConnectionPool instance)
//은닉화 선언되어 new 연산자로 생성자를 호출하여 객체 생성 불가능
//ConnectionPool cp=new ConnectionPool();
//cp.getInstance() 메소드를 호출하여 ConnectionPool 객체를 반환받아 저장
ConnectionPool cp=ConnectionPool.getInstance();
//ConnectionPool 객체에 저장된 Connection 객체 중 하나를 반환받아 저장
Connection con1=cp.getConnection();
System.out.println("con1 = "+con1);
//사용한 Connection 객체를 ConnectionPool 객체에게 다시 반납 처리
//cp.freeConnection(con1);
Connection con2=cp.getConnection();
System.out.println("con2 = "+con2);
//cp.freeConnection(con2);
Connection con3=cp.getConnection();
System.out.println("con3 = "+con3);
//cp.freeConnection(con3);
Connection con4=cp.getConnection();
System.out.println("con4 = "+con4);
cp.freeConnection(con4);
//반납하지 않으면 최대 3개 생성 가능하며 넘을 시 오류 발생
}
}
Properties 파일 : 프로그램 실행에 필요한 값을 제공하기 위한 텍스트 파일
프로그램을 변경하지 않고 Properties 파일을 변경하여 프로그램의 실행 결과 변경 가능
Properties 파일로 제공되는 값은 문자열만 가능
Properties 파일에서는 영문자,숫자,일부 특수문자를 제외한 나머지 문자는 유니코드로 변환되어 처리
# : 주석처리
#Comment - \uC124\uBA85\uBB38 (한글작성 시 자동으로 유니코드로 변환됨)
#Properties File >> Configuration File(환경을 바꿔주는 환경설정 파일)
#Name = Value (실별자를 위해 이름 필요)
id = abc123
password = 123456
name = \uD64D\uAE38\uB3D9
Properties 파일에 저장된 값을 얻어와 출력하는 프로그램 작성
Properties 파일을 읽기 위해 Properties 파일의 경로를 제공받아 FileInputStream 클래스로 객체(입력스트림) 생성
클래스명.class : Class 파일을 이용하여 Class 객체(Clazz)를 표현하는 방법
Class.getClassLoader() : 클래스를 읽어 메모리에 저장하는 ClassLoader 객체를 반환하는 메소드
ClassLoader.getResourceAsStream(String name) : 리소스 파일에 대한 입력스트림을 생성하여 반환하는 메소드
🐥 클래스 객체를 생성하여 리소스 파일을 읽을 수 있는 입력스트림(경로) 생성
InputStream in=PropertiesApp.class.getClassLoader().getResourceAsStream
("xyz/itwill/dbcp/user.properties");
Properties 객체 : Properties 파일의 내용을 전달받아 저장하기 위한 객체
Properties.load(InputStream in) : 입력스트림을 사용하여 Properties 파일에 저장된 모든 이름(name)과 값(value)을 제공받아 Properties 객체의 엔트리로 저장하는 메소드
Properties.get(String key) : Properties 객체에 저장된 엔트리에서 맵키(MapKey)를 전달받아 맵값(MapValue)을 반환하는 메소드
//user.properties 파일에 저장된 값을 얻어와 출력하는 프로그램 작성
public class PropertiesApp {
public static void main(String[] args) throws IOException {
/*
Properties 파일을 읽기 위한 파일 입력스트림 생성 (파일이름:user.properties)
Properties 파일의 경로를 제공받아 FileInputStream 클래스로 객체(입력스트림) 생성
=> 프로그램 배포시 파일 경로 문제점 발생 가능 (사용자마다 경로 다름)
FileInputStream in=new FileInputStream("src/xyz/itwill/dbcp/user.properties");
*/
//클래스명.class : Class 파일을 이용하여 Class 객체(Clazz)를 표현하는 방법
//Class.getClassLoader()
//: 클래스를 읽어 메모리에 저장하는 ClassLoader 객체를 반환하는 메소드
//ClassLoader.getResourceAsStream(String name)
//: 리소스 파일에 대한 입력스트림을 생성하여 반환하는 메소드
InputStream in=PropertiesApp.class.getClassLoader()
.getResourceAsStream("xyz/itwill/dbcp/user.properties");
//java.util 패키지의 Properties 클래스로 객체 생성
//Properties 객체 : Properties 파일의 내용을 전달받아 저장하기 위한 객체
//→ Map 인터페이스를 상속받은 자료구조 클래스 (다수의 엔트리(Key, Value) 저장)
Properties properties=new Properties();
//Properties.load(InputStream in) : 입력스트림을 사용하여 Properties 파일에 저장된
//모든 이름(name)과 값(value)을 제공받아 Properties 객체의 엔트리로 저장하는 메소드
properties.load(in);
//Properties.get(String key) : Properties 객체에 저장된 엔트리에서 맵키(MapKey)를
//전달받아 맵값(MapValue)을 반환하는 메소드
// => Object 객체를 반환하므로 명시적 객체 형변환 후 사용 가능
String id=(String)properties.get("id");
String password=(String)properties.get("password");
String name=(String)properties.get("name");
System.out.println("아이디 = "+id);
System.out.println("비밀번호 = "+password);
System.out.println("이름 = "+name);
}
}
javax.sql.DataSource : DBCP 클래스가 작성시 상속받기 위한 인터페이스
UCP(Universal Connection Pool) 라이브러리에서 제공하는 DBCP 기능의 클래스를 이용한 JDBC 프로그램 작성
PoolDataSource 객체 : DBCP 기능을 제공하는 객체
PoolDataSourceFactory.getPoolDataSource() : PoolDataSource 객체를 반환하는 메소드
public class DataSourceApp {
public static void main(String[] args) throws SQLException {
PoolDataSource pds=PoolDataSourceFactory.getPoolDataSource();
//PoolDataSource 객체를 반환하는 메소드
pds.setConnectionFactoryClassName("oracle.jdbc.driver.OracleDriver");
//JDBC Driver 클래스를 변경하는 메소드
//접속 DBMS 서버의 URL 주소를 변경하는 메소드
pds.setURL("jdbc:oracle:thin:@localhost:1521:xe");
//PoolDataSource.setUser(String user) : DBMS 사용자명을 변경하는 메소드
pds.setUser("scott");
//DBMS 사용자명의 비밀번호를 변경하는 메소드
pds.setPassword("tiger");
//최초로 생성되는 Connection 객체의 갯수 변경하는 메소드
pds.setInitialPoolSize(2);
//최대로 생성되는 Connection 객체의 갯수 변경하는 메소드
pds.setMaxPoolSize(3);
//PoolDataSource 객체에 저장된 Connection 객체 중 하나를 반환하는 메소드
Connection con1=pds.getConnection();
System.out.println("con1 = "+con1);
//PoolDataSource 객체가 제공 가능한 Connection 객체의 갯수를 반환하는 메소드
System.out.println("사용 가능한 Connection 객체의 갯수 = "
+pds.getAvailableConnectionsCount());
//사용한 Connection 객체를 제거하여 PoolDataSource 객체로 반환하는 메소드
con1.close();
}
}