ConnectionPool (다수의 Connection 객체를 미리 생성하여 저장하고 Connection 객체를 반환)

woom·2022년 11월 3일
0

JDBC

목록 보기
3/4
post-thumbnail

🌼 ConnectionPool

  • DBCP (DataBase Connection Pool) : 다수의 Connection 객체를 미리 생성하여 저장하고
    Connection 객체를 반환하는 기능을 제공하는 클래스

    • Connection 객체를 미리 생성하여 사용하므로 JDBC 프로그램의 실행 속도 증가
    • Connection 객체를 생성하기 위한 정보의 변경 용이 (유지보수의 효율성 증가)
    • Connection 객체의 갯수 제한 가능 (DB 연동성 저하 때문)
  • ConnectionPool.getInstance() 메소드를 호출하여 ConnectionPool 객체를 반환받아 저장

    • ConnectionPool 객체에는 다수의 Connection 객체가 미리 생성되어 저장
    • 프로그램에서 ConnectionPool 객체가 하나만 제공되도록 싱글톤(Singleton) 클래스 작성
  • ConnectionPool.getConnection()
    : ConnectionPool 객체에 저장된 Connection 객체 중 하나를 반환받아 저장

  • ConnectionPool.freeConnection(connection)
    : 사용한 Connection 객체를 ConnectionPool 객체에게 다시 반납 처리


💡 참고 (dp.Properties 파일)

# 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 파일을 변경하여 프로그램의 실행 결과 변경 가능

    • 프로그램의 유지보수 효율성 증가
    • 자주 변경되는 값에 사용시 용이
  • Properties 파일로 제공되는 값은 문자열만 가능

  • Properties 파일에서는 영문자,숫자,일부 특수문자를 제외한 나머지 문자는 유니코드로 변환되어 처리

🐣 예제 (프로젝트에 파일 생성 ~.properties)

# : 주석처리
#Comment - \uC124\uBA85\uBB38 (한글작성 시 자동으로 유니코드로 변환됨)
#Properties File >> Configuration File(환경을 바꿔주는 환경설정 파일)
#Name = Value (실별자를 위해 이름 필요)

id = abc123
password = 123456
name = \uD64D\uAE38\uB3D9

📌 Properties

  • Properties 파일에 저장된 값을 얻어와 출력하는 프로그램 작성

    • 텍스트파일을 제공받아 규칙이 없는 ConnectionPool (비표준화)
  • 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)을 반환하는 메소드

    • Object 객체를 반환하므로 명시적 객체 형변환 후 사용 가능

🐣 예제

//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);
	}
}





🌼 DataSource

  • javax.sql.DataSource : DBCP 클래스가 작성시 상속받기 위한 인터페이스

    • DBCP 클래스의 메소드가 동일한 형식으로 작성되도록 규칙 제공 (표준화)
  • UCP(Universal Connection Pool) 라이브러리에서 제공하는 DBCP 기능의 클래스를 이용한 JDBC 프로그램 작성

    • https://www.oracle.com Site에서 UCP 라이브러리 파일(ucp11.jar)을 다운로드 받아 프로젝트에 빌드 처리
  • PoolDataSource 객체 : DBCP 기능을 제공하는 객체

  • PoolDataSourceFactory.getPoolDataSource() : PoolDataSource 객체를 반환하는 메소드

    • Factory 클래스 : 객체를 안정적으로 생성하여 반환하는 기능을 제공하는 클래스

📌 DataSource 메소드

  • PoolDataSource.setConnectionFactoryClassName(String driver)
    : JDBC Driver 클래스를 변경하는 메소드
  • PoolDataSource.setURL(String url) : 접속 DBMS 서버의 URL 주소를 변경하는 메소드
  • PoolDataSource.setUser(String user) : DBMS 사용자명을 변경하는 메소드
  • PoolDataSource.setPassword(String password) : DBMS 사용자명의 비밀번호를 변경하는 메소드
  • PoolDataSource 객체에 저장된 Connection 객체의 갯수를 제한하기 위한 메소드 호출
    • 메소드를 호출하지 않을 경우 PoolDataSource 객체에 저장된 기본값을 사용하여 Connection 갯수 제한
  • PoolDataSource.setInitialPoolSize(int size) : 최초로 생성되는 Connection 객체의 갯수 변경하는 메소드
  • PoolDataSource.setMaxPoolSize(int size) : 최대로 생성되는 Connection 객체의 갯수 변경하는 메소드
  • PoolDataSource.getConnection : PoolDataSource 객체에 저장된 Connection 객체 중 하나를 반환하는 메소드
  • PoolDataSource.getAvailableConnectionsCount : PoolDataSource 객체가 제공 가능한 Connection 객체의 갯수를 반환하는 메소드
  • Connection.close() : 사용한 Connection 객체를 제거하여 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();
	}
}







profile
Study Log 📂

0개의 댓글