功能完善的Java連接池調(diào)用實(shí)例_第1頁
功能完善的Java連接池調(diào)用實(shí)例_第2頁
功能完善的Java連接池調(diào)用實(shí)例_第3頁
功能完善的Java連接池調(diào)用實(shí)例_第4頁
功能完善的Java連接池調(diào)用實(shí)例_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

功能完善的Java連接池調(diào)用實(shí)例/**Title:ConnectPool.javaDescriptio^:接池管理器Copyright:Copyright(c)2002/12/25Company:Author:Version2.0*/importjava.io.*;importjava.sql.*;importjava.util.*;importjava.util.Date;/***管理類DBConnectionManager支持對一個(gè)或多個(gè)由屬性文件定義的數(shù)據(jù)庫連接*池的訪問?客戶程序可以調(diào)用getInstanc方法訪問本類的唯一實(shí)例*/publicclassConnectPool{staticpublicConnectPoolinst唯一實(shí)例staticpublicintclients;publicectordrivers=newtVr()驅(qū)/動(dòng)publicPrintWriterlog;publicHashtablepools=newHashta連接);///***返回唯一實(shí)例.如果是第一次調(diào)用此方法,則創(chuàng)建實(shí)例**@returnDBConnectionManage唯一實(shí)例*/staticsynchronizedpublicConnectPoolgetInstance(){if(instance==null){instance=newConnectPool();}clients++;/***建構(gòu)函數(shù)私有以防止其它對象創(chuàng)建本類實(shí)例*/publicConnectPool(){init();}/***將連接對象返回給由名字指定的連接池*@paramname在屬性文件中定義的連接池名字@paramcon連接對象*/publicvoidfreeConnection(Stringname,Connectioncon){DBConnectionPoolpool=(DBConnectionPool)pools.get(name);if(pool!=null){pool.freeConnection(con);}else{System.out.println("pool==null");}clients--;}/***獲得一個(gè)可用的(空閑的)連接.如果沒有可用連接,且已有連接數(shù)小于最大連接數(shù)*限制,則創(chuàng)建并返回新連接*@paramname在屬性文件中定義的連接池名字@returnConnectic可用連接或null*/publicConnectiongetConnection(Stringname){DBConnectionPoolpool=(DBConnectionPool)pools.get(name);if(pool!=null){//returnpool.getConnection();returnnull;}/***獲得一個(gè)可用連接.若沒有可用連接,且已有連接數(shù)小于最大連接數(shù)限制,*則創(chuàng)建并返回新連接.否則,在指定的時(shí)間內(nèi)等待其它線程釋放連接.*@paramname連接池名字@paramtime以毫秒計(jì)的等待時(shí)間@returnConnectic可用連接或null*/publicConnectiongetConnection(Stringname,longtime){DBConnectionPoolpool=(DBConnectionPool)pools.get(name);if(pool!=null){returnpool.getConnection(time);}}/***關(guān)閉所有連接,撤銷驅(qū)動(dòng)程序的注冊*/publicsynchronizedvoidrelease(){//等待直到最后一個(gè)客戶程序調(diào)用if(--clients!=0){return;}EnumerationallPools=pools.elements();while(allPools.hasMoreElements()){DBConnectionPoolpool=(DBConnectionPool)allPools.nextElement();pool.release();}EnumerationallDrivers=drivers.elements();while(allDrivers.hasMoreElements()){Driverdriver=(Driver)allDrivers.nextElement();try{DriverManager.deregisterDriver(driver);log(撤銷JDBC驅(qū)動(dòng)程序"+driver.getClass().getNa的注冊"");}catch(SQLExceptione){log(e,"無法撤銷下列JDBC驅(qū)動(dòng)程序的注冊:〃+driver.getClass().getName());}}}/***根據(jù)指定屬性創(chuàng)建連接池實(shí)例.**@paramprops連接池屬性*/privatevoidcreatePools(Propertiesprops){EnumerationpropNames=pertyNames();{Stringname=(String)propNames.nextElement();if(name.endsWith(".url")){StringpoolName=name.substring(0,name.lastIndexOf("."));Stringurl=props.getProperty(poolName+".url");if(url==null){log(沒有為連接池〃+poolName+指定URL〃);continue;}Stringuser=props.getProperty(poolName+".user");Stringpassword=props.getProperty(poolName+".password");Stringmaxconn=props.getProperty(poolName+".maxconn","0");intmax;try{max=Integer.valueOf(maxconn).intValue();}catch(NumberFormatExceptione){log(錯(cuò)誤的最大連接數(shù)限制:"+maxconn+連接池:"+poolName);max=0;}DBConnectionPoolpool=newDBConnectionPool(poolName,url,user,password,max);pools.put(poolName,pool);log(成功創(chuàng)建連接池"+poolName);}}}/***讀取屬性完成初始化*/privatevoidinit(){try{Propertiesp=newProperties();Stringconfigs=System.getProperty("user.dir")+"perties";System.out.println("configsfilelocalat"+configs);FileInputStreamis=newFileInputStream(configs);PropertiesdbProps=newProperties();try{dbProps.load(is);}catch(Exceptione){System.err.print不能讀取屬性文件? +〃請確保perti在CLASSPATH指定的路徑中");return;}String logFile = dbProps.getProperty("logfile","DBConnectionManager.log");try{log=newPrintWriter(newFileWriter(logFile,true),true);}catch(IOExceptione){System.err.prin無法打開日志文件:"+logFile);log=newPrintWriter(System.err);}loadDrivers(dbProps);createPools(dbProps);}catch(Exceptione){}}/***裝載和注冊所有JDBC驅(qū)動(dòng)程序**@parampropS屬性*/privatevoidloadDrivers(Propertiesprops){StringdriverClasses=props.getProperty("drivers");StringTokenizerst=newStringTokenizer(driverClasses);while(st.hasMoreElements()){StringdriverClassName=st.nextToken().trim();try{Driverdriver=(Driver)Class.forName(driverClassName).newInstance();DriverManager.registerDriver(driver);drivers.addElement(driver);System.out.println(driverClassName);log(成功注冊JDBC驅(qū)動(dòng)程序"+driverClassName);}catch(Exceptione){log(無法注冊JDBC驅(qū)動(dòng)程序:〃+driverClassName+"錯(cuò),誤:"+e);}}}/***將文本信息寫入日志文件*/privatevoidlog(Stringmsg){log.println(newDate()+":"+msg);}/***將文本信息與異常寫入日志文件*/privatevoidlog(Throwablee,Stringmsg){log.println(newDate()+":"+msg);e.printStackTrace(log);/***此內(nèi)部類定義了一個(gè)連接池.它能夠根據(jù)要求創(chuàng)建新連接,直到預(yù)定的最*大連接數(shù)為止.在返回連接給客戶程序之前,它能夠驗(yàn)證連接的有效性.*/classDBConnectionPool{//privateintcheckedOut;privateeVctorfreeConnections=neecwtoVr();privateintmaxConn;privateStringname;privateStringpassword;privateStringURL;privateStringuser;/***創(chuàng)建新的連接池@paramname連接池名字@paramURL數(shù)據(jù)庫的JDBCURL@paramuser數(shù)據(jù)庫帳號,或null@parampassword密碼,或null@parammaxConn此連接池允許建立的最大連接數(shù)*/publicDBConnectionPool(Strinngame,StringURL,Stringuser,Stringpassword,intmaxConn){=name;this.URL=URL;this.user=user;this.password=password;this.maxConn=maxConn;}/***將不再使用的連接返回給連接池**@paramcon客戶程序釋放的連接*/publicsynchronizedvoidfreeConnection(Connectioncon){//將指定連接加入到向量末尾try{if(con.isClosed()){System.out.println(f"rbeefCoornenectionconisclosed");}freeConnections.addElement(con);Connectioncontest=(Connection)freeConnections.lastElement();if(contest.isClosed()){System.out.println("afterfreeConnectioncontestclosed");}notifyAll();}catch(SQLExceptione){System.out.println(e);}}/***從連接池獲得一個(gè)可用連接.如沒有空閑的連接且當(dāng)前連接數(shù)小于最大連接*數(shù)限制,則創(chuàng)建新連接.如原來登記為可用的連接不再有效,則從向量刪除之,*然后遞歸調(diào)用自己以嘗試新的可用連接.*/publicsynchronizedConnectiongetConnection(){if(freeConnections.size()>0){//獲取向量中第一個(gè)可用連接con=(Connection)freeConnections.firstElement();freeConnections.removeElementAt(0);try{if(con.isClosed()){log(從連接池"+name+刪除一個(gè)無效連接");System.out.print從連接池"+name+刪除一個(gè)無效連接");//遞歸調(diào)用自己,嘗試再次獲取可用連接con=getConnection();}}catch(SQLExceptione){log(從連接池"+name+刪除一個(gè)無效連接時(shí)錯(cuò)誤");System.out.print從連接池"+name+刪除一個(gè)無效連接出錯(cuò)");//遞歸調(diào)用自己,嘗試再次獲取可用連接con=getConnection();}{System.out.print]刪除一個(gè)溢出連接“);releaseOne();}}elseif((maxConn==0)||(freeConnections.size()<maxConn)){con=newConnection();}returncon;}publicsynchronizedConnectionreturnConnection(){Connectioncon=null;//如果閑置小于最大連接,返回一個(gè)新連接if(freeConnections.size()<maxConn){//如果閑置大于最大連接,返回一個(gè)可用的舊連接elseif(freeConnections.size()>=maxConn){con=(Connection)freeConnections.firstElement();System.out.println(["a連接池可用連接數(shù)]"+"["+freeConnections.size()+"]");freeConnections.removeElementAt(0);System.out.println(["b連接池可用連接數(shù)]"+"["+freeConnections.size()+"]");try{if(con.isClosed()){log(從連接池"+name+刪除一個(gè)無效連接");System.out.print從連接池"+name+刪除一個(gè)無效連接");returnConnection();}}catch(SQLExceptione){log(從連接池"+name+刪除一個(gè)無效連接時(shí)錯(cuò)誤");System.out.print從連接池"+name+刪除一個(gè)無效連接出錯(cuò)");returnConnection();}}returncon;}/***從連接池獲取可用連接.可以指定客戶程序能夠等待的最長時(shí)間參見前一個(gè)getConnectior方法.**@paramtimeout以毫秒計(jì)的等待時(shí)間限制*/publicsyrchrorizedCorrectiorgetCorrectior(lorgtimeout){lorgstartTime=rewDate().getTime();Correctiorcor;while((cor=getCorrectior())==rull){try{wait(timeout);}catch(InterruptedExceptione){}if((newDate().getTime()-startTime)>=timeout){//wait返回的原因是超時(shí)returnnull;}}returncon;}/***關(guān)閉所有連接*/publicsynchronizedvoidrelease(){EnumerationallConnections=freeConnections.elements();while(allConnections.hasMoreElements()){Connectioncon=(Connection)allConnections.nextElement();try{con.close();log(關(guān)閉連接池"+name+中的一個(gè)連接");}catch(SQLExceptione){log(e,無"法關(guān)閉連接池"+name+中的連接");}}freeConnections.removeAllElements();}/***關(guān)閉一個(gè)連接*/publicsynchronizedvoidreleaseOne(){if(freeConnections.firstElement()!=null){Connectioncon=(Connection)freeConnections.firstElement();try{con.close();System.out.print$n閉連接池"+name+中的一個(gè)連接");log(關(guān)閉連接池"+name+中的一個(gè)連接");}catch(SQLExceptione){System.out.printlB法關(guān)閉連接池〃+name+中的一個(gè)連接〃);log(e,無法關(guān)閉連接池〃+name+中的連接〃);}}else{System.out.println("releasebOunge.(.) }}/***創(chuàng)建新的連接*/privateConnectionnewConnection(){Connectioncon=null;try{if(user==null){con=DriverManager.getConnection(URL);else{con=DriverManager.getConnection(URL,user,password);}log(連接池"+name+創(chuàng)建一個(gè)新的連接");}catch(SQLExceptione){log(e,無法創(chuàng)建下列URL的連接:〃+URL);returnnull;}returncon;}}}/**Title:ConnectPool.javaDescriptioj^:據(jù)庫操作Copyright:Copyright(c)2002/12/25Company:*Author:*remark:加入指針回滾*Version2.0*/importjava.io.*;importcom.sjky.pool.*;importjava.sql.*;importjava.util.*;importjava.util.Date;import.*;publicclassPoolManextendsConnectPool{privateConnectPoolconnMgr;privateStatementstmt;privateConnectioncon;privateResultSetrst;/***對象連接初始化**/publicConnectiongetPool(Stringname)throwsException{try{connMgr=ConnectPool.getInstance();con=connMgr.getConnection(name);}catch(Exceptione){System.err.prin不能創(chuàng)建連接!請嘗試重啟應(yīng)用服務(wù)器');}returncon;}/***同以上方法,加入連接空閑等待時(shí)間*待用方法**/publicConnectiongetPool_t(Stringname,longtime)throwsException{try{connMgr=ConnectPool.getInstance();con=connMgr.getConnection(name,time);}catch(Exceptione){System.err.prin不能創(chuàng)建連接!〃);}returncon;}/***執(zhí)行查詢方法1**/publicResultSetexecuteQuery(StringSqlStr)throwsException{ResultSetresult=null;try{stmt=con.createStatement();result=stmt.executeQuery(SqlStr);//hereaddonelinebyjnma12.11mit();}{thrownewExceptio執(zhí)行查詢語句出錯(cuò)“);}returnresult;}/***執(zhí)行查詢方法2**/publicResultSetgetRst(StringSqlStr)throwsException{//ResultSetresult=null;try{stmt =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSetCONCUR_UPDATABLE);rst=stmt.executeQuery(SqlStr);//hereaddonelinebyjnma12.11mit();}catch(java.sql.SQLExceptione){thrownewExceptio執(zhí)行查詢語句出錯(cuò)");}returnrst;}/***執(zhí)行更新**/publicintUpdate(StringSqlStr)throwsException{intresult=-1;try{stmt =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSetCONCUR_UPDATABLE);result=stmt.executeUpdate(SqlStr);//hereaddonelinebyjnma12.11mit();if(result==0)System.out.print執(zhí)行delete,update,insert出錯(cuò)");}{System.err.prin執(zhí)行"delete,update,insert出錯(cuò)〃);}returnresult;}/***執(zhí)行事務(wù)處理**/publicbooleanhandleTransacteicotno(rVSqlArray)throwsException{booleanresult=false;intArraySize=SqlArray.size();try{stmt=con.createStatement();con.setAutoCommit(false);System.out.println("ArraySizeis"+ArraySize);for(inti=0;i<ArraySize;i++){System.out.printl開始執(zhí)行語句〃+(String)SqlArray.elementAt(i));stmt.executeUpdate((String)SqlArray.elementAt(i));System.out.printl執(zhí)行成功");}mit();con.setAutoCommit(true必須/System.out.print事務(wù)執(zhí)行成功");result=true;}catch(java.sql.SQLExceptione){try{System.out.println(e.toString());System.out.print數(shù)n據(jù)庫操作失敗");con.rollback();}catch(java.sql

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論