資料庫連線池的實現

2021-09-22 21:06:27 字數 3091 閱讀 9128

一、設計資料庫連線池

將資料庫連線池可以作為乙個容器,在這個容器裡邊含有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...

資料庫連線池

資料庫連線池概述 資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得尤為突出。對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的效能指標。資料庫連線池正是針對這個問題提出來的。資料庫連線池負責分配 管理和釋放資料庫連線,它允許應用程式重複使用乙個現有...