java設(shè)計模式之實現(xiàn)對象池模式示例分享
ObjectPool抽象父類
import java.util.Iterator;
import java.util.Vector;
public abstract class ObjectPool<T> {
private Vector<T> locked, unlocked; // locked是已占用的對象集合,unlocked是可用對象集合
public ObjectPool() {
locked = new Vector<T>();
unlocked = new Vector<T>();
}
// 創(chuàng)建對象
protected abstract T create();
// 驗證對象有效性
public abstract boolean validate(T o);
// 使對象失效
public abstract void expire(T o);
// 檢出:從對象池獲取對象
public synchronized T checkOut() {
T t;
if (unlocked.size() > 0) {
Iterator<T> iter = unlocked.iterator();
while(iter.hasNext()) {
t = iter.next();
if(validate(t)) { // 對象有效
unlocked.remove(t);
locked.add(t);
return t;
}
else { // 對象已經(jīng)失效
unlocked.remove(t);
expire(t);
}
}
}
// 對象池塘沒有可用對象,創(chuàng)建新對象
t = create();
locked.add(t);
return (t);
}
// 檢入:釋放對象回對象池
public synchronized void checkIn(T t) {
locked.remove(t);
if(validate(t)) { // 如果對象仍有效則放回可用對象集合中
unlocked.add(t);
}
else { // 否則使對象失效
expire(t);
}
}
}
JDBCConnectionPool子類
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCConnectionPool extends ObjectPool<Connection> {
private String url, usr, pwd;
public JDBCConnectionPool(String driver, String url, String usr, String pwd) {
super();
// 加載對應(yīng)的數(shù)據(jù)庫驅(qū)動
try {
Class.forName(driver).newInstance();
}
catch(Exception e) {
e.printStackTrace();
}
this.url = url;
this.usr = usr;
this.pwd = pwd;
}
@Override
protected Connection create() {
try {
return DriverManager.getConnection(url, usr, pwd);
}
catch(SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public boolean validate(Connection o) {
try {
return o.isClosed();
}
catch(SQLException e) {
e.printStackTrace();
}
return false;
}
@Override
public void expire(Connection o) {
try {
o.close();
}
catch(SQLException e) {
e.printStackTrace();
}
finally {
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");
// 獲取數(shù)據(jù)庫連接對象
Connection conn = dbConnPool.checkOut();
// 使用數(shù)據(jù)庫連接對象
// ...
// 釋放數(shù)據(jù)庫連接對象
dbConnPool.checkIn(conn);
}
}
class Pool {
private static final MAX_AVAILABLE = 100;
private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);
public Object getItem() throws InterruptedException {
available.acquire();
return getNextAvailableItem();
}
public void putItem(Object x) {
if (markAsUnused(x))
available.release();
}
// Not a particularly efficient data structure; just for demo
protected Object[] items = ... whatever kinds of items being managed
protected boolean[] used = new boolean[MAX_AVAILABLE];
protected synchronized Object getNextAvailableItem() {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (!used[i]) {
used[i] = true;
return items[i];
}
}
return null; // not reached
}
protected synchronized boolean markAsUnused(Object item) {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (item == items[i]) {
if (used[i]) {
used[i] = false;
return true;
} else
return false;
}
}
return false;
}
}
相關(guān)文章
如何解決springboot啟動的時候required a bean of ty
Spring Boot啟動失敗,提示缺少`UserDao`類型的Bean,解決方案一:為`UserDao`接口添加`@Mapper`注解,重新啟動;解決方案二:使用`@MapperScan`注解掃描Mapper接口所在的包2024-12-12
java和javascript中過濾掉img形式的字符串不顯示圖片的方法
這篇文章主要介紹了java和javascript中過濾掉img形式的字符串不顯示圖片的方法,以實例形式分別講述了采用java和javascript實現(xiàn)過濾掉img形式字符串的技巧,需要的朋友可以參考下2015-02-02
解決spring @ControllerAdvice處理異常無法正確匹配自定義異常
這篇文章主要介紹了解決spring @ControllerAdvice處理異常無法正確匹配自定義異常的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Java數(shù)據(jù)結(jié)構(gòu)之二叉排序樹的實現(xiàn)
二叉排序樹(Binary Sort Tree),又稱二叉查找樹(Binary Search Tree),亦稱二叉搜索樹。本文詳細(xì)介紹了二叉排序樹的原理,并且提供了Java代碼的完全實現(xiàn)。需要的可以參考一下2022-01-01
SpringBoot自定義注解API數(shù)據(jù)加密和簽名校驗
這篇文章主要介紹了SpringBoot自定義注解API數(shù)據(jù)加密和簽名校驗,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
詳解Spark?Sql在UDF中如何引用外部數(shù)據(jù)
這篇文章主要為大家介紹了詳解Spark?Sql在UDF中如何引用外部數(shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
JAVA下單接口優(yōu)化實戰(zhàn)TPS性能提高10倍
今天小編就為大家分享一篇關(guān)于JAVA下單接口優(yōu)化實戰(zhàn)TPS性能提高10倍,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12

