데이터베이스 연결 탱크 C3P 0 학습

데이터베이스 연결 탱크 C3P 0 프레임 워 크 는 매우 우수한 오픈 소스 jar 로 고성능 으로 데이터 소스 를 관리 하고 있 습 니 다.여 기 는 프로그램 자체 가 데이터 소스 를 담당 하고 용기 관 리 를 토론 하지 않 습 니 다.
 
1.실현 방식:
C3P 0 은 세 가지 방식 으로 이 루어 집 니 다.
1.스스로 코드 를 작성 하여 데이터 원본 실현
예 를 들 어 클래스 경로 아래 속성 파일 을 설정 합 니 다.config.properties,내용 은 다음 과 같 습 니 다.
driverClass=xxx
jdbcUrl=xxx
user=xxx
password=xxx
...
 
그리고 코드 에서 이 루어 집 니 다.
 
Properties props = new Properties();
InputStream in = Thread.class.getResourceAsStream("config.properties");
props.load(in);
in.close();
 
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass(props.getProperty("driverClass"));
cpds.setJdbcUrl(props.getProperty("jdbcUrl"));
cpds.setUser(props.getProperty("user"));
cpds.setPassword(props.getProperty("password"));
...
여기 서 데이터 원본 을 실현 하 였 다.
 
클래스 경로 아래 xml 파일,config.xml 를 설정 할 수도 있 습 니 다.
 


root
xxx
xxx
xxx


...


 
 
그리고 xml 파일 을 스스로 분석 하면 여러 데이터 원본 의 설정 을 실현 할 수 있 습 니 다.
 
2.기본 익숙 한 파일 설정
클래스 경로 아래 c3p0.properties 파일 을 제공 합 니 다(이름 을 바 꿀 수 없습니다)
설정 은 다음 과 같 습 니 다:
 
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc
c3p0.user=root
c3p0.password=java
...
위 에 서 는 가장 기본 적 인 설정 항목 만 제공 하고 다른 설정 항목 은 참조 합 니 다. 
문서.
설정,c3p 0.뒤에 속성 명 을 추가 하면 됩 니 다.마지막 으로 데이터 원본 을 초기 화 하 는 방식 은 이렇게 간단 합 니 다.
...
DataSource  ds = new ComboPooledDataSource();
return ds;
...
그리고 데이터 원본 을 사용 할 수 있 습 니 다.C3P 0 은 c3p 0.properties 를 자동 으로 분석 합 니 다.
3.
경로 아래 c3p0-config.xml 파일 제공 
 
 
이런 방식 의 사용 방식 은 두 번 째 방식 과 차이 가 많 지 않 지만 더 많은 장점 이 있다. (1).보다 직관 적 이 고 뚜렷 하 며 hibenate 와 spring 의 설정(2)과 유사 합 니 다.여러 데이터 원본 서 비 스 를 위해 default-config 와 named-config 두 가지 설정 방식 을 제공 할 수 있 습 니 다. 
 
 

    
    root
    java
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/jdbc
    10
    30
    100
    10
 

 
 
    root
    java
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/jdbc
    10
    30
    100
    10
 


 
...
DataSource  ds = new ComboPooledDataSource("mySource");
return ds;
...
이렇게 하면 데이터 원본 을 사용 할 수 있다.
 
2.부분 매개 변수 설정 설명:
 
 
1.가장 많이 사용 되 는 설정
initial PoolSize:연결 풀 을 초기 화 할 때 만 든 연결 수,default:3(사용 권장)
minPoolSize:연결 탱크 가 유지 하 는 최소 연결 수,default:3(사용 권장)
max PoolSize:연결 풀 에 있 는 최대 연결 수 입 니 다.새 연결 을 얻 었 을 때 전체 연결 수가 이 값 을 초과 하면 새 연결 을 가 져 오지 않 고 다른 연결 이 풀 리 기 를 기다 리 기 때문에 이 값 은 크게 설 계 될 수 있 습 니 다.default:15(사용 권장)
acquire Increment:연결 탱크 가 빈 연결 이 없 을 때 한꺼번에 만 든 새 데이터베이스 연결 수,default:3(사용 권장)
 
2.연결 풀 의 크기 와 연결 의 생존 시간 관리
max ConnectionAge:연결 의 생존 시간 을 설정 합 니 다.이 시간 을 초과 한 연결 은 연결 탱크 에서 자동 으로 끊 어 져 버 립 니 다.물론 사용 하고 있 는 연결 이 바로 끊 어 지지 않 고 close 가 다시 끊 어 질 때 까지 기다 리 고 있 습 니 다.0 으로 설정 할 때 연결 의 생존 시간 을 제한 하지 않 습 니 다.default:0 단위 s(사용 권장 하지 않 음)
max Idle Time:연결 의 최대 남 은 시간 입 니 다.이 시간 을 초과 하면 데이터베이스 연결 이 사용 되 지 않 으 면 연결 이 끊 깁 니 다.0 이면 연결 을 영원히 끊 지 않 습 니 다.즉,이 연결 을 회수 합 니 다.default:0 단위 s(사용 권장)
max IdleTimeExcessConnections:이 설정 은 연결 탱크 의 부 하 를 신속하게 줄 이기 위 한 것 입 니 다.예 를 들 어 연결 탱크 의 연결 수 는 특정한 데이터 액세스 피크 로 인해 많은 데이터 연결 을 만 들 었 지만 뒤의 시간 대 에 필요 한 데이터 베이스 연결 수가 적 고 빠 른 방출 이 필요 하 며 max IdleTime 보다 작 아야 합 니 다.사실 이것 은 설정 할 필요 가 없습니다.maxidleTime 은 이미 설정 되 었 습 니 다.default:0 단위 s(사용 권장 하지 않 음)
 
3.연결 테스트 설정:
automatictTestTable:테이블 이름 을 설정 합 니 다.연결 탱크 는 이 테이블 이름 에 따라 자신의 테스트 sql 문 구 를 사용 하여 이 빈 테이블 에서 데이터베이스 연결 을 테스트 합 니 다.이 테이블 은 c3p 0 만 사용 할 수 있 고 사용 자 는 조작 할 수 없습니다.default:null(사용 을 권장 하지 않 음)
preferred Test Query:위의 automatic TestTable 과 둘 중 하나만 선택 할 수 있 습 니 다.스스로 SQL 검 측 문 구 를 실현 합 니 다.default:null(사용 권장)
idle Connection Test Period:남 은 연결 을 테스트 하 는 간격 을 설정 합 니 다.테스트 방식 은 위의 두 가지 중 하나 로 MySQL 8 시간 동안 연결 을 끊 는 문 제 를 해결 할 수 있 습 니 다.연결 탱크 가 일정 시간 간격 으로 빈 연결 을 테스트 하여 효과 적 인 빈 연결 이 일정 시간 간격 으로 데이터 베 이 스 를 방문 할 수 있 도록 하기 때문에 MySQL 8 시간 동안 세 션 이 없 는 상태 에서 깨 집 니 다.0 이면 테스트 하지 않 는 다.default:0(사용 권장)
testconnection OnCheckin:true 라면 close 에서 연결 의 유효성 을 테스트 합 니 다.default:false(사용 을 권장 하지 않 음)
testconnection OnCheckout:성능 소모 가 큽 니 다.트 루 라면 getConnection 때마다 테스트 하고 성능 을 향상 시 키 기 위해 서 는 되도록 사용 하지 마 세 요.default:false(사용 을 권장 하지 않 음)
 
4.Prepared Statement 캐 시 설정:
max Statements:연결 탱크 가 데이터 원본 캐 시 인 Prepared Statement 의 총수 입 니 다.Prepared Statement 은 하나의 Connection 에 속 하기 때문에 이 수량 은 응용 프로그램의 평균 연결 수 에 각 연결 의 평균 Prepared Statement 을 곱 하여 계산 해 야 합 니 다.동시에 max Statements PerConnection 설정 이 잘못 되 었 습 니 다.default:0(사용 을 권장 하지 않 음)
max Statements PerConnection:연결 탱크 는 데이터 원본 의 단일 Connection 캐 시 를 위 한 Prepared Statement 수 입 니 다.이 설정 은 max Statements 보다 더 의미 가 있 습 니 다.캐 시 된 서비스 대상 은 하나의 데이터 연결 이기 때문에 설정 을 잘 하면 성능 을 향상 시 킬 수 있 습 니 다.0 일 때 캐 시 하지 않 습 니 다.default:0(상황 을 보고 논 하 다)
 
5.관련 설정 다시 연결 
acquireRetryAttempts:연결 탱크 가 새로운 연결 을 얻 는 데 실 패 했 을 때 다시 시도 하 는 횟수 가 0 보다 적 으 면 연결 이 성공 할 때 까지 무한 재 시도 합 니 다.default:30(사용 권장)
acquireRetryDelay:연결 탱크 가 새로운 연결 을 얻 을 때의 간격 입 니 다.default:1000 단위 ms(사용 권장)
break AfterAcquire Failure:true 라면 연결 이 실 패 했 을 때 데이터 원본 을 자동 으로 닫 습 니 다.프로그램 을 다시 시작 하지 않 는 한.그래서 보통 안 써 요.default:false(사용 을 권장 하지 않 음)
checkoutTimeout:연결 탱크 의 모든 연결 이 끝 났 을 때 프로그램 getConnection 의 대기 시간 을 설정 합 니 다.0 이면 다른 연결 이 풀 리 거나 새로운 연결 을 만 들 때 까지 무한 대기 합 니 다.0 이 아니면 시간 이 되 었 을 때 연결 을 받 지 못 하면 SQLException 을 던 집 니 다.사실은 acquireRetryAttempts*acquireRetryDelay 입 니 다.default:0(위 두 개 와 중복 되 며 둘 다 선택 하 십시오)
 
6.커 넥 션 의 수명 주기 맞 춤 형 관리
connection Customizer ClassName:connection 관 리 를 맞 춤 형 으로 설정 합 니 다.예 를 들 어 connection acquire 에서 connection 의 격 리 단 계 를 설정 하거나 connection 이 버 릴 때 자원 을 닫 습 니 다.
AbstractConnection Customizer 를 계승 하여 관련 방법 을 실현 할 수 있 으 며,설정 할 때 모든 종류의 이름 을 사용 할 수 있 습 니 다.감청 기 역할 이 좀 있어 서 요.default:null(사용 을 권장 하지 않 음)
 
7.제출 되 지 않 은 트 랜 잭 션 처리 설정 
autoCommitOnClose:연결 탱크 가 데이터베이스 연결 을 회수 할 때 자동 으로 업 무 를 제출 할 지 여부 입 니 다.false 라면 제출 되 지 않 은 사 무 를 되 돌려 주 고 true 이면 자동 으로 사 무 를 제출 합 니 다.default:false(사용 을 권장 하지 않 음)
forceIgnore Unresolved Transactions:이 설정 은 true 를 권장 하지 않 습 니 다.default:false(사용 을 권장 하지 않 음)
일반적으로 사 무 는 당연히 스스로 닫 아야 하 는데,왜 연결 탱크 로 하여 금 이런 세심 하지 못 한 문 제 를 처리 하 게 합 니까?
 
8.debug 와 회수 Connection 설정
unreturned Connection Timeout:0 일 때 모든 Connection 을 프로그램 에서 닫 아야 합 니 다.0 이 아니라면 설 정 된 시간 이 도착 한 후에 Connection 을 회수 하도록 강제 하기 때문에 회수 하기 전에 모든 데이터베이스 작업 이 완 료 될 수 있 도록 조심해 야 합 니 다.이런 규 제 는 커 넥 션 이 닫 히 지 않 은 상황 을 줄 이 는 것 은 그다지 적용 되 지 않 는 다.수 동 으로 닫 는 것 을 권장 합 니 다.default:0 단위 s(사용 권장 하지 않 음)
debugUnreturned Connection StackTraces:true 이 고 unreturned Connection Timeout 이 0 이상 의 값 으로 설정 되면 getConnection 에 의 해 나 간 모든 연결 unreturned Connection Timeout 시간 이 되면 스 택 정 보 를 출력 합 니 다.debug 모드 에서 만 적용 할 수 있 습 니 다.스 택 정 보 를 인쇄 하면 getConnection 의 속 도 를 늦 출 수 있 기 때 문 입 니 다 default:false(사용 을 권장 하지 않 습 니 다)
 
다른 설정 항목:일부 설정 항목 은 자신 이 설정 할 필요 가 거의 없 기 때문에 기본 값 을 사용 하면 됩 니 다.그래서 다시 쓰 지 않 았 습 니 다.
 
 
3.예시:
예 를 들 어 두 번 째 방식 을 사용한다.
1.c3p0.properties:
 
#  
c3p0.driverClass=com.mysql.jdbc.Driver
#  
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc
#   
c3p0.user=root
#  
c3p0.password=lovejava
#-------------------------------
#             
c3p0.initialPoolSize=3
#           
c3p0.minPoolSize=3
#                         ,default:3
c3p0.acquireIncrement=3
#            ,                            ,          ,              ,default : 15
c3p0.maxPoolSize=15
#         ,        ,             ,         ,   
c3p0.maxIdleTime=100
#                 ,      0             
c3p0.acquireRetryAttempts=30
#               
c3p0.acquireRetryDelay=1000

 
 2.ConnectionPool
 
package com.study.pool;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class ConnectionPool {
	private DataSource ds;
	private static ConnectionPool pool;
	private ConnectionPool(){
		ds = new ComboPooledDataSource();
	}
	public static final ConnectionPool getInstance(){
		if(pool==null){
			try{
				pool = new ConnectionPool();
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		return pool;
	}
	public synchronized final Connection getConnection() {  
		try {
			return ds.getConnection();
		} catch (SQLException e) {     
			e.printStackTrace();
		}
		return null;
	}
	
}

 
 3.PoolThread
 
package com.study.pool;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class PoolThread extends Thread {
	@Override
	public void run(){
		ConnectionPool pool = ConnectionPool.getInstance();
		Connection con = null;
		PreparedStatement stmt= null;
		ResultSet rs = null;
		try{
			con = pool.getConnection();
			stmt = con.prepareStatement("select sysdate as nowtime from dual");
			rs = stmt.executeQuery();
			while(rs.next()){
				System.out.println(Thread.currentThread().getId()+"---------------  "+rs.getString("nowtime"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				rs.close();
				stmt.close();
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		System.out.println(Thread.currentThread().getId()+"--------  ");
	}
}

 
 4.PoolMain
 
package com.study.pool;

public class PoolMain {

	/**
	 *            
	 */
	public static void main(String[] args) {
		System.out.println("       ");
		PoolThread[] threads = new PoolThread[50];
		for(int i=0;i<threads.length;i++){
			threads[i] = new PoolThread();
		}
		for(int i=0;i<threads.length;i++){
			threads[i].start();
		}
	}

}

 
 
 

좋은 웹페이지 즐겨찾기