ObjectPool 추상 상위 클래스
다음과 같이 코드 코드를 복사합니다.
import java.util.Iterator;
java.util.Vector 가져오기;
공개 추상 클래스 ObjectPool<T> {
private Vector<T> Locked, Unlocked; // 잠김은 점유된 객체의 컬렉션이고, 잠금 해제는 사용 가능한 객체의 컬렉션입니다.
공공 ObjectPool() {
잠김 = new Vector<T>();
잠금 해제됨 = new Vector<T>();
}
//객체 생성
보호된 추상 T create();
// 객체 유효성 검증
공개 추상 부울 유효성 검사(T o);
// 객체 무효화
공개 추상 무효 만료(T o);
// 체크아웃: 객체 풀에서 객체를 가져옵니다.
공개 동기화 T checkOut() {
ㅜㅜ;
if (unlocked.size() > 0) {
Iterator<T> iter = 잠금 해제됨.iterator();
동안(iter.hasNext()) {
t = iter.next();
if(validate(t)) { // 객체가 유효합니다.
잠금 해제.제거(t);
잠김.추가(t);
t를 반환;
}
else { // 객체가 만료되었습니다.
잠금 해제.제거(t);
만료(t);
}
}
}
// 개체 연못에 사용 가능한 개체가 없습니다. 새 개체를 만듭니다.
t = 생성();
잠김.추가(t);
반환(t);
}
// 체크인: 객체를 객체 풀로 다시 해제합니다.
공개 동기화 무효 checkIn(T t) {
잠김.제거(t);
if(validate(t)) { // 객체가 여전히 유효하면 사용 가능한 객체 컬렉션에 다시 넣습니다.
잠금 해제.추가(t);
}
else { // 그렇지 않으면 객체를 무효화합니다.
만료(t);
}
}
}
JDBCConnectionPool 하위 클래스
다음과 같이 코드 코드를 복사합니다.
import java.sql.Connection;
java.sql.DriverManager 가져오기;
import java.sql.SQLException;
공용 클래스 JDBCConnectionPool은 ObjectPool<Connection>을 확장합니다.
개인 문자열 url, usr, pwd;
public JDBCConnectionPool(문자열 드라이버, 문자열 url, 문자열 usr, 문자열 pwd) {
감독자();
//해당 데이터베이스 드라이버를 로드합니다.
노력하다 {
Class.forName(driver).newInstance();
}
catch(예외 e) {
e.printStackTrace();
}
this.url = URL;
this.usr = usr;
this.pwd = 비밀번호;
}
@보수
보호된 연결 생성() {
노력하다 {
return DriverManager.getConnection(url, usr, pwd);
}
catch(SQLException e) {
e.printStackTrace();
}
null을 반환;
}
@보수
공개 부울 유효성 검사(연결 o) {
노력하다 {
o.isClosed()를 반환합니다.
}
catch(SQLException e) {
e.printStackTrace();
}
거짓을 반환;
}
@보수
공개 무효 만료(연결 o) {
노력하다 {
o.닫기();
}
catch(SQLException e) {
e.printStackTrace();
}
마지막으로 {
o = 널;
}
}
공개 정적 무효 메인(String[] args) {
JDBCConnectionPool dbConnPool = new JDBCConnectionPool("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/test", "root", "123");
// 데이터베이스 연결 개체를 가져옵니다.
연결 연결 = dbConnPool.checkOut();
//데이터베이스 연결 객체 사용
// ...
// 데이터베이스 연결 객체를 해제합니다.
dbConnPool.checkIn(conn);
}
}
다음과 같이 코드 코드를 복사합니다.
클래스 풀 {
개인 정적 최종 MAX_AVAILABLE = 100;
개인용 최종 세마포 사용 가능 = new Semaphore(MAX_AVAILABLE, true);
공용 객체 getItem()이 InterruptedException을 발생시킵니다.
available.acquire();
getNextAvailableItem()을 반환합니다.
}
공공 무효 putItem(객체 x) {
if (markAsUnused(x))
사용 가능.릴리스();
}
// 데모용으로 특별히 효율적인 데이터 구조는 아닙니다.
protected Object[] items = ... 관리되는 항목의 종류
protected boolean[] 사용됨 = new boolean[MAX_AVAILABLE];
보호된 동기화 객체 getNextAvailableItem() {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (!used[i]) {
사용됨[i] = true;
반품 항목[i];
}
}
null을 반환 // 도달하지 못했습니다.
}
protected synced boolean markAsUnused(객체 항목) {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (항목 == 항목[i]) {
if (사용됨[i]) {
사용됨[i] = 거짓;
사실을 반환;
} 또 다른
거짓을 반환;
}
}
거짓을 반환;
}
}