Java實現連線池

2021-06-06 15:14:05 字數 4722 閱讀 2349

//連線池原理,非常透徹

public class connectionpool catch (exception e)

try catch (exception e)

} static catch (filenotfoundexception e) catch (ioexception e)

} /**

* * 建立乙個資料庫連線池,連線池中的可用連線的數量採用類成員

* initialconnections 中設定的值

*/@suppresswarnings("rawtypes")

private static synchronized void createpool() throws exception

// 建立儲存連線的向量 , 初始時有 0 個元素

connections = new vector();

// 根據 initialconnections 中設定的值,建立連線。

createconnections(initialconnections);

system.out.println(" 資料庫連線池建立成功! ");

logfileop.addmsg("資料庫連線池建立成功!");

} /**

* 建立由 numconnections 指定數目的資料庫連線 , 並把這些連線

* 放入 connections 向量中

* * @param numconnections 要建立的資料庫連線的數目

* @throws sqlexception

* @throws classnotfoundexception

*/@suppresswarnings()

private static void createconnections(int numconnections) throws sqlexception

//add a new pooledconnection object to connections vector

// 增加乙個連線到連線池中(向量 connections 中)

try catch (sqlexception e)

system.out.println(" 資料庫連線己建立 ......");

} }

/*** 建立乙個新的資料庫連線並返回它

* * @return 返回乙個新建立的資料庫連線

*/private static connection newconnection() throws sqlexception

} return conn; // 返回建立的新的資料庫連線

}} /**

* 通過呼叫 getfreeconnection() 函式返回乙個可用的資料庫連線 ,

* 如果當前沒有可用的資料庫連線,並且更多的資料庫連線不能創

* 建(如連線池大小的限制),此函式等待一會再嘗試獲取。

* * @return 返回乙個可用的資料庫連線物件

* @throws exception

*/private static synchronized connection getconnection() throws exception

connection con = getfreeconnection(); // 獲得乙個可用的資料庫連線

// 如果目前沒有可以使用的連線,即所有的連線都在使用中

while (con == null)

return con;// 返回獲得的可用的連線

} /**

* 本函式從連線池向量 connections 中返回乙個可用的的資料庫連線,如果

* 當前沒有可用的資料庫連線,本函式則根據 incrementalconnections 設定

* 的值建立幾個資料庫連線,並放入連線池中。

* 如果建立後,所有的連線仍都在使用中,則返回 null

* @return 返回乙個可用的資料庫連線

*/private static connection getfreeconnection() throws sqlexception

} return conn;

} /**

* 查詢連線池中所有的連線,查詢乙個可用的資料庫連線,

* 如果沒有可用的連線,返回 null

* * @return 返回乙個可用的資料庫連線

*/private static connection findfreeconnection() throws sqlexception catch (sqlexception e)

pconn.setconnection(conn);

}break; // 己經找到乙個可用的連線,退出

}} return conn;// 返回找到到的可用連線

} /**

* 測試乙個連線是否可用,如果不可用,關掉它並返回 false

* 否則可用返回 true

* * @param conn 需要測試的資料庫連線

* @return 返回 true 表示此連線可用, false 表示不可用

*/private static boolean testconnection(connection con) else

} catch (sqlexception e)

// 連線可用,返回 true

return true;

} /**

* 此函式返回乙個資料庫連線到連線池中,並把此連線置為空閒。

* 所有使用連線池獲得的資料庫連線均應在不使用此連線時返回它。

* * @param 需返回到連線池中的連線物件

*/@suppresswarnings("rawtypes")

public void returnconnection(connection conn)

pooledconnection pconn = null;

enumeration enumerate = connections.elements();

// 遍歷連線池中的所有連線,找到這個要返回的連線物件

while (enumerate.hasmoreelements())

} }/**

* 重新整理連線池中所有的連線物件

* */

public synchronized void refreshconnections() throws sqlexception

pooledconnection pconn = null;

@suppresswarnings("rawtypes")

enumeration enumerate = connections.elements();

while (enumerate.hasmoreelements())

// 關閉此連線,用乙個新的連線代替它。

closeconnection(pconn.getconnection());

pconn.setconnection(newconnection());

pconn.setbusy(false);

} }/**

* 關閉連線池中所有的連線,並清空連線池。

*/public final synchronized static void closeconnectionpool() throws sqlexception

pooledconnection pconn = null;

@suppresswarnings("rawtypes")

enumeration enumerate = connections.elements();

while (enumerate.hasmoreelements())

//5 秒後直接關閉它

closeconnection(pconn.getconnection());

// 從連線池向量中刪除它

connections.removeelement(pconn);

} // 置連線池為空

connections = null;

} /**

* 關閉乙個資料庫連線

* * @param 需要關閉的資料庫連線

*/public static void closeconnection(connection conn) catch (sqlexception e)

} /**

* 使程式等待給定的毫秒數

** @param 給定的毫秒數

*/private static void wait(int mseconds) catch (interruptedexception e)

} /**

* 內部使用的用於儲存連線池中連線物件的類

* 此類中有兩個成員,乙個是資料庫的連線,另乙個是指示此連線是否

* 正在使用的標誌。

*/static class pooledconnection

// 返回此物件中的連線

public connection getconnection()

// 設定此物件的,連線

public void setconnection(connection connection)

// 獲得物件連線是否忙

public boolean isbusy()

// 設定物件的連線正在忙

public void setbusy(boolean busy)

}}

JDBC連線池實現

jdbc connection pool 的注意事項有 1.有乙個簡單的函式從連線池中得到乙個 connection。2.close 函式必須將 connection 放回 資料庫連線池。3.當資料庫連線池中沒有空閒的 connection,資料庫連線池必須能夠自動增加 connection 個數。...

ftp連線池實現

專案中需要用到ftp,經常性的開關會造成極大的開銷,效率比較低。就想封裝乙個ftp連線池,不過遺憾的是沒有找到現成的,只得根據別人提供的思路來實現了。建立若干個ftp連線,然後將這些連線放入阻塞佇列blockingqueue中,每次使用時從佇列中獲取乙個連線,使用完成後將連線重新插入佇列中。實現 o...

php redis實現連線池

什麼是連線池?redis連線靜態類。redis連線池 減少redis的重複連線,降低記憶體消耗!通常情況下,當我們需要做redis操作時,會建立乙個連線,並基於這個連線進行redis操作,操作完成後,釋放連線,一般情況下,這是沒問題的,但當併發量比較高的時候,頻繁的連線建立和釋放對效能會有較高的影響...