一、設計資料庫連線池
將資料庫連線池可以作為乙個容器,在這個容器裡邊含有connection(jdbc介面),可以將connection作為乙個管道,每一次執行緒獲取connection(獲取管道)後進行資料庫操作。
1、connection的儲存結構選擇linkedlist
2、執行緒釋放管道:從linkedlist刪除該管道,通過wait-notify喚醒阻塞執行緒
3、執行緒獲取管道:選擇兩種模式:無超時等待模式、超時等待模式,無超時等待每乙個執行緒獲取連線池鎖之後,直接等待獲取管道,這就造成了資源的獨佔,增加負擔;超時模式,在獲得鎖之後,首先在一定的時間限制內則迴圈等待,如果在等待期間,獲得到管道則返回,超過限定時間無法獲得管道返回null;
/**
* 1、超時機制 2、wait-notify
* * @author 12803
* */
public class connectionpool
} /**
* 資料庫連線池釋放乙個連線
* * @param conn
*/public void releaseconn(connection conn)
} public connection getconnectionfrompool(long mills) throws interruptedexception
return pool.removefirst();
} else
connection result = null;
if (!pool.isempty())
return result;
}} }
}
二、動態**模擬資料庫驅動
1、繼承invocationhandler,用做**物件(proxy)呼叫處理程式,正常情況在內部需要繫結真實物件。
2、通過動態**產生connection
3、現階段對動態**理解不太深,參考部落格:
public class connectiondriver
return null;
} }public static final connection createconnection() :載入connection類
* new handler():關聯的呼叫處理程式
*/connection connection = (connection) proxy.newproxyinstance(connectiondriver.class.getclassloader(),
new class<?> , new handler());
return connection;
}}
三、多執行緒測試
1、設定countdownlatch start:保證所有執行緒同時開始(設定為1)
2、設定countdownlatch end:保證所有執行緒同時結束(設定為執行緒數)
3、atomicinteger get = new atomicinteger();獲取到connection的執行緒數
atomicinteger notget = new atomicinteger();未獲取到connection的執行緒數
public class connectionpooltest
start.countdown();// 讓所有執行緒開始執行
try catch (interruptedexception e)
system.out.println("total invoke:" + (threadcount * count));//總共有threadcount個執行緒,每乙個執行緒獲取count次
system.out.println("get:" + get);
system.out.println("not get:" + notget);
} static class myrunner implements runnable
@override
public void run() catch (interruptedexception e)
system.out.println("子執行緒:"+thread.currentthread().getname());
while (count > 0) finally
} else
} catch (exception e) finally
}end.countdown();// 當前子執行緒執行結束
} }}
四、執行結果分析:
1、其中在測試**中threadcount*count含義:假定乙個資料庫,有threadcount個使用者,每個使用者訪問count次
準備子執行緒
子執行緒:connectionrunnerthread_10
子執行緒:connectionrunnerthread_11
子執行緒:connectionrunnerthread_8
子執行緒:connectionrunnerthread_9
子執行緒:connectionrunnerthread_7
子執行緒:connectionrunnerthread_6
子執行緒:connectionrunnerthread_4
子執行緒:connectionrunnerthread_5
子執行緒:connectionrunnerthread_0
子執行緒:connectionrunnerthread_1
子執行緒:connectionrunnerthread_3
子執行緒:connectionrunnerthread_13
子執行緒:connectionrunnerthread_2
子執行緒:connectionrunnerthread_14
子執行緒:connectionrunnerthread_12
所有子執行緒結束
total invoke:300
get:214
not get:86
五、結論
當客戶端執行緒逐步增加,客戶端無法獲取連線的比率增加,不會讓客戶端執行緒一直掛在獲取聯機的操作上,而是按時返回,給使用者告知錯誤,是系統的保護機制。
資料庫連線池 Redis連線池
基本原理 在內部物件池中,維護一定數量的資料庫連線,並對外暴露資料庫連線的獲取和返回方法。如外部使用者可通過getconnection方法獲取資料庫連線,使用完畢後再通過releaseconnection方法將連線返回,注意此時的連線並沒有關閉,而是由連線池管理器 並為下一次使用做好準備。2.作用 ...
資料庫連線池
實現資料連線池,讓系統有更高有執行效率 using system using system.data using system.data.sqlclient using system.collections using system.threading public class dataaccess...
資料庫連線池
資料庫連線池概述 資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得尤為突出。對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的效能指標。資料庫連線池正是針對這個問題提出來的。資料庫連線池負責分配 管理和釋放資料庫連線,它允許應用程式重複使用乙個現有...