




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、JAVA數據庫連接池基本概念及原理 數據庫連接池是為了解決數據庫對象 的共享出錯問題。實際就是建立一個 緩沖池。原理 預先在緩沖池中放入一定數量的連接, 當需要建立數據庫連接時,只需從連接 池中取出一個,使用完畢之后再放回 去。JDBC的API中沒有提供連接池的方法。連接池關鍵問題分析 使用線程同步來解決并發問題 使用一個單例模式的連接池管理類來 解決連接多個不同數據庫。具體方法: 在連接池管理類的唯一實例被創建 時讀取一個資源文件,其中資源文件 中存放著多個數據庫的 url 地址 () 、 用 戶 名 () 、 密 碼 () 等 信 息 。 如 tx.url=23 :
2、5000/tx_it , tx.user=yang , tx.password=yang321 。根據資源文件提供的信息,創建多 個連接池類的實例,每一個實例都是 一個特定數據庫的連接池。連接池管 理類實例為每個連接池實例取一個 名字,通過不同的名字來管理不同的 連接池。使用資源文件來解決同一個數據庫有 多個用戶使用不同的名稱和密碼訪問 的情況。具體方法:資源文件中設置多個具有相同 url 地址,但具有不同用戶名和密碼的數 據庫連接信息。可采用每一個事務獨占一個連接來實 現事務處理 , 這種方法可以大大降低 事務管理的復雜性。具體方法 :Connection 類 可 以 通 過 設 置 Con
3、nection 的 AutoCommit 屬性為 false, 然后顯式的調用 commit 或 rollback 方法來實現。 使用空閑池來解決連接池的分配與釋 放處理。具體辦法 :把已經創建但尚未分配出去的連接 按創建時間存放到一個空閑池中。每當用戶請求一個連接時,系統首 先檢查空閑池內有沒有空閑連接: 如果有就把建立時間最長 ( 通過容 器的順序存放實現 ) 的那個連接分 配給他 ( 實際是先做連接是否有效 的判斷,如果可用就分配給用戶, 如不可用就把這個連接從空閑池刪 掉,重新檢測空閑池是否還有連 接)。如果沒有則檢查當前所建連接池是 否達到連接池所允許的最大連接數 (maxConn)
4、, 如果沒有達到,就新建 一個連接,如果已經達到,就等待 一定的時間 (timeout) 。如果在等 待的時間內有連接被釋放出來就可 以把這個連接分配給等待的用戶, 如果等待時間超過預定時間 timeout, 則返回空值 (null) 。系統對已經分配出去正在使用的連 接只做計數,當使用完后再返還給空 閑池。連接池的配置與維護 連接池中到底應該放置多少連接, 才能使系統的性能最佳 ?設置連接最小數 ( 系統啟動時連接 池所創建的連接數 ) 、最大數 ( 使用 連接池時所允許連接最大連接數 目) 如何確保連接池中的最小連接數 呢?動態策略 : 每隔一定時間就對連 接池進行檢測,如果發現連接數量
5、小于最小連接數,則補充相應數量 的新連接 , 以保證連接池的正常運 轉。靜態策略 : 發現空閑連接不夠時 再去檢查。連接池的實現連接池模型DBConnectionPoolManager( 連接池管理外覆類 (wrapper), 符合 單例模式 )DBConnectionPool( 連 接 池 內 部 類)從連接池獲取或創建可用連接 ; public Connection getConnection() 使用完畢之后,把連接返還給連接 池;public synchronized void freeConnection(Connection con) 在系統關閉前,斷開所有連接并釋 放連接占用的系
6、統資源 ;public synchronized void release() 還能夠處理無效連接 ( 原來登記為 可用的連接,由于某種原因不再可 用,如超時,通訊問題 ) ,并能夠 限制連接池中的連接總數不低于某 個預定值和不超過某個預定值。 private int checkedOut;/ 已被分配出去的連接數private int minConn;/ 連接池里連接的最小數量private int maxConn;/連接池里允許存在的最大連接數private Stri ng name; /為這個連接池取個名字,方便管理應用示例:import java.io.*;import java.sq
7、l.*;import java.util.*;import java.util.Date;/ 建立 DBConnectionManagerpublic class DBConnectionManager static private DBConnectionManager instanee ;static private int clients ;private Vector drivers = new Vector。;private PrintWriter log ;private Hashtable pools = new Hashtable();/返回唯一的實列staticsynchro
8、ni zedpublic DBConnectionMan ager get In sta nce() if ( instanee = null ) in sta nee = new DBConnectionMan ager();clie nts +;return instanee ;/構造函數!private DBConnectionMan ager() in it(); /結束構造函數/釋放一個連接public void freeConnection(String name, Connection con) DBConn ecti on Pool pool = (DBC onnection
9、Pool)pools .get (n ame);if (pool != null ) pool.freeC onnection(con);/結束釋放一個連接/取得一個連接public Connection getC onnection( Stri ng n ame) DBConn ecti on Pool pool = (DBC onnection Pool)pools .get (n ame);if (pool != null ) retur n pool.getC onn ecti on();return null ;long time) pools .get(name);public C
10、onnection getC onn ectio n(String n ame, DBCo nn ectio nPool pool = (DBCo nn ectio nPool) if (pool != null ) retur n pool.getC onn ecti on( time);returnnull ; / 結束 getconnection/關閉所有連接public synchronizedvoid release() if (- clients != 0)return ;Enumeration allPools =pools .elements();while (allPools
11、.hasMoreElements() DBCo nn ectio nPool pool = (DBCo nn ectio nPool) allPools. nextEleme nt(); pool.release();Enu merati on allDrivers =drivers .eleme nts();while (allDrivers.hasMoreElements() Driver driver = (Driver) allDrivers .n extEleme nt();try DriverManager. deregisterDriver (driver);log("
12、撤消 JDB(驅動程序"+ driver.getClass().getName(); catch (SQLException e) log(e,"無法撤消JDB(驅區動程序的注冊” + driver.getClass().getName();private void createPools(Properties props) Enu merati on propNames = pertyNames();while (propNames.hasMoreElements() Stri ng n ame = (Stri ng) propNames .n extE
13、leme nt();if (name.endsWith( ".url" ) II II);Stri ng poolName = n ame.substri ng(0, n ame .l astI ndexOf(String url = props.getProperty(poolName +".url" );if (url = null ) log("沒有連接池"+ poolName +"指定的URL');continue ;".user");".password");&quo
14、t;.maxconn" , "0");String user = props.getProperty(poolName +String password = props.getProperty(poolName +String maxc onn = props.getProperty(poolName + int max;try max = Integer.valueOf (maxconn).intValue();".連接池"+ poolName); catch (NumberFormatException e) log("錯誤的最大
15、連接數:"+ maxconn + max = 0;DBConnection Pool pool =new DBConnection Pool(poolName, url,user, password, max);pools .put(poolName, pool);log("成功創建連接池"+ poolName);private void init() In putStream is = getClass().getResourceAsStream("/perties" );Properties dbProps = new Prop
16、erties();try dbProps .lo ad(is); catch (Exception e) System. err .println("不能讀取屬性文件。請確保 perties 在你的 CLASSPATH");return ;String logFile = dbProps.getProperty("logfile" ,"DBCo nn ectio nMan ager.log");try log = new PrintWriter( new FileWriter(logFile,true ), true );
17、 catch (lOException e) System. err .println(”無法打開日志文件:” + logFile);log = new PrintWriter(System. err);loadDriver(dbProps); createPools(dbProps);private void loadDriver(Properties props) String driverClasses = props.getProperty("drivers" );Strin gToke ni zer st =new Strin gToke ni zer(drive
18、rClasses);while (st.hasMoreElements() Stri ng driverClassName = st .n extToke n().trim();try Driver driver = (Driver) Class.forName(driverClassName).newln sta nce();DriverMa nager. registerDriver (driver);drivers .addElement(driver);log("成功注冊驅動程序 "+ driverClassName); catch (Exception e) lo
19、g("無法注冊驅動程序:"+ 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 內部類class DBConnectionPool priva
20、teint checkOut;private Vector freeC onn ecti ons= new Vector();privateint maxc onn;privateStringn ameprivateStringpassword;privateStri ngURL;private String user;public DBConnectionPool(String name, String URL, String user,String password, int maxconn) this . name= name;this . URL= URL;this . passwor
21、d = password;this . user = user;this . maxconn = maxconn;public synchroni zed freeC onnectionsvoid freeConnection(Connection con) .addEleme nt(c on);checkOut -; n otifyAII();public synchroni zed Connection getC onnection() Connection con = null ;if ( freeConnections .size() > 0) con = (Connection
22、) freeC onnections .firstEleme nt(); freeC onn ecti ons .removeEleme ntAt(O);try if (con.isClosed() log("從連接池” + name+ "刪除一個連接”); con = getC onnection(); catch (SQLException e) log("從連接池” + name+ "刪除一個連接”); con = getC onnection(); else if ( maxconn = 0 | checkOut < maxconn) con = n ewC onn ecti on();if (con != null ) checkOut +;return con;public synchroni zed Connection getC onnection(long timeout) long startTime = Connection con;new Date().getTime()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中外樂器試題及答案大全
- 益陽市重點中學2025屆高二化學第二學期期末監測模擬試題含解析
- 浙江省杭州地區2024-2025學年高二下物理期末學業質量監測試題含解析
- 高效車庫租賃合同范本:涵蓋車位租賃與增值服務
- 茶具行業展會舉辦與贊助合同
- 雞類產品養殖基地與包裝企業采購合同
- 金融服務代理授權委托合同樣本
- 讀一本書的心得體會(32篇)
- 天津市老年城建設項目可行性研究報告
- 2024年高郵市衛健系統事業單位招聘專業技術人員筆試真題
- 電競店加盟合同協議書
- 2025中國甲烷大會:2024-2025全球甲烷控排進展報告
- 術后急性疼痛及個體化鎮痛
- 2024年公安機關理論考試題庫500道附參考答案【基礎題】
- 血管內導管相關性血流感染預防與診治指南(2025)解讀
- GB/T 196-2025普通螺紋基本尺寸
- 2025年湖南省長沙市語文中考作文趨勢預測(基于近十年分析)
- 2025至2030中國PDH裝置市場深度調查與競爭格局研究報告
- 集團統借統還管理制度
- 酒店二次供水管理制度
- 瀝青攪拌站原材料采購管理流程
評論
0/150
提交評論