




已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
此文檔收集于網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系網(wǎng)站刪除JAVA數(shù)據(jù)庫連接池l 基本概念及原理n 數(shù)據(jù)庫連接池是為了解決數(shù)據(jù)庫對象的共享出錯問題。n 實際就是建立一個緩沖池。n 原理預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時,只需從連接池中取出一個,使用完畢之后再放回去。n JDBC的API中沒有提供連接池的方法。l 連接池關(guān)鍵問題分析n 使用線程同步來解決并發(fā)問題n 使用一個單例模式的連接池管理類來解決連接多個不同數(shù)據(jù)庫。具體方法:u 在連接池管理類的唯一實例被創(chuàng)建時讀取一個資源文件,其中資源文件中存放著多個數(shù)據(jù)庫的url地址()、用戶名()、密碼()等信息。如tx.url=23:5000/tx_it,tx.user=yang,tx.password=yang321。u 根據(jù)資源文件提供的信息,創(chuàng)建多個連接池類的實例,每一個實例都是一個特定數(shù)據(jù)庫的連接池。連接池管理類實例為每個連接池實例取一個名字,通過不同的名字來管理不同的連接池。n 使用資源文件來解決同一個數(shù)據(jù)庫有多個用戶使用不同的名稱和密碼訪問的情況。具體方法:u 資源文件中設(shè)置多個具有相同url地址,但具有不同用戶名和密碼的數(shù)據(jù)庫連接信息。n 可采用每一個事務(wù)獨占一個連接來實現(xiàn)事務(wù)處理, 這種方法可以大大降低事務(wù)管理的復(fù)雜性。具體方法:u Connection類可以通過設(shè)置Connection的AutoCommit屬性為false,然后顯式的調(diào)用commit或rollback方法來實現(xiàn)。n 使用空閑池來解決連接池的分配與釋放處理。具體辦法:u 把已經(jīng)創(chuàng)建但尚未分配出去的連接按創(chuàng)建時間存放到一個空閑池中。u 每當(dāng)用戶請求一個連接時,系統(tǒng)首先檢查空閑池內(nèi)有沒有空閑連接:l 如果有就把建立時間最長(通過容器的順序存放實現(xiàn))的那個連接分配給他(實際是先做連接是否有效的判斷,如果可用就分配給用戶,如不可用就把這個連接從空閑池刪掉,重新檢測空閑池是否還有連接)。l 如果沒有則檢查當(dāng)前所建連接池是否達到連接池所允許的最大連接數(shù)(maxConn),如果沒有達到,就新建一個連接,如果已經(jīng)達到,就等待一定的時間(timeout)。如果在等待的時間內(nèi)有連接被釋放出來就可以把這個連接分配給等待的用戶,如果等待時間超過預(yù)定時間timeout,則返回空值(null)。u 系統(tǒng)對已經(jīng)分配出去正在使用的連接只做計數(shù),當(dāng)使用完后再返還給空閑池。n 連接池的配置與維護u 連接池中到底應(yīng)該放置多少連接,才能使系統(tǒng)的性能最佳?l 設(shè)置連接最小數(shù)(系統(tǒng)啟動時連接池所創(chuàng)建的連接數(shù))、最大數(shù)(使用連接池時所允許連接最大連接數(shù)目)u 如何確保連接池中的最小連接數(shù)呢?l 動態(tài)策略: 每隔一定時間就對連接池進行檢測,如果發(fā)現(xiàn)連接數(shù)量小于最小連接數(shù),則補充相應(yīng)數(shù)量的新連接,以保證連接池的正常運轉(zhuǎn)。l 靜態(tài)策略: 發(fā)現(xiàn)空閑連接不夠時再去檢查。l 連接池的實現(xiàn)n 連接池模型u DBConnectionPoolManager(連接池管理外覆類(wrapper),符合單例模式)lu DBConnectionPool(連接池內(nèi)部類)l 從連接池獲取或創(chuàng)建可用連接;public Connection getConnection()l 使用完畢之后,把連接返還給連接池;public synchronized void freeConnection(Connection con)l 在系統(tǒng)關(guān)閉前,斷開所有連接并釋放連接占用的系統(tǒng)資源;public synchronized void release()l 還能夠處理無效連接(原來登記為可用的連接,由于某種原因不再可用,如超時,通訊問題),并能夠限制連接池中的連接總數(shù)不低于某個預(yù)定值和不超過某個預(yù)定值。private int checkedOut;/已被分配出去的連接數(shù)private int minConn;/連接池里連接的最小數(shù)量private int maxConn;/連接池里允許存在的最大連接數(shù)private String name; /為這個連接池取個名字,方便管理應(yīng)用示例:import java.io.*; import java.sql.*;import java.util.*;import java.util.Date;/建立DBConnectionManagerpublic class DBConnectionManager static private DBConnectionManager instance;static private int clients;private Vector drivers = new Vector();private PrintWriter log;private Hashtable pools = new Hashtable();/ 返回唯一的實列static synchronized public DBConnectionManager getInstance() if (instance = null) instance = new DBConnectionManager();clients+;return instance;/ 構(gòu)造函數(shù)!private DBConnectionManager() init(); / 結(jié)束構(gòu)造函數(shù)/ 釋放一個連接public void freeConnection(String name, Connection con) DBConnectionPool pool = (DBConnectionPool) pools.get(name);if (pool != null) pool.freeConnection(con);/ 結(jié)束釋放一個連接/ 取得一個連接public Connection getConnection(String name) DBConnectionPool pool = (DBConnectionPool) pools.get(name);if (pool != null) return pool.getConnection();return null;public Connection getConnection(String name, long time) DBConnectionPool pool = (DBConnectionPool) pools.get(name);if (pool != null) return pool.getConnection(time);return null; / 結(jié)束getconnection/ 關(guān)閉所有連接public synchronized void release() if (-clients != 0)return;Enumeration allPools = pools.elements();while (allPools.hasMoreElements() DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();pool.release();Enumeration allDrivers = drivers.elements();while (allDrivers.hasMoreElements() Driver driver = (Driver) allDrivers.nextElement();try DriverManager.deregisterDriver(driver);log(撤消JDBC驅(qū)動程序 + driver.getClass().getName(); catch (SQLException e) log(e, 無法撤消JDBC驅(qū)動程序的注冊 + driver.getClass().getName();private void createPools(Properties props) Enumeration propNames = pertyNames();while (propNames.hasMoreElements() String name = (String) propNames.nextElement();if (name.endsWith(.url) String poolName = name.substring(0, name.lastIndexOf(.);String url = props.getProperty(poolName + .url);if (url = null) log(沒有連接池 + poolName + 指定的URL);continue;String user = props.getProperty(poolName + .user);String password = props.getProperty(poolName + .password);String maxconn = props.getProperty(poolName + .maxconn, 0);int max;try max = Integer.valueOf(maxconn).intValue(); catch (NumberFormatException e) log(錯誤的最大連接數(shù): + maxconn + .連接池 + poolName);max = 0;DBConnectionPool pool = new DBConnectionPool(poolName, url,user, password, max);pools.put(poolName, pool);log(成功創(chuàng)建連接池 + poolName);private void init() InputStream is = getClass().getResourceAsStream(/perties);Properties dbProps = new Properties();try dbProps.load(is); catch (Exception e) System.err.println(不能讀取屬性文件。請確保perties在你的CLASSPATH中);return;String logFile = dbProps.getProperty(logfile,DBConnectionManager.log);try log = new PrintWriter(new FileWriter(logFile, true), true); catch (IOException e) System.err.println(無法打開日志文件: + logFile);log = new PrintWriter(System.err);loadDriver(dbProps);createPools(dbProps);private void loadDriver(Properties props) String driverClasses = props.getProperty(drivers);StringTokenizer st = new StringTokenizer(driverClasses);while (st.hasMoreElements() String driverClassName = st.nextToken().trim();try Driver driver = (Driver) Class.forName(driverClassName).newInstance();DriverManager.registerDriver(driver);drivers.addElement(driver);log(成功注冊驅(qū)動程序 + driverClassName); catch (Exception e) log(無法注冊驅(qū)動程序: + driverClassName + ,錯誤 + e);private void log(String msg) log.println(new Date() + : + msg);private void log(Throwable e, String msg) log.println(new Date() + : + msg);e.printStackTrace(log);/ 建立DBConnectionPool內(nèi)部類class DBConnectionPool private int checkOut;private Vector freeConnections = new Vector();private int maxconn;private String name;private String password;private String URL;private String user;public DBConnectionPool(String name, String URL, String user,String password, int maxconn) = name;this.URL = URL;this.password = password;this.user = user;this.maxconn = maxconn;public synchronized void freeConnection(Connection con) freeConnections.addElement(con);checkOut-;notifyAll();public synchronized Connection getConnection() Connection con = null;if (freeConnections.size() 0) con = (Connection) freeConnections.firstElement();freeConnections.removeElementAt(0);try if (con.isClosed() log(從連接池 + name + 刪除一個連接);con = getConnection(); catch
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 抖音火花旅游行業(yè)旅游教育培訓(xùn)合作協(xié)議
- 小紅書店鋪視覺營銷產(chǎn)品展示與銷售服務(wù)協(xié)議
- 土地糾紛調(diào)節(jié)協(xié)議書
- 人工智能股權(quán)變更登記及技術(shù)研發(fā)合作協(xié)議
- 2025年主題公園沉浸式體驗項目投資風(fēng)險評估與開發(fā)策略報告
- 吵架打印離婚協(xié)議書
- 2025年會計實務(wù)技能復(fù)習(xí)試題及答案
- 不可錯過的工程法規(guī)試題及答案
- 合同甲方變更協(xié)議書
- 包工勞動安全協(xié)議書
- Unit9SectionA(1a-2d)教案人教版八年級英語下冊
- eras在婦科圍手術(shù)
- 下課了助農(nóng)直播-大學(xué)生助農(nóng)電商實踐平臺(簡略版)
- 霧化吸入評分標(biāo)準(zhǔn)
- 第13課《警惕可怕的狂犬病》 課件
- 口腔器械消毒滅菌技術(shù)操作規(guī)范
- 建筑工程抗浮技術(shù)標(biāo)準(zhǔn)
- 上海市材料工程學(xué)校招聘真題
- 校園保安服務(wù)投標(biāo)方案
- “三個代表”重要思想
- 異分母分?jǐn)?shù)加減法教學(xué)設(shè)計
評論
0/150
提交評論