Абстрактный родительский класс ObjectPool
Скопируйте код кода следующим образом:
импортировать java.util.Iterator;
импортировать java.util.Vector;
публичный абстрактный класс ObjectPool<T> {
Private Vector<T> заблокировано, разблокировано // заблокировано — коллекция занятых объектов, разблокировано — коллекция доступных объектов;
общественный ObjectPool() {
заблокирован = новый Vector<T>();
разблокировано = новый Vector<T>();
}
//Создаем объект
защищенный абстрактный T create();
// Проверка корректности объекта
публичная абстрактная логическая проверка (T o);
// Делаем объект недействительным
публичная абстрактная недействительность истекает (T o);
// Проверка: получить объект из пула объектов
публичный синхронизированный T checkOut() {
Т т;
если (unlocked.size() > 0) {
Iterator<T> iter = unlocked.iterator();
while(iter.hasNext()) {
т = iter.next();
if(validate(t)) { // Объект действителен
разблокировано.удалить (т);
заблокировано.добавить(т);
вернуть т;
}
else { // Срок действия объекта истек
разблокировано.удалить (т);
истекает (т);
}
}
}
// В пруду объектов нет доступного объекта, создайте новый объект
т = создать ();
заблокировано.добавить(т);
возврат (т);
}
// Регистрация: вернуть объект обратно в пул объектов
публичная синхронизированная недействительная регистрация (T t) {
заблокировано.удалить (т);
if(validate(t)) { // Если объект все еще действителен, поместите его обратно в доступную коллекцию объектов
разблокировано.добавить (т);
}
else { // В противном случае сделать объект недействительным
истекает (т);
}
}
}
Подкласс JDBCConnectionPool
Скопируйте код кода следующим образом:
импортировать java.sql.Connection;
импортировать java.sql.DriverManager;
импортировать java.sql.SQLException;
открытый класс JDBCConnectionPool расширяет ObjectPool<Connection> {
URL-адрес частной строки, usr, pwd;
public JDBCConnectionPool (драйвер строки, URL-адрес строки, usr строки, pwd строки) {
супер();
//Загружаем соответствующий драйвер базы данных
пытаться {
Class.forName(driver).newInstance();
}
catch(Исключение е) {
е.printStackTrace();
}
this.url = URL;
this.usr = usr;
this.pwd = pwd;
}
@Override
защищенное соединение create() {
пытаться {
вернуть DriverManager.getConnection(url, usr, pwd);
}
catch(SQLException е) {
е.printStackTrace();
}
вернуть ноль;
}
@Override
общедоступная логическая проверка (Соединение o) {
пытаться {
вернуть о.isClosed();
}
catch(SQLException е) {
е.printStackTrace();
}
вернуть ложь;
}
@Override
public void expire(Connection o) {
пытаться {
о.закрыть();
}
catch(SQLException е) {
е.printStackTrace();
}
окончательно {
о = ноль;
}
}
public static void main(String[] args) {
JDBCConnectionPool dbConnPool = новый JDBCConnectionPool("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/test", "root", "123");
// Получаем объект подключения к базе данных
Соединение conn = dbConnPool.checkOut();
//Используем объект подключения к базе данных
// ...
// Освобождаем объект подключения к базе данных
dbConnPool.checkIn(подключение);
}
}
Скопируйте код кода следующим образом:
класс Пул {
частный статический финал MAX_AVAILABLE = 100;
Доступен частный окончательный семафор = новый семафор (MAX_AVAILABLE, true);
public Object getItem() выдает InterruptedException {
доступный.приобрести();
вернуть getNextAvailableItem();
}
общественный недействительный putItem (Объект x) {
если (markAsUnused(x))
доступный.выпуск();
}
// Не особенно эффективная структура данных, только для демонстрации;
protected Object[] items = ... любые типы управляемых элементов
защищенное логическое значение [] использовано = новое логическое значение [MAX_AVAILABLE];
защищенный синхронизированный объект getNextAvailableItem() {
for (int i = 0; i <MAX_AVAILABLE; ++i) {
если (!used[i]) {
использовано[я] = правда;
вернуть элементы[i];
}
}
вернуть ноль // не достигнуто;
}
защищенный синхронизированный логический markAsUnused (элемент объекта) {
for (int i = 0; i <MAX_AVAILABLE; ++i) {
если (пункт == элементы[i]) {
если (используется[i]) {
использовано[я] = ложь;
вернуть истину;
} еще
вернуть ложь;
}
}
вернуть ложь;
}
}