Abstrakte übergeordnete Klasse von ObjectPool
Kopieren Sie den Codecode wie folgt:
import java.util.Iterator;
java.util.Vector importieren;
öffentliche abstrakte Klasse ObjectPool<T> {
private Vector<T> gesperrt, entsperrt; // gesperrt ist die Sammlung der belegten Objekte, entsperrt ist die Sammlung der verfügbaren Objekte
öffentlicher ObjectPool() {
gesperrt = neuer Vector<T>();
unlocked = neuer Vector<T>();
}
//Objekt erstellen
protected abstract T create();
// Objektgültigkeit überprüfen
öffentlicher abstrakter boolescher Wert validieren(T o);
// Das Objekt ungültig machen
öffentliches abstraktes void Expire(T o);
// Auschecken: Holen Sie sich das Objekt aus dem Objektpool
öffentliches synchronisiertes T checkOut() {
T t;
if (unlocked.size() > 0) {
Iterator<T> iter = unlocked.iterator();
while(iter.hasNext()) {
t = iter.next();
if(validate(t)) { // Das Objekt ist gültig
unlocked.remove(t);
gesperrt.add(t);
Rückkehr t;
}
else { // Das Objekt ist abgelaufen
unlocked.remove(t);
ablaufen(t);
}
}
}
// Im Objektteich ist kein Objekt verfügbar. Erstellen Sie ein neues Objekt
t = create();
gesperrt.add(t);
return(t);
}
// Einchecken: Geben Sie das Objekt zurück in den Objektpool
öffentlich synchronisiertes void checkIn(T t) {
gesperrt.remove(t);
if(validate(t)) { // Wenn das Objekt noch gültig ist, füge es wieder in die verfügbare Objektsammlung ein
unlocked.add(t);
}
else { // Ansonsten das Objekt ungültig machen
ablaufen(t);
}
}
}
JDBCConnectionPool-Unterklasse
Kopieren Sie den Codecode wie folgt:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
öffentliche Klasse JDBCConnectionPool erweitert ObjectPool<Connection> {
private String-URL, usr, pwd;
public JDBCConnectionPool(String drivers, String url, String usr, String pwd) {
super();
//Laden Sie den entsprechenden Datenbanktreiber
versuchen {
Class.forName(driver).newInstance();
}
Catch(Ausnahme e) {
e.printStackTrace();
}
this.url = url;
this.usr = usr;
this.pwd = pwd;
}
@Override
protected Connection create() {
versuchen {
return DriverManager.getConnection(url, usr, pwd);
}
Catch(SQLException e) {
e.printStackTrace();
}
null zurückgeben;
}
@Override
öffentliche boolesche Validierung (Verbindung o) {
versuchen {
return o.isClosed();
}
Catch(SQLException e) {
e.printStackTrace();
}
return false;
}
@Override
public void expire(Connection o) {
versuchen {
o.close();
}
Catch(SQLException e) {
e.printStackTrace();
}
Endlich {
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");
// Datenbankverbindungsobjekt abrufen
Verbindung conn = dbConnPool.checkOut();
//Datenbankverbindungsobjekt verwenden
// ...
// Geben Sie das Datenbankverbindungsobjekt frei
dbConnPool.checkIn(conn);
}
}
Kopieren Sie den Codecode wie folgt:
Klasse Pool {
privates statisches Finale MAX_AVAILABLE = 100;
privates finales Semaphor verfügbar = neues Semaphor (MAX_AVAILABLE, true);
öffentliches Objekt getItem() löst InterruptedException {
verfügbar.acquire();
return getNextAvailableItem();
}
public void putItem(Object x) {
if (markAsUnused(x))
verfügbar.release();
}
// Keine besonders effiziente Datenstruktur, nur für Demozwecke
protected Object[] items = ... welche Art von Elementen auch immer verwaltet werden
protected boolean[] used = new boolean[MAX_AVAILABLE];
geschütztes synchronisiertes Objekt getNextAvailableItem() {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (!used[i]) {
used[i] = true;
Artikel zurückgeben[i];
}
}
return null; // nicht erreicht
}
protected synchronisiert boolean markAsUnused(Object item) {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (item == items[i]) {
if (used[i]) {
used[i] = false;
return true;
} anders
return false;
}
}
return false;
}
}