ObjectPool 抽象親クラス
次のようにコードをコピーします。
java.util.Iteratorをインポートします。
java.util.Vectorをインポートします。
パブリック抽象クラス ObjectPool<T> {
private Vector<T> locked, locked; // locked は占有されているオブジェクトのコレクション、unlocked は使用可能なオブジェクトのコレクションです。
パブリック ObjectPool() {
ロック = 新しい Vector<T>();
ロック解除 = 新しい Vector<T>();
}
//オブジェクトを作成する
保護された抽象 T create();
// オブジェクトの有効性を検証する
public abstract boolean validate(To);
// オブジェクトを無効化します
public abstract voidexpired(T o);
// チェックアウト: オブジェクト プールからオブジェクトを取得します
public synchronized T checkOut() {
て、と。
if (unlocked.size() > 0) {
Iterator<T> iter = locked.iterator();
while(iter.hasNext()) {
t = iter.next();
if(validate(t)) { // オブジェクトは有効です
ロック解除.remove(t);
locked.add(t);
t を返します。
}
else { // オブジェクトの有効期限が切れています
ロック解除.remove(t);
期限切れ(t);
}
}
}
// オブジェクト池に利用可能なオブジェクトがないため、新しいオブジェクトを作成します
t = 作成();
locked.add(t);
戻り(t);
}
// チェックイン: オブジェクトを解放してオブジェクト プールに戻します
public synchronized void checkIn(T t) {
locked.remove(t);
if(validate(t)) { // オブジェクトがまだ有効な場合は、使用可能なオブジェクト コレクションに戻します
ロック解除.add(t);
}
else { // それ以外の場合はオブジェクトを無効にする
期限切れ(t);
}
}
}
JDBCConnectionPool サブクラス
次のようにコードをコピーします。
java.sql.Connectionをインポートします。
java.sql.DriverManagerをインポートします。
インポート java.sql.SQLException;
public class JDBCConnectionPool extends ObjectPool<Connection> {
プライベート文字列 URL、usr、pwd;
public JDBCConnectionPool(String driver, String url, String usr, String pwd) {
素晴らしい();
// 対応するデータベースドライバーをロードする
試す {
Class.forName(ドライバー).newInstance();
}
catch(例外 e) {
e.printStackTrace();
}
this.url = URL;
this.usr = ユーザー;
this.pwd = パスワード;
}
@オーバーライド
protected 接続作成() {
試す {
return DriverManager.getConnection(url, usr, pwd);
}
catch(SQLException e) {
e.printStackTrace();
}
null を返します。
}
@オーバーライド
public boolean validate(接続o) {
試す {
o.isClosed()を返します;
}
catch(SQLException e) {
e.printStackTrace();
}
false を返します。
}
@オーバーライド
public voidexpired(接続o) {
試す {
o.close();
}
catch(SQLException e) {
e.printStackTrace();
}
ついに {
o = null;
}
}
public static void main(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;
利用可能なプライベート最終セマフォ = 新しいセマフォ(MAX_AVAILABLE, true);
public Object getItem() は InterruptedException をスローします {
利用可能.acquire();
getNextAvailableItem() を返します。
}
public void putItem(オブジェクト x) {
if (マークとして未使用(x))
available.release();
}
// デモのためだけに特に効率的なデータ構造ではありません。
protected Object[] items = ... 管理されているあらゆる種類のアイテム
protected boolean[] used = new boolean[MAX_AVAILABLE];
protected synchronized Object getNextAvailableItem() {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (!used[i]) {
使用[i] = true;
アイテムを返す[i];
}
}
null を返す // 到達しませんでした。
}
protected synchronized boolean markAsUnused(Object item) {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (アイテム == アイテム[i]) {
if (used[i]) {
used[i] = false;
true を返します。
} それ以外
false を返します。
}
}
false を返します。
}
}