宝贝腿开大点我添添你视频男男,中文字幕熟女人妻av一区二区三区,爱色成人网,大地资源高清播放在线观看在线电影在线观看 ,777米奇影视第四色

集團(tuán)站切換校區(qū)

驗(yàn)證碼已發(fā)送,請(qǐng)查收短信

復(fù)制成功
微信號(hào):togogoi
添加微信好友, 詳細(xì)了解課程
已復(fù)制成功,如果自動(dòng)跳轉(zhuǎn)微信失敗,請(qǐng)前往微信添加好友
打開(kāi)微信
圖標(biāo)

學(xué)習(xí)文章

當(dāng)前位置:首頁(yè) > >學(xué)習(xí)文章 > >

{Java}簡(jiǎn)單連接池的基本工作原理與實(shí)現(xiàn)

發(fā)布時(shí)間: 2017-10-19 10:22:55

一:?連接池的概念;

?連接池用于創(chuàng)建和管理數(shù)據(jù)庫(kù)連接的緩沖池技術(shù),緩沖池中的連接可以被任何需要的連接數(shù)據(jù)庫(kù)的線程使用。當(dāng)一個(gè)線程需要用JDBC對(duì)一個(gè)數(shù)據(jù)庫(kù)操作時(shí),將從池中請(qǐng)求一個(gè)連接。當(dāng)這個(gè)連接對(duì)象使用完畢后,將返回到連接池中,等待為其他的線程服務(wù)。?



二:連接池的工作原理;?

連接池的工作原理主要由三部分組成,分別為連接池的建立、連接池中連接的使用管理、連接池的關(guān)閉。

       第一、連接池的建立。一般在系統(tǒng)初始化時(shí),連接池會(huì)根據(jù)系統(tǒng)配置建立,并在池中創(chuàng)建了幾個(gè)連接對(duì)象,以便使用時(shí)能從連接池中獲取。連接池中的連接不能隨意創(chuàng)建和關(guān)閉,這樣避免了連接隨意建立和關(guān)閉造成的系統(tǒng)開(kāi)銷(xiāo)。Java中提供了很多容器類(lèi)可以方便的構(gòu)建連接池,例如Vector、Stack等。

       第二、連接池的管理。連接池管理策略是連接池機(jī)制的核心,連接池內(nèi)連接的分配和釋放對(duì)系統(tǒng)的性能有很大的影響。其管理策略是:

       當(dāng)客戶請(qǐng)求數(shù)據(jù)庫(kù)連接時(shí),首先查看連接池中是否有空閑連接,如果存在空閑連接,則將連接分配給客戶使用;如果沒(méi)有空閑連接,則查看當(dāng)前所開(kāi)的連接數(shù)是否已經(jīng)達(dá)到較大連接數(shù),如果沒(méi)達(dá)到就重新創(chuàng)建一個(gè)連接給請(qǐng)求的客戶;如果達(dá)到就按設(shè)定的較大等待時(shí)間進(jìn)行等待,如果超出較大等待時(shí)間,則拋出異常給客戶。

       當(dāng)客戶釋放數(shù)據(jù)庫(kù)連接時(shí),先判斷該連接的引用次數(shù)是否超過(guò)了規(guī)定值,如果超過(guò)就從連接池中刪除該連接,否則保留為其他客戶服務(wù)。

       該策略保證了數(shù)據(jù)庫(kù)連接的有效復(fù)用,避免頻繁的建立、釋放連接所帶來(lái)的系統(tǒng)資源開(kāi)銷(xiāo)。

       第三、連接池的關(guān)閉。當(dāng)應(yīng)用程序退出時(shí),關(guān)閉連接池中所有的連接,釋放連接池相關(guān)的資源,該過(guò)程正好與創(chuàng)建相反。

?

三:連接池的優(yōu)點(diǎn)?;

連接池的主要優(yōu)點(diǎn)有以下三個(gè)方面。

       第一、減少連接創(chuàng)建時(shí)間。連接池中的連接是已準(zhǔn)備好的、可重復(fù)使用的,獲取后可以直接訪問(wèn)數(shù)據(jù)庫(kù),因此減少了連接創(chuàng)建的次數(shù)和時(shí)間。

       第二、簡(jiǎn)化的編程模式。當(dāng)使用連接池時(shí),每一個(gè)單獨(dú)的線程能夠像創(chuàng)建一個(gè)自己的JDBC連接一樣操作,允許用戶直接使用JDBC編程技術(shù)。

       第三、控制資源的使用。如果不使用連接池,每次訪問(wèn)數(shù)據(jù)庫(kù)都需要?jiǎng)?chuàng)建一個(gè)連接,這樣系統(tǒng)的穩(wěn)定性受系統(tǒng)連接需求影響很大,很容易產(chǎn)生資源浪費(fèi)和高負(fù)載異常。連接池能夠使性能較大化,將資源利用控制在一定的水平之下。連接池能控制池中的連接數(shù)量,增強(qiáng)了系統(tǒng)在大量用戶應(yīng)用時(shí)的穩(wěn)定性。


四:連接池的實(shí)現(xiàn);

1:數(shù)據(jù)配置文件;

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1:3306/togogo_java_1338

username=java1338

password=123456


2:代碼實(shí)現(xiàn);

package net.togogo.java.jdbc.day2.pool;


import java.io.InputStream;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.LinkedList;

import java.util.Properties;


public class JdbcPool {

private static String driver;

private static String url;

private static String username;

private static String password;


private static LinkedList<Connection> pool = new LinkedList<Connection>();

private static int poolsize = 10;


static {

try {

Properties prop = new Properties();

InputStream in = JdbcPool.class.getClassLoader().getResourceAsStream("jdbc.properties");

prop.load(in);

driver = prop.getProperty("driver");

url = prop.getProperty("url");

username = prop.getProperty("username");

password = prop.getProperty("password");

Class.forName(driver);


/**

* 初始化連接池的連接對(duì)象

*/

if (pool.size() == 0) {

for (int i = 0; i < poolsize; i++) {

try {

Connection conn = DriverManager.getConnection(url, username, password);

pool.add(conn);

System.out.println("[初始化]" + conn + "被加到池里面了?。?!");

} catch (SQLException e) {

e.printStackTrace();

}

}

}


} catch (Exception e) {

throw new ExceptionInInitializerError(e);

}

}


/*

* 這里使用動(dòng)態(tài)代理技術(shù)返回一個(gè)假的Connection,當(dāng)dao調(diào)用假connection的任何方法時(shí),

* 該方法體內(nèi)會(huì)調(diào)用InvocationHandler.invoke方法

* 在invoke方法體內(nèi),發(fā)現(xiàn)dao調(diào)用的是close方法,則把鏈接還到池里,否則,調(diào)用真connection的對(duì)應(yīng)方法。

* (non-Javadoc)

*

* @see javax.sql.DataSource#getConnection()

*/

public static Connection getConnection() throws SQLException { // spring aop

if (pool.size() > 0) {

final Connection conn = pool.removeFirst();

System.out.println("[被使用]" + conn + "從池里面取出去了?。。?);

return (Connection) java.lang.reflect.Proxy.newProxyInstance(JdbcPool.class.getClassLoader(),

conn.getClass().getInterfaces(), new InvocationHandler() {

// proxy為代理對(duì)象 method為要調(diào)用的方法 args為方法的參數(shù)

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

if (method.getName().equals("close")) {

pool.addFirst(conn);

System.out.println("[被回收]" + conn + "------被還到池里面了?。?-----");

return null;

} else {

return method.invoke(conn, args);

}

}

});


}

throw new RuntimeException("對(duì)不起,池里沒(méi)有資源了?。。?);

}

}


3:編寫(xiě)測(cè)試類(lèi);

package net.togogo.java.jdbc.day2.pool;


import java.sql.Connection;

import java.sql.SQLException;


public class TestJdbcPool {


public static void main(String[] args) {

try {

Connection con = JdbcPool.getConnection();

System.out.println("被使用的:" + con);

con.close();

} catch (SQLException e) {

e.printStackTrace();

}

}


}


4:結(jié)果實(shí)現(xiàn);

??

?

?

上一篇: {UI}設(shè)計(jì)-APP的顏色搭配的技巧

下一篇: {思科CCNA-RS}STP生成樹(shù)

十九年老品牌
微信咨詢:gz_togogo 咨詢電話:18127429208 咨詢網(wǎng)站客服:在線客服

相關(guān)課程推薦

在線咨詢 ×

您好,請(qǐng)問(wèn)有什么可以幫您?我們將竭誠(chéng)提供最優(yōu)質(zhì)服務(wù)!