日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

java 数据库连接池

發布時間:2024/4/15 数据库 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 数据库连接池 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據庫連接池,是一種相當實用的應用程序。它可以保存、維護及創建用戶所需的數據庫連接。從而使得用戶得到一個連接的時間降低90%以上。大大提升了數據庫訪問的反應時間。

?

這個是一個開源的代碼。大家可以修改它、使用它。

?

希望我的代碼能對大家有用。

?

此代碼,經過1000數量級的多線程并發訪問測試。在四核CPU下也進行了多線程測試。保證了連接池在真多線程上同步訪問的安全性。

里面包含了一個公開的接口。使用這個接口里面的函數。可以輕易創建使用數據庫連接池服務。

使用一個守護線程維護這個連接池,完全自動化。

?

下載連接:http://download.csdn.net/user/lauo1188

?

?

連接池接口類:

?

[java]?view plaincopy
  • package?mysql;??
  • import?java.sql.*;??
  • import?java.sql.ResultSet;??
  • public?interface?Pool??
  • {??
  • ????public?boolean?start(String?dbname,String?user,String?psw);??//啟動數據庫連接池服務??
  • ????//以下start函數將允許用戶設置最低空閑連接數,最高空閑連接數,最大連接數??
  • ????public?boolean?start(int?lows,int?maxs,int?maxc,String?dbname,String?user,String?psw);??
  • ????public?Connection?getConnection();??//得到連接器??
  • ????public?boolean?freeConnection(Connection?con);//將連接返回到連接池中??
  • ????public?boolean?close();?//清除連接池,并且關閉它(使之變得不可用)??
  • }??
  • ?

    ?

    ?

    第一個實現類:VectorPool

    ?

    ?

    [java]?view plaincopy
  • /**?
  • ?*?@(#)Pool.java?
  • ?*?
  • ?*?
  • ?*?@author??lauo?
  • ?*?@version?1.00?2010/5/15?
  • ?*?
  • ?*?測試完成于2010-5-16??22:40分?
  • ?*/??
  • package?mysql;??
  • import?mysql.*;??
  • import?java.sql.*;??
  • import?java.util.*;??
  • /*?
  • ?*這里將實現ConnectionPool接口?
  • ?*/??
  • public?class?VectorPool?extends?Thread?implements?Pool???
  • {??
  • ????protected?final?boolean?debug?=?false;?//是否debug態(如是??輸出debug狀態信息)??
  • ????protected?boolean?init?=?false;//是否已經將setting初始化??
  • ????//timeDiff???一個連接超過此時間未使用過,則需要更新此連接----1小時??
  • ????protected?final?long?timeDiff?=??60*60*1000?;//1小時60分鐘,1分鐘60秒,1秒1000毫秒??
  • ????protected?int?lows?=?20?;?//連接池的最小空閑連接數??
  • ????protected?int?maxs?=?100?;?//連接池的最大空閑連接數??
  • ????protected?int?maxc?=?100;??
  • ????protected?String?dbname?=?null;??
  • ????protected?String?user?=?null;??
  • ????protected?String?psw?=?null;??
  • ??????
  • ????protected?Integer?conCount?=?0;?//這個是靜態的。當前連接數??
  • ????//下面是連接保存的池??
  • ????protected?Vector<ConInfo>?pool?=?new?Vector<ConInfo>();??
  • ????public?VectorPool()???
  • ????{??
  • ????}??
  • ????public?void?start()??
  • ????{??
  • ??????????
  • ????}??
  • ????//得到當前連接數??
  • ????protected?int?getConCount()??
  • ????{??
  • ????????return?conCount;??
  • ????}??
  • ????/*?
  • ?????*設置數據庫連接的基本參數?
  • ?????*/??
  • ????public??synchronized??boolean?start(String?db,String?u,String?p)??
  • ????{??
  • ????????if(false?==?init?&&?null?!=?pool)//如果未初始化,且連接池可用??
  • ????????{??
  • ????????????dbname??=???db;??
  • ????????????user????=???u;??
  • ????????????psw?????=???p;??
  • ????????????if(test())??
  • ????????????{??
  • ????????????????init????=???true;??
  • ????????????????super.start();???
  • ????????????????return?true;??
  • ????????????}??
  • ????????????else?return?false;??
  • ????????}??
  • ????????else??
  • ????????????return?false;??
  • ????}??
  • ????public?synchronized?boolean?start(int?l,int?m,int?mc,String?db,String?u,String?p)??
  • ????{??
  • ????????if(l<0?||?m<0?||l>=m?||?m>mc)//0<l<m<=mc??
  • ????????????return?false;??
  • ????????if(false?==?init?&&?null?!=?pool)//如果未初始化,且連接池可用??
  • ????????{??
  • ????????????dbname??=???db;??
  • ????????????user????=???u;??
  • ????????????psw?????=???p;??
  • ????????????if(test())??
  • ????????????{??
  • ????????????????init????=???true;??
  • ????????????????lows?=?l<5?5:l;??//這里允許的最小的值為5??
  • ????????????????maxs?=?m<10?10:m;?//這里允許的最小的值為10??
  • ????????????????maxc?=?mc<20??20:mc;//這里允許的連接數??
  • ????????????????super.start();???
  • ????????????????return?true;??
  • ????????????}??
  • ????????????else???
  • ????????????????return?false;??
  • ????????}??
  • ????????else??
  • ????????????return?false;??
  • ????}??
  • ????/*?
  • ?????*從連接池得到一個連接?
  • ?????*/??
  • ????public?synchronized?Connection?getConnection()??
  • ????{??
  • ??????????
  • ????????if(init)??
  • ????????{??
  • ????????????ConInfo?c?=?getOneConnection();??
  • ????????????return?c!=null?c.con:null;//安全得到一個連接??
  • ????????}??
  • ????????else??
  • ????????????return?null;??
  • ????}??
  • ????/*?
  • ?????*得到一個連接,包含了lastTime信息?
  • ?????*/??
  • ????protected?synchronized?ConInfo?getOneConnection()??
  • ????{??
  • ????????if(pool.size()!=0)??
  • ????????{??
  • ????????????return?pool.remove(0);??
  • ????????}??
  • ????????else?//如果連接池為空,創建新的連接??
  • ????????{??
  • ????????????if(debug)?System.out.println("new?connection!");??
  • ????????????return?newConInfo();??
  • ????????}??
  • ????}??
  • ????/*?
  • ?????*將一個連接放回到連接池中?
  • ?????*/??
  • ????public?synchronized?boolean?freeConnection(Connection?con)??
  • ????{??
  • ????????if(init==false?||?con?==?null?)//當沒有init或者已經close之后?不應該free它進來。??
  • ????????????return?false;??
  • ????????ConInfo?c?=??new?ConInfo(con);//調用了ConInfo的構造函數??
  • ????????pool.addElement(c);??
  • ????????return?true;??
  • ????}??
  • ????/*?
  • ?????*將內容清空?
  • ?????*且將本連接池對象置為無用狀態?
  • ?????*/??
  • ????public?synchronized??boolean?close()??
  • ????{??
  • ????????if(init)??
  • ????????{??
  • ????????????init?=?false;??
  • ????????????for(int?i?=?0;?i?<pool.size();i++)??
  • ????????????????pool.get(i).close();??
  • ????????????pool.clear();??
  • ????????????pool????=???null;//將此連接池置為無用狀態。如果要新的鏈接池,重新創建鏈接池對象??
  • ????????????dbname??=???null;??
  • ????????????user????=???null;??
  • ????????????psw?????=???null;??
  • ????????????return?true;??
  • ????????}??
  • ????????else???
  • ????????????return?false;??
  • ????}??
  • ?????
  • ??
  • ????/*?
  • ?????*下面將是一個一線程執行體,當start連接池服務之后,由它來維護?
  • ?????*連接池里面的連接,從而保證他們能被正確的創建、注銷?
  • ?????*?
  • ?????*/??
  • ????public?void?run()??
  • ????{??
  • ????????final?long?sleepTime?=?2*1000??;?//2秒???
  • ????????final?long?refreshTime?=?10*60*1000;?//10分鐘運行一次。連接是否應該被更新??
  • ????????final?long?lowsCheckTime?=?2*1000;//10秒檢查一次。最低連接數檢查間隔時間??
  • ????????final?long?maxsCheckTime?=?60*1000;//1分鐘檢查一次。最大連接數時間??
  • ????????long?loop?=?0;??
  • ????????while(true)??
  • ????????{??
  • ????????????if(loop%refreshTime?==?0)??
  • ????????????{??
  • ????????????????if(debug)?System.out.println("call?refresh:"+pool.size());??
  • ????????????????refreshByTimeDiff();??
  • ????????????}??
  • ????????????if(loop%maxsCheckTime?==?0)??
  • ????????????{??
  • ????????????????if(debug)?System.out.println("call?toMaxs:"+pool.size());??
  • ????????????????toMaxs();??
  • ????????????}??
  • ????????????if(loop%lowsCheckTime?==?0)??
  • ????????????{??
  • ????????????????if(debug)?System.out.println("conCnt:"+conCount+"?call?toLows:"+pool.size());??
  • ????????????????toLows();??
  • ????????????}??
  • ????????????loop?+=?sleepTime;//更新loop的時間。??
  • ????????????try{??
  • ????????????????sleep(sleepTime);??
  • ????????????}??
  • ????????????catch(Exception?e){??
  • ????????????????e.printStackTrace();??
  • ????????????????stop();??
  • ????????????}??
  • ??????????????
  • ????????}??
  • ??????????
  • ????}??
  • ????/*?
  • ?????*使過小的空閑連接數恢復到lows?
  • ?????*/??
  • ????protected?void?toLows()??
  • ????{??
  • ????????int?size?=?pool.size();??
  • ????????/*?
  • ?????????*這里要避免直接使用pool.size進行判斷?
  • ?????????*當連接一直被get出去之后,size很難達到lows,故此?
  • ?????????*/??
  • ????????for(;size<lows;size++)??
  • ????????{??
  • ????????????if(debug)?System.out.println("toLows?is?running!");??
  • ????????????ConInfo?c?=??newConInfo();??
  • ????????????if(c!=null)??
  • ????????????????synchronized(pool)??
  • ????????????????{??
  • ????????????????????pool.addElement(c);??
  • ????????????????}??
  • ????????}??
  • ????}??
  • ????/*?
  • ?????*使過多的空閑連接數恢復到maxs;?
  • ?????*/??
  • ????protected?void?toMaxs()??
  • ????{??
  • ????????int?size?=?pool.size();??
  • ????????for(;size>maxs;size--)??
  • ????????{??
  • ????????????if(debug)?System.out.println("toMaxs?is?running!");??
  • ????????????try{??
  • ????????????????getConnection().close();??
  • ????????????????synchronized(conCount)//這里修改要同步好。??
  • ????????????????{??
  • ????????????????????conCount?--;??
  • ????????????????}??
  • ????????????}??
  • ????????????catch(Exception?e)??
  • ????????????{??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????/*?
  • ?????*查找當前的連接池,找到timeDiff時間內未使用過的連接,刪除它們,如果連接數不足,將由toLows補齊?
  • ?????*一個危險的線程不安全函數?
  • ?????*/??
  • ????public?void?refreshByTimeDiff()??
  • ????{??
  • ????????Calendar?nowTime?=?Calendar.getInstance();??
  • ????????long?now?=?nowTime.getTimeInMillis();??
  • ????????for(int?i=0;i<pool.size();i++)??
  • ????????{??
  • ????????????ConInfo?c?=?getOneConnection();??
  • ????????????if(now??-?c.lastTime.getTimeInMillis()?>=timeDiff)//刪除它們??
  • ????????????{??
  • ????????????????if(debug)?System.out.println("refresh?the?pool!,,,,,,,,");??
  • ????????????????synchronized(pool)//獲得pool的鎖??
  • ????????????????{??
  • ????????????????????pool.remove(i).close();//使用了ConInfo中的關閉函數??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????/*?
  • ?????*一個測試數據庫連接是否可用的函數?
  • ?????*/??
  • ????protected?boolean?test()??
  • ????{??
  • ????????int?cnt?=?10;??
  • ????????Connection?c;??
  • ????????do{??
  • ????????????c?=?newConnection();??
  • ????????????cnt?--?;??
  • ????????}while(c==null?&&?cnt>=0);??
  • ????????if(c!=null)??
  • ????????{??
  • ????????????(new?ConInfo(c)).close();??
  • ????????????return?true;??
  • ????????}??
  • ????????else??
  • ????????????return?false;??
  • ??????????????
  • ????}??
  • ??
  • ????/*?
  • ?????*下面為內置的類,用于表明一個連接最后使用時間?
  • ?????*/??
  • ????class?ConInfo??
  • ????{??
  • ????????protected?Calendar?lastTime;????//連接最后使用時間??
  • ????????protected?Connection?con?=?null;????//對應的connection??
  • ????????public?ConInfo(Connection?c)??
  • ????????{??
  • ????????????con?=???c;??
  • ????????????lastTime?=?Calendar.getInstance();??
  • ????????}??
  • ????????public?synchronized?void?close()??
  • ????????{??
  • ????????????try??
  • ????????????{??
  • ????????????????if(con!=null)??
  • ????????????????????con.close();??
  • ????????????????synchronized(conCount)??
  • ????????????????{??
  • ????????????????????conCount-=con!=null?1:0;??
  • ????????????????}??
  • ????????????????lastTime?=?null;??
  • ????????????}??
  • ????????????catch(Exception?e)??
  • ????????????{??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????/*?
  • ?????*創建一個新的連接?
  • ?????*/??
  • ????protected??Connection?newConnection()??
  • ????{??
  • ????????try??
  • ????????{??
  • ????????????Class.forName("com.mysql.jdbc.Driver");??
  • ????????????int?cnt?=?0;??
  • ????????????Connection?c?=?null;??
  • ????????????synchronized(conCount)??
  • ????????????{??
  • ????????????????if(conCount<=maxc)//當連接數沒超過既定最大連接數時??
  • ????????????????do??
  • ????????????????{??
  • ????????????????????try{??
  • ????????????????????c?=?DriverManager.getConnection(dbname,user,psw);??
  • ????????????????????}catch(Exception?es){c=null;if(debug)?System.out.println("create?new?connection?error!");}??
  • ????????????????????cnt++;??
  • ????????????????}while(null?==?c??&&?cnt<3);??
  • ????????????????conCount+=c!=null?1:0;??
  • ????????????}??
  • ????????????return?c;//創建一個新的connection??
  • ????????}??
  • ????????catch(Exception?e)??
  • ????????{??
  • ????????????e.printStackTrace();??
  • ????????????return?null;??
  • ????????}??
  • ????}??
  • ????/*?
  • ?????*得到一個新的連接?
  • ?????*/??
  • ????protected?ConInfo?newConInfo()??
  • ????{??
  • ????????Connection?c?=?newConnection();??
  • ????????if(c==null)??
  • ????????????return?null;??
  • ????????return?new?ConInfo(c);??
  • ????}??
  • ??
  • ????/*?
  • ?????*測試函數main?
  • ?????*/??
  • ????public?static?void?main(String[]?argvs)??
  • ????{??
  • ????????VectorPool?pool?=?new?VectorPool();??
  • ????????Connection?con?=?null;??
  • ????????boolean?flag?=?pool.start("jdbc:mysql://localhost/finance","root","");??
  • ????????int?cnt?=?10000;//1萬次??
  • ????????long?t0??=?Calendar.getInstance().getTimeInMillis();??
  • ????????/測試選項??
  • ????????final?boolean?tflag?=?true?;//如為true?為使用連接池??否則直接創建一個新連接。??
  • ????????//??
  • ????????while(flag){??
  • ??????????
  • ????????????con?=?tflag???pool.getConnection():pool.newConnection();//;??
  • ????????????try??
  • ????????????{?????
  • ????????????????Statement?stm?=?con.createStatement();??
  • ????????????????ResultSet?rev?=?stm.executeQuery("select?*?from?user");??
  • ????????????????while(false?&&?rev!=null?&&?rev.next())??
  • ????????????????{??
  • ????????????????????System.out.println(rev.getString("id"));??
  • ????????????????}??
  • ????????????????stm.close();??
  • ????????????}??
  • ????????????catch(Exception?e)??
  • ????????????{??
  • ????????????????e.printStackTrace();??
  • ??????????????????
  • ????????????}??
  • ????????//??if(Math.abs(Math.random())%10<4)??
  • ????????????if(tflag)//使用完之后要釋放,否則會出大問題??
  • ????????????????pool.freeConnection(con);??
  • ????????????try{??
  • ????????????????if(!tflag)??
  • ????????????????????con.close();//釋放連接?當不用pool時??
  • ????????????}??
  • ????????????catch(Exception?exx)??
  • ????????????{??
  • ????????????????exx.printStackTrace();??
  • ????????????}??
  • ????????????/*?
  • ????????????try{?
  • ????????????????sleep(100);?///間隔時間?
  • ????????????}?
  • ????????????catch(Exception?ee)?
  • ????????????{?
  • ????????????????ee.printStackTrace();?
  • ????????????}?
  • ????????????*/??
  • ????????????//System.out.println("cnt:"+cnt);??
  • ????????//??System.out.println("con_Cnt:"+pool.getConCount());??
  • ????????????if(--cnt<0)??
  • ????????????????break;??
  • ????????}??
  • ????????System.out.println("used?time:"+(Calendar.getInstance().getTimeInMillis()-t0));??
  • ????}??
  • }??
  • /*?
  • ?*?
  • use?the?pool;?
  • cnt:3?
  • cnt:2?
  • cnt:1?
  • cnt:0?
  • used?time:11286?
  • ---用了11.286秒?
  • cnt:9?
  • cnt:8?
  • cnt:7?
  • cnt:6?
  • cnt:5?
  • cnt:4?
  • cnt:3?
  • cnt:2?
  • cnt:1?
  • cnt:0?
  • used?time:129376?
  • 用了129.376秒(多了整整十倍)。?
  • 再測試一次:?
  • cnt:1?
  • cnt:0?
  • used?time:7871??
  • ---used?the?pool??7.871秒?
  • cnt:4?
  • cnt:3?
  • cnt:2?
  • cnt:1?
  • cnt:0?
  • used?time:100084??
  • ----create?the?connection?one?by?one???100.084秒?
  • */??
  • ?

    ?

    ?

    第二個實現類:ListPool

    ?

    ?

    [java]?view plaincopy
  • /*?
  • ?*?@(#)Pool.java?
  • ?*?
  • ?*?
  • ?*?@author??
  • ?*?@version?1.00?2010/5/15?
  • ?*/??
  • package?mysql;??
  • import?mysql.*;??
  • import?java.sql.*;??
  • import?java.util.*;??
  • /*?
  • ?*這里將實現ConnectionPool接口?
  • ?*/??
  • public?class?ListPool?extends?Thread?implements?Pool???
  • {??
  • ????protected?final?boolean?debug?=?false;?//是否debug態(如是??輸出debug狀態信息)??
  • ????protected?boolean?init?=?false;//是否已經將setting初始化??
  • ????//timeDiff???一個連接超過此時間未使用過,則需要更新此連接----1小時??
  • ????protected?final?long?timeDiff?=??60*60*1000?;//1小時60分鐘,1分鐘60秒,1秒1000毫秒??
  • ????protected?int?lows?=?20?;?//連接池的最小空閑連接數??
  • ????protected?int?maxs?=?100?;?//連接池的最大空閑連接數??
  • ????protected?int?maxc?=?100;??
  • ????protected?String?dbname?=?null;??
  • ????protected?String?user?=?null;??
  • ????protected?String?psw?=?null;??
  • ??????
  • ????protected?Integer?conCount?=?0;?//這個是靜態的。當前連接數??
  • ????//下面是連接保存的池??
  • ????protected?LinkedList<ConInfo>?pool?=?new?LinkedList<ConInfo>();??
  • ????public?ListPool()???
  • ????{??
  • ????}??
  • ????public?void?start()??
  • ????{??
  • ??????????
  • ????}??
  • ????//得到當前連接數??
  • ????protected?int?getConCount()??
  • ????{??
  • ????????return?conCount;??
  • ????}??
  • ????/*?
  • ?????*設置數據庫連接的基本參數?
  • ?????*/??
  • ????public??synchronized??boolean?start(String?db,String?u,String?p)??
  • ????{??
  • ????????if(false?==?init?&&?null?!=?pool)//如果未初始化,且連接池可用??
  • ????????{??
  • ????????????dbname??=???db;??
  • ????????????user????=???u;??
  • ????????????psw?????=???p;??
  • ????????????if(test())??
  • ????????????{??
  • ????????????????init????=???true;??
  • ????????????????super.start();???
  • ????????????????return?true;??
  • ????????????}??
  • ????????????else?return?false;??
  • ????????}??
  • ????????else??
  • ????????????return?false;??
  • ????}??
  • ????public?synchronized?boolean?start(int?l,int?m,int?mc,String?db,String?u,String?p)??
  • ????{??
  • ????????if(l<0?||?m<0?||l>=m?||?m>mc)//0<l<m<=mc??
  • ????????????return?false;??
  • ????????if(false?==?init?&&?null?!=?pool)//如果未初始化,且連接池可用??
  • ????????{??
  • ????????????dbname??=???db;??
  • ????????????user????=???u;??
  • ????????????psw?????=???p;??
  • ????????????if(test())??
  • ????????????{??
  • ????????????????init????=???true;??
  • ????????????????lows?=?l<5?5:l;??//這里允許的最小的值為5??
  • ????????????????maxs?=?m<10?10:m;?//這里允許的最小的值為10??
  • ????????????????maxc?=?mc<20??20:mc;//這里允許的連接數??
  • ????????????????super.start();???
  • ????????????????return?true;??
  • ????????????}??
  • ????????????else???
  • ????????????????return?false;??
  • ????????}??
  • ????????else??
  • ????????????return?false;??
  • ????}??
  • ????/*?
  • ?????*從連接池得到一個連接?
  • ?????*/??
  • ????public?synchronized?Connection?getConnection()??
  • ????{??
  • ??????????
  • ????????if(init)??
  • ????????{??
  • ????????????ConInfo?c?=?getOneConnection();??
  • ????????????return?c!=null?c.con:null;//安全得到一個連接??
  • ????????}??
  • ????????else??
  • ????????????return?null;??
  • ????}??
  • ????/*?
  • ?????*得到一個連接,包含了lastTime信息?
  • ?????*/??
  • ????protected?synchronized?ConInfo?getOneConnection()??
  • ????{??
  • ????????if(pool.size()!=0)??
  • ????????{??
  • ????????????return?pool.remove(0);??
  • ????????}??
  • ????????else?//如果連接池為空,創建新的連接??
  • ????????{??
  • ????????????if(debug)?System.out.println("new?connection!");??
  • ????????????return?newConInfo();??
  • ????????}??
  • ????}??
  • ????/*?
  • ?????*將一個連接放回到連接池中?
  • ?????*/??
  • ????public?synchronized?boolean?freeConnection(Connection?con)??
  • ????{??
  • ????????if(init==false?||?con?==?null?)//當沒有init或者已經close之后?不應該free它進來。??
  • ????????????return?false;??
  • ????????ConInfo?c?=??new?ConInfo(con);//調用了ConInfo的構造函數??
  • ????????pool.add(c);??
  • ????????return?true;??
  • ????}??
  • ????/*?
  • ?????*將內容清空?
  • ?????*且將本連接池對象置為無用狀態?
  • ?????*/??
  • ????public?synchronized??boolean?close()??
  • ????{??
  • ????????if(init)??
  • ????????{??
  • ????????????init?=?false;??
  • ????????????for(int?i?=?0;?i?<pool.size();i++)??
  • ????????????????pool.get(i).close();??
  • ????????????pool.clear();??
  • ????????????pool????=???null;//將此連接池置為無用狀態。如果要新的鏈接池,重新創建鏈接池對象??
  • ????????????dbname??=???null;??
  • ????????????user????=???null;??
  • ????????????psw?????=???null;??
  • ????????????return?true;??
  • ????????}??
  • ????????else???
  • ????????????return?false;??
  • ????}??
  • ?????
  • ??
  • ????/*?
  • ?????*下面將是一個一線程執行體,當start連接池服務之后,由它來維護?
  • ?????*連接池里面的連接,從而保證他們能被正確的創建、注銷?
  • ?????*?
  • ?????*/??
  • ????public?void?run()??
  • ????{??
  • ????????final?long?sleepTime?=?2*1000??;?//2秒???
  • ????????final?long?refreshTime?=?10*60*1000;?//10分鐘運行一次。連接是否應該被更新??
  • ????????final?long?lowsCheckTime?=?2*1000;//10秒檢查一次。最低連接數檢查間隔時間??
  • ????????final?long?maxsCheckTime?=?60*1000;//1分鐘檢查一次。最大連接數時間??
  • ????????long?loop?=?0;??
  • ????????while(true)??
  • ????????{??
  • ????????????if(loop%refreshTime?==?0)??
  • ????????????{??
  • ????????????????if(debug)?System.out.println("call?refresh:"+pool.size());??
  • ????????????????refreshByTimeDiff();??
  • ????????????}??
  • ????????????if(loop%maxsCheckTime?==?0)??
  • ????????????{??
  • ????????????????if(debug)?System.out.println("call?toMaxs:"+pool.size());??
  • ????????????????toMaxs();??
  • ????????????}??
  • ????????????if(loop%lowsCheckTime?==?0)??
  • ????????????{??
  • ????????????????if(debug)?System.out.println("conCnt:"+conCount+"?call?toLows:"+pool.size());??
  • ????????????????toLows();??
  • ????????????}??
  • ????????????loop?+=?sleepTime;//更新loop的時間。??
  • ????????????try{??
  • ????????????????sleep(sleepTime);??
  • ????????????}??
  • ????????????catch(Exception?e){??
  • ????????????????e.printStackTrace();??
  • ????????????????stop();??
  • ????????????}??
  • ??????????????
  • ????????}??
  • ??????????
  • ????}??
  • ????/*?
  • ?????*使過小的空閑連接數恢復到lows?
  • ?????*/??
  • ????protected?void?toLows()??
  • ????{??
  • ????????int?size?=?pool.size();??
  • ????????/*?
  • ?????????*這里要避免直接使用pool.size進行判斷?
  • ?????????*當連接一直被get出去之后,size很難達到lows,故此?
  • ?????????*/??
  • ????????for(;size<lows;size++)??
  • ????????{??
  • ????????????if(debug)?System.out.println("toLows?is?running!");??
  • ????????????ConInfo?c?=??newConInfo();??
  • ????????????if(c!=null)??
  • ????????????????synchronized(pool)??
  • ????????????????{??
  • ????????????????????pool.add(c);??
  • ????????????????}??
  • ????????}??
  • ????}??
  • ????/*?
  • ?????*使過多的空閑連接數恢復到maxs;?
  • ?????*/??
  • ????protected?void?toMaxs()??
  • ????{??
  • ????????int?size?=?pool.size();??
  • ????????for(;size>maxs;size--)??
  • ????????{??
  • ????????????if(debug)?System.out.println("toMaxs?is?running!");??
  • ????????????try{??
  • ????????????????getConnection().close();??
  • ????????????????synchronized(conCount)//這里修改要同步好。??
  • ????????????????{??
  • ????????????????????conCount?--;??
  • ????????????????}??
  • ????????????}??
  • ????????????catch(Exception?e)??
  • ????????????{??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????/*?
  • ?????*查找當前的連接池,找到timeDiff時間內未使用過的連接,刪除它們,如果連接數不足,將由toLows補齊?
  • ?????*一個危險的線程不安全函數?
  • ?????*/??
  • ????public?void?refreshByTimeDiff()??
  • ????{??
  • ????????Calendar?nowTime?=?Calendar.getInstance();??
  • ????????long?now?=?nowTime.getTimeInMillis();??
  • ????????for(int?i=0;i<pool.size();i++)??
  • ????????{??
  • ????????????ConInfo?c?=?getOneConnection();??
  • ????????????if(now??-?c.lastTime.getTimeInMillis()?>=timeDiff)//刪除它們??
  • ????????????{??
  • ????????????????if(debug)?System.out.println("refresh?the?pool!,,,,,,,,");??
  • ????????????????synchronized(pool)//獲得pool的鎖??
  • ????????????????{??
  • ????????????????????pool.remove(i).close();//使用了ConInfo中的關閉函數??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????/*?
  • ?????*一個測試數據庫連接是否可用的函數?
  • ?????*/??
  • ????protected?boolean?test()??
  • ????{??
  • ????????int?cnt?=?10;??
  • ????????Connection?c;??
  • ????????do{??
  • ????????????c?=?newConnection();??
  • ????????????cnt?--?;??
  • ????????}while(c==null?&&?cnt>=0);??
  • ????????if(c!=null)??
  • ????????{??
  • ????????????(new?ConInfo(c)).close();??
  • ????????????return?true;??
  • ????????}??
  • ????????else??
  • ????????????return?false;??
  • ??????????????
  • ????}??
  • ??
  • ????/*?
  • ?????*下面為內置的類,用于表明一個連接最后使用時間?
  • ?????*/??
  • ????class?ConInfo??
  • ????{??
  • ????????protected?Calendar?lastTime;????//連接最后使用時間??
  • ????????protected?Connection?con?=?null;????//對應的connection??
  • ????????public?ConInfo(Connection?c)??
  • ????????{??
  • ????????????con?=???c;??
  • ????????????lastTime?=?Calendar.getInstance();??
  • ????????}??
  • ????????public?synchronized?void?close()??
  • ????????{??
  • ????????????try??
  • ????????????{??
  • ????????????????if(con!=null)??
  • ????????????????????con.close();??
  • ????????????????synchronized(conCount)??
  • ????????????????{??
  • ????????????????????conCount-=con!=null?1:0;??
  • ????????????????}??
  • ????????????????lastTime?=?null;??
  • ????????????}??
  • ????????????catch(Exception?e)??
  • ????????????{??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????/*?
  • ?????*創建一個新的連接?
  • ?????*/??
  • ????protected??Connection?newConnection()??
  • ????{??
  • ????????try??
  • ????????{??
  • ????????????Class.forName("com.mysql.jdbc.Driver");??
  • ????????????int?cnt?=?0;??
  • ????????????Connection?c?=?null;??
  • ????????????synchronized(conCount)??
  • ????????????{??
  • ????????????????if(conCount<=maxc)//當連接數沒超過既定最大連接數時??
  • ????????????????do??
  • ????????????????{??
  • ????????????????????try{??
  • ????????????????????c?=?DriverManager.getConnection(dbname,user,psw);??
  • ????????????????????}catch(Exception?es){c=null;if(debug)?System.out.println("create?new?connection?error!");}??
  • ????????????????????cnt++;??
  • ????????????????}while(null?==?c??&&?cnt<3);??
  • ????????????????conCount+=c!=null?1:0;??
  • ????????????}??
  • ????????????return?c;//創建一個新的connection??
  • ????????}??
  • ????????catch(Exception?e)??
  • ????????{??
  • ????????????e.printStackTrace();??
  • ????????????return?null;??
  • ????????}??
  • ????}??
  • ????/*?
  • ?????*得到一個新的連接?
  • ?????*/??
  • ????protected?ConInfo?newConInfo()??
  • ????{??
  • ????????Connection?c?=?newConnection();??
  • ????????if(c==null)??
  • ????????????return?null;??
  • ????????return?new?ConInfo(c);??
  • ????}??
  • ??
  • ????/*?
  • ?????*測試函數main?
  • ?????*/??
  • ????public?static?void?main(String[]?argvs)??
  • ????{??
  • ????????ListPool?pool?=?new?ListPool();??
  • ????????Connection?con?=?null;??
  • ????????boolean?flag?=?pool.start("jdbc:mysql://localhost/finance","root","");??
  • ????????int?cnt?=?10000;//1萬次??
  • ????????long?t0??=?Calendar.getInstance().getTimeInMillis();??
  • ????????/測試選項??
  • ????????final?boolean?tflag?=?true?;//如為true?為使用連接池??否則直接創建一個新連接。??
  • ????????//??
  • ????????while(flag){??
  • ??????????
  • ????????????con?=?tflag???pool.getConnection():pool.newConnection();//;??
  • ????????????try??
  • ????????????{?????
  • ????????????????Statement?stm?=?con.createStatement();??
  • ????????????????ResultSet?rev?=?stm.executeQuery("select?*?from?user");??
  • ????????????????while(false?&&?rev!=null?&&?rev.next())??
  • ????????????????{??
  • ????????????????????System.out.println(rev.getString("id"));??
  • ????????????????}??
  • ????????????????stm.close();??
  • ????????????}??
  • ????????????catch(Exception?e)??
  • ????????????{??
  • ????????????????e.printStackTrace();??
  • ??????????????????
  • ????????????}??
  • ????????//??if(Math.abs(Math.random())%10<4)??
  • ????????????if(tflag)//使用完之后要釋放,否則會出大問題??
  • ????????????????pool.freeConnection(con);??
  • ????????????try{??
  • ????????????????if(!tflag)??
  • ????????????????????con.close();//釋放連接?當不用pool時??
  • ????????????}??
  • ????????????catch(Exception?exx)??
  • ????????????{??
  • ????????????????exx.printStackTrace();??
  • ????????????}??
  • ????????????/*?
  • ????????????try{?
  • ????????????????sleep(100);?///間隔時間?
  • ????????????}?
  • ????????????catch(Exception?ee)?
  • ????????????{?
  • ????????????????ee.printStackTrace();?
  • ????????????}?
  • ????????????*/??
  • ????????//??System.out.println("cnt:"+cnt);??
  • ????????//??System.out.println("con_Cnt:"+pool.getConCount());??
  • ????????????if(--cnt<0)??
  • ????????????????break;??
  • ????????}??
  • ????????System.out.println("used?time:"+(Calendar.getInstance().getTimeInMillis()-t0));??
  • ????}??
  • }??
  • /*?
  • ?*?
  • use?the?pool;?
  • cnt:3?
  • cnt:2?
  • cnt:1?
  • cnt:0?
  • used?time:11286?
  • ---用了11.286秒?
  • cnt:9?
  • cnt:8?
  • cnt:7?
  • cnt:6?
  • cnt:5?
  • cnt:4?
  • cnt:3?
  • cnt:2?
  • cnt:1?
  • cnt:0?
  • used?time:129376?
  • 用了129.376秒(多了整整十倍)。?
  • -------listPool?
  • used?time:10995?
  • */??
  • ?

    ?

    ?

    ?

    ?

    一個測試類:testPool

    ?

    [java]?view plaincopy
  • /**?
  • ?*?@(#)testPool.java?
  • ?*?
  • ?*?
  • ?*?@author??
  • ?*?@version?1.00?2010/5/15?
  • ?*/??
  • package??mysql;??
  • import?java.sql.*;??
  • import?java.util.*;??
  • import?mysql.*;??
  • public?class?testPool?extends?Thread??
  • {??
  • ????protected??String?dbname?=?null,??
  • ????????????????????????user?=?null,??
  • ????????????????????????psw??=?null;??
  • ????Pool?pool=?null;??
  • ????boolean?flag?=?true;??
  • ????public?testPool(Pool?p,boolean?f,String?d,String?u,String?pw)???
  • ????{??
  • ????????pool?=?p;??
  • ????????flag?=?f;??
  • ????????dbname?=?d;??
  • ????????user?=?u;??
  • ????????psw?=?pw;??
  • ????}??
  • ????public?void?start(int?n)??
  • ????{??
  • ????????while(n-->0)??
  • ????????{??
  • ????????????super.start();??
  • ????????}??
  • ????}??
  • ????public?void?run()??
  • ????{??
  • ????????long?id?=?this.getId();??
  • ????????Connection?con?=?null;??
  • ????????int?cnt?=?100;//1萬次??
  • ????????long?t0??=?Calendar.getInstance().getTimeInMillis();??
  • ????????/測試選項??
  • ????????final?boolean?tflag?=?true?;//如為true?為使用連接池??否則直接創建一個新連接。??
  • ????????//??
  • ????????while(flag){??
  • ??????????
  • ????????????con?=?tflag???pool.getConnection():newConnection();//;??
  • ????????????if(con?==?null)?continue;??
  • ????????????try??
  • ????????????{?????
  • ????????????????Statement?stm?=?con.createStatement();??
  • ????????????????ResultSet?rev?=?stm.executeQuery("select?*?from?user");??
  • ????????????????while(false?&&?rev!=null?&&?rev.next())??
  • ????????????????{??
  • ????????????????????System.out.println(rev.getString("id"));??
  • ????????????????}??
  • ????????????????stm.close();??
  • ????????????}??
  • ????????????catch(Exception?e)??
  • ????????????{??
  • ????????????????e.printStackTrace();??
  • ??????????????????
  • ????????????}??
  • ????????//??if(Math.abs(Math.random())%10<4)??
  • ????????????if(tflag)//使用完之后要釋放,否則會出大問題??
  • ????????????????pool.freeConnection(con);??
  • ????????????try{??
  • ????????????????if(!tflag)??
  • ????????????????????con.close();//釋放連接?當不用pool時??
  • ????????????}??
  • ????????????catch(Exception?exx)??
  • ????????????{??
  • ????????????????exx.printStackTrace();??
  • ????????????}??
  • ????????????/*?
  • ????????????try{?
  • ????????????????sleep(100);?///間隔時間?
  • ????????????}?
  • ????????????catch(Exception?ee)?
  • ????????????{?
  • ????????????????ee.printStackTrace();?
  • ????????????}?
  • ????????????*/??
  • ????????//??System.out.println("threadId:"+id+"??cnt:"+cnt);??
  • ???????????//System.out.println("con_Cnt:"+((Pool)pool).getConCount());??
  • ????????????if(--cnt<0)??
  • ????????????????break;??
  • ????????}??
  • ????????System.out.println("used?time:"+(Calendar.getInstance().getTimeInMillis()-t0));??
  • ????}??
  • ????public?Connection?newConnection()??
  • ????{??
  • ????????try??
  • ????????{??
  • ????????????Class.forName("com.mysql.jdbc.Driver");??
  • ????????????int?cnt?=?0;??
  • ????????????Connection?c?=?null;??
  • ????????????do??
  • ????????????{??
  • ????????????????c?=?DriverManager.getConnection(dbname,user,psw);??
  • ????????????????cnt++;??
  • ????????????}while(null?==?c?&&?cnt<15);??
  • ????????????if(null?==?c)??
  • ????????????????return?null;??
  • ????????????else??
  • ????????????????return?c;//創建一個新的connection??
  • ????????}??
  • ????????catch(Exception?e)??
  • ????????{??
  • ????????????e.printStackTrace();??
  • ????????????return?null;??
  • ????????}??
  • ????}??
  • ????public?static?void?main(String?argv[])??
  • ????{??
  • ????????Pool?pool?=?null;??
  • ????????boolean?who?=?true;??
  • ????????pool?=?who???new?VectorPool()?:?new?ListPool();??
  • ????????boolean?flag?=?pool.start(20,30,100,"jdbc:mysql://localhost/finance","root","");??
  • ????????int?cnt?=?100;??
  • ????????while(cnt-->0)??
  • ????????{??
  • ????????????testPool?p?=?new?testPool(pool,flag,"jdbc:mysql://localhost/finance","root","");??
  • ????????????p.start();??
  • ????????}?????
  • ????
  • ????}??
  • ??????
  • }??
  • /*?
  • ?*測試結果表明,當100*100時,Pool要略優于ListPool(差異不大,如下)?
  • ?*?
  • Pool:?
  • used?time:4967?
  • used?time:4997?
  • used?time:5017?
  • used?time:5218?
  • used?time:5558?
  • used?time:4937?
  • used?time:4977?
  • used?time:5107?
  • used?time:5378?
  • used?time:5368?
  • used?time:5408?
  • 2:?
  • used?time:5779?
  • used?time:6049?
  • used?time:6269?
  • used?time:6269?
  • used?time:6209?
  • used?time:6009?
  • ListPool?
  • used?time:5788?
  • used?time:6148?
  • used?time:5589?
  • used?time:5819?
  • used?time:5619?
  • used?time:6089?
  • used?time:5558?
  • used?time:6029?
  • used?time:5629?
  • 2?
  • used?time:5158?
  • used?time:5188?
  • used?time:5808?
  • used?time:5117?
  • used?time:5648?
  • used?time:5718?
  • used?time:5668?
  • used?time:5868?
  • used?time:5908?
  • used?time:5948?
  • used?time:5958?
  • used?time:5828?
  • used?time:5969?
  • used?time:5979?
  • used?time:6329?
  • used?time:6089?
  • ?*/??
  • ?

    轉載于:https://www.cnblogs.com/jiushini/archive/2012/06/05/2535595.html

    總結

    以上是生活随笔為你收集整理的java 数据库连接池的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。