




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)庫連接池技術(shù)1連接池原理連接池技術(shù)的核心思想是:連接復(fù)用,通過建立一個(gè)數(shù)據(jù)庫連接池以及一套連接使用、分配、治理策略,使得該連接池中的連接可以得到高效、安全的復(fù)用,避免了數(shù)據(jù)庫連接頻繁建立、關(guān)閉的開銷。另外,由于對(duì)JDBC中的原始連接進(jìn)行了封裝,從而方便了數(shù)據(jù)庫應(yīng)用對(duì)于連接的使用(非凡是對(duì)于事務(wù)處理),提高了開發(fā)效率,也正是因?yàn)檫@個(gè)封裝層的存在,隔離了應(yīng)用的本身的處理邏輯和具體數(shù)據(jù)庫訪問邏輯,使應(yīng)用本身的復(fù)用成為可能。連接池主要由三部分組成:連接池的建立、連接池中連接的使用治理、連接池的關(guān)閉。下面就著重討論這三部分及連接池的配置問題。1.1連接池的建立應(yīng)用程序中建立的連接池其實(shí)是一個(gè)靜態(tài)的。所謂靜態(tài)連接池是指連接池中的連接在系統(tǒng)初始化時(shí)就已分配好,且不能隨意關(guān)閉連接。Java中提供了很多容器類可以方便的構(gòu)建連接池,如:Vector、Stack、Servlet、Bean等,通過讀取連接屬性文件Cperties與數(shù)據(jù)庫實(shí)例建立連接。在系統(tǒng)初始化時(shí),根據(jù)相應(yīng)的配置創(chuàng)建連接并放置在連接池中,以便需要使用時(shí)能從連接池中獲取,這樣就可以避免連接隨意的建立、關(guān)閉造成的開銷。1.2連接池的治理連接池治理策略是連接池機(jī)制的核心。當(dāng)連接池建立后,如何對(duì)連接池中的連接進(jìn)行治理,解決好連接池內(nèi)連接的分配和釋放,對(duì)系統(tǒng)的性能有很大的影響。連接的合理分配、釋放可提高連接的復(fù)用,降低了系統(tǒng)建立新連接的開銷,同時(shí)也加速了用戶的訪問速度。下面介紹連接池中連接的分配、釋放策略。連接池的分配、釋放策略對(duì)于有效復(fù)用連接非常重要,我們采用的方法是一個(gè)很有名的設(shè)計(jì)模式:ReferenceCounting(引用記數(shù))。該模式在復(fù)用資源方面應(yīng)用的非常廣泛,把該方法運(yùn)用到對(duì)于連接的分配釋放上,為每一個(gè)數(shù)據(jù)庫連接,保留一個(gè)引用記數(shù),用來記錄該連接的使用者的個(gè)數(shù)。具體的實(shí)現(xiàn)方法是:當(dāng)客戶請(qǐng)求數(shù)據(jù)庫連接時(shí),首先查看連接池中是否有空閑連接(指當(dāng)前沒有分配出去的連接)。假如存在空閑連接,則把連接分配給客戶并作相應(yīng)處理(即標(biāo)記該連接為正在使用,引用計(jì)數(shù)加1)。假如沒有空閑連接,則查看當(dāng)前所開的連接數(shù)是不是已經(jīng)達(dá)到maxConn(最大連接數(shù)),假如沒達(dá)到就重新創(chuàng)建一個(gè)連接給請(qǐng)求的客戶;假如達(dá)到就按設(shè)定的maxWaitTime(最大等待時(shí)間)進(jìn)行等待,假如等待maxWaitTime后仍沒有空閑連接,就拋出無空閑連接的異常給用戶。當(dāng)客戶釋放數(shù)據(jù)庫連接時(shí),先判定該連接的引用次數(shù)是否超過了規(guī)定值,假如超過就刪除該連接,并判定當(dāng)前連接池內(nèi)總的連接數(shù)是否小于minConn(最小連接數(shù)),若小于就將連接池布滿;假如沒超過就將該連接標(biāo)記為開放狀態(tài),可供再次復(fù)用??梢钥闯稣沁@套策略保證了數(shù)據(jù)庫連接的有效復(fù)用,避免頻繁地建立、釋放連接所帶來的系統(tǒng)資源開銷。1.3連接池的關(guān)閉當(dāng)應(yīng)用程序退出時(shí),應(yīng)關(guān)閉連接池,此時(shí)應(yīng)把在連接池建立時(shí)向數(shù)據(jù)庫申請(qǐng)的連接對(duì)象統(tǒng)一歸還給數(shù)據(jù)庫(即關(guān)閉所有數(shù)據(jù)庫連接),這與連接池的建立正好是一個(gè)相反過程。1.4連接池的配置數(shù)據(jù)庫連接池中到底要放置多少個(gè)連接,才能使系統(tǒng)的性能更佳,用minConn和maxConn來限制。minConn是當(dāng)應(yīng)用啟動(dòng)的時(shí)候連接池所創(chuàng)建的連接數(shù),假如過大啟動(dòng)將變慢,但是啟動(dòng)后響應(yīng)更快;假如過小啟動(dòng)加快,但是最初使用的用戶將因?yàn)檫B接池中沒有足夠的連接不可避免的延緩了執(zhí)行速度。因此應(yīng)該在開發(fā)的過程中設(shè)定較小minConn,而在實(shí)際應(yīng)用的中設(shè)定較大minConn。maxConn是連接池中的最大連接數(shù),可以通過反復(fù)試驗(yàn)來確定此飽和點(diǎn)。為此在連接池類ConnectionPool中加入兩個(gè)方法getActiveSize()和getOpenSize(),ActiveSize表示某一時(shí)間有多少連接正被使用,OpenSize表示連接池中有多少連接被打開,反映了連接池使用的峰值。將這兩個(gè)值在日志信息中反應(yīng)出來,minConn的值應(yīng)該小于平均ActiveSize,而maxConn的值應(yīng)該在activeSize和OpenSize之間2數(shù)據(jù)庫連接池技術(shù)在Java中開源的數(shù)據(jù)庫連接池有以下幾種:C3P0C3P0是一個(gè)開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發(fā)布,包括了實(shí)現(xiàn)jdbc3和jdbc2擴(kuò)展規(guī)范說明的Connection和Statement池的DataSources對(duì)象。Proxool這是一個(gè)JavaSQLDriver驅(qū)動(dòng)程序,提供了對(duì)你選擇的其它類型的驅(qū)動(dòng)程序的連接池封裝??梢苑浅:唵蔚囊浦驳浆F(xiàn)存的代碼中。完全可配置??焖?,成熟,健壯??梢酝该鞯貫槟悻F(xiàn)存的JDBC驅(qū)動(dòng)程序增加連接池功能。JakartaDBCPDBCP是一個(gè)依賴Jakartacommons-pool對(duì)象池機(jī)制的數(shù)據(jù)庫連接池.DBCP可以直接的在應(yīng)用程序用使用。DDConnectionBrokerDDConnectionBroker是一個(gè)簡單,輕量級(jí)的數(shù)據(jù)庫連接池。DBPoolDBPool是一個(gè)高效的易配置的數(shù)據(jù)庫連接池。它除了支持連接池應(yīng)有的功能之外,還包括了一個(gè)對(duì)象池使你能夠開發(fā)一個(gè)滿足自已需求的數(shù)據(jù)庫連接池。XAPoolXAPool是一個(gè)XA數(shù)據(jù)庫連接池。它實(shí)現(xiàn)了javax.sql.XADataSource并提供了連接池工具。7,PrimrosePrimrose是一個(gè)Java開發(fā)的數(shù)據(jù)庫連接池。當(dāng)前支持的容器包括Tomcat4&5,Resin3與JBoss3.它同樣也有一個(gè)獨(dú)立的版本可以在應(yīng)用程序中使用而不必運(yùn)行在容器中。Primrose通過一個(gè)web接口來控制SQL處理的追蹤,配置,動(dòng)態(tài)池管理。在重負(fù)荷的情況下可進(jìn)行連接請(qǐng)求隊(duì)列處理。8,SmartPoolSmartPool是一個(gè)連接池組件,它模仿應(yīng)用服務(wù)器對(duì)象池的特性。SmartPool能夠解決一些臨界問題如連接泄漏(connectionleaks),連接阻塞,打開的JDBC對(duì)象如Statements,PreparedStatements等.SmartPool的特性包括支持多個(gè)pools,自動(dòng)關(guān)閉相關(guān)聯(lián)的JDBC對(duì)象,在所設(shè)定time-outs之后察覺連接泄漏,追蹤連接使用情況,強(qiáng)制啟用最近最少用到的連接,把SmartPool"包裝”成現(xiàn)存的一個(gè)pool等。MiniConnectionPoolManagerMiniConnectionPoolManager是一個(gè)輕量級(jí)JDBC數(shù)據(jù)庫連接池。它只需要Java1.5(或更高)并且沒有依賴第三方包。BoneCPBoneCP是一個(gè)快速,開源的數(shù)據(jù)庫連接池。幫你管理數(shù)據(jù)連接讓你的應(yīng)用程序能更快速地訪問數(shù)據(jù)庫。比C3P0/DBCP連接池快25倍。3常用開源數(shù)據(jù)庫連接池的實(shí)現(xiàn)方式現(xiàn)在常用的開源數(shù)據(jù)連接池主要有c3p0,dbcp,proxool和BoneCP四種,其中:---hibernate開發(fā)組推薦使用c3p0;---spring開發(fā)組推薦使用dbcp(dbcp連接池有weblogic連接池同樣的問題,就是強(qiáng)行關(guān)閉連接或數(shù)據(jù)庫重啟后,無法reconnect,告訴連接被重置,這個(gè)設(shè)置可以解決);---hibernateinaction推薦使用c3p0和proxool;下面一一介紹這三種數(shù)據(jù)庫連接池的使用方法和配置信息3.1Apache-DBCP:3.1.1相關(guān)的參數(shù)有:dataSource:要連接的datasource(通常我們不會(huì)定義在server.xml)defaultAutoCommit:對(duì)于事務(wù)是否autoCommit,默認(rèn)值為truedefaultReadOnly:對(duì)于數(shù)據(jù)庫是否只能讀取,默認(rèn)值為falsedriverClassName:連接數(shù)據(jù)庫所用的JDBCDriverClass,maxActive:可以從對(duì)象池中取出的對(duì)象最大個(gè)數(shù),為0則表示沒有限制,默認(rèn)為8maxIdle:最大等待連接中的數(shù)量,設(shè)0為沒有限制(對(duì)象池中對(duì)象最大個(gè)數(shù))minIdle:對(duì)象池中對(duì)象最小個(gè)數(shù)maxWait:最大等待秒數(shù),單位為ms,超過時(shí)間會(huì)丟出錯(cuò)誤信息password:登陸數(shù)據(jù)庫所用的密碼url:連接數(shù)據(jù)庫的URLusername:登陸數(shù)據(jù)庫所用的帳號(hào)validationQuery:驗(yàn)證連接是否成功,SQLSELECT指令至少要返回一行removeAbandoned:是否自我中斷,默認(rèn)是false
removeAbandonedTimeout:幾秒后會(huì)自我中斷,removeAbandoned必須為truelogAbandoned:是否記錄中斷事件,默認(rèn)為falseminEvictableldleTimeMillis:大于0,進(jìn)行連接空閑時(shí)間判斷,或?yàn)?,對(duì)空閑的連接不進(jìn)行驗(yàn)證;默認(rèn)30分鐘timeBetweenEvictionRunsMillis:失效檢查線程運(yùn)行時(shí)間間隔,如果小于等于0,不會(huì)啟動(dòng)檢查線程,默認(rèn)-1testOnBorrow:取得對(duì)象時(shí)是否進(jìn)行驗(yàn)證,檢查對(duì)象是否有效,默認(rèn)為falsetestOnReturn:返回對(duì)象時(shí)是否進(jìn)行驗(yàn)證,檢查對(duì)象是否有效,默認(rèn)為falsetestWhileIdle:空閑時(shí)是否進(jìn)行驗(yàn)證,檢查對(duì)象是否有效,默認(rèn)為false3.1.2實(shí)現(xiàn):initialSize:初始化線程數(shù)首先下載DBCP所需JAR包,/commons/3bcp/有pool包,/commons/pool/如果下載的pool包是1.2的版本,還要下載common-collections包,/commons/collections/WEB項(xiàng)目中實(shí)現(xiàn):我的實(shí)現(xiàn)方式是將包引入之后,在spring中注入,部分代碼如下,完整代碼見DBCP_Demo<beanid="dataSource"class="mons.dbcp.BasicDataSource"destroy-method="close"><propertyname="driverClassName"><value>com.mysql.jdbc.Driver</value></property><propertyname="url"><value>jdbc:mysql://:3306/ConnTest?useUnicode=true&characterEncoding=GBK</value></property><propertyname="username"><value>root</value></property><propertyname="password"><value>root</value></property><propertyname="initialSize"><value>50</value></property><propertyname="maxActive"><value>100</value></property><propertyname="maxIdle"><value>50</value></property><propertyname="minIdle"><value>10</value></property>3.1.2實(shí)現(xiàn):</bean>JAVA項(xiàng)目中實(shí)現(xiàn):DBCP.java:publicclassDBCP{privatestaticBasicDataSourcedataSource=null;publicDBCP(){}publicstaticvoidinit(){if(dataSource!=null){try{dataSourc.close();}catch(Exceptione){//}dataSource=null;}try{Propertiesp=newProperties();p.setProperty(〃driverClassName〃,〃com.mysql.jdbc.Driver〃);p.setProperty(〃url〃,〃jdbc:mysql://:3306/ConnTest?useUnicode=true&characterEncoding=GBK〃);p.setProperty(〃password〃,"root");p.setProperty(〃username〃,"root");p.setProperty("maxActive","200”);p.setProperty("maxIdle”,"50");p.setProperty("minIdle”,"30");p.setProperty("initialSize”,"30");dataSource=(BasicDataSource)BasicDataSourceFactory.createDataSourc(p);}catch(Exceptione){}}publicstaticsynchronizedConnectiongetConnection()throwsSQLException{returndataSourc.getConnection();C3P03.2.1相關(guān)的參數(shù)有:acquireIncrement:當(dāng)連接池中的連接耗盡的時(shí)候c3p0一次同時(shí)獲取的連接數(shù)。Default:3acquireRetryAttempts:定義在從數(shù)據(jù)庫獲取新連接失敗后重復(fù)嘗試的次數(shù)。Default:30acquireRetryDelay:兩次連接中間隔時(shí)間,單位毫秒。Default:1000autoCommitOnClose:連接關(guān)閉時(shí)默認(rèn)將所有未提交的操作回滾。Default:falseautomaticTestTable:c3p0將建一張名為Test的空表,并使用其自帶的查詢語句進(jìn)行測試。如果定義了這個(gè)參數(shù)那么屬性preferredTestQuery將被忽略。你不能在這張Test表上進(jìn)行任何操作,它將只供c3p0測試使用。Default:nullbreakAfterAcquireFailure:獲取連接失敗將會(huì)引起所有等待連接池來獲取連接的線程拋出異常。但是數(shù)據(jù)源仍有效保留,并在下次調(diào)用getConnection()的時(shí)候繼續(xù)嘗試獲取連接。如果設(shè)為true,那么在嘗試獲取連接失敗后該數(shù)據(jù)源將申明已斷開并永久關(guān)閉。Default:falsecheckoutTimeout:當(dāng)連接池用完時(shí)客戶端調(diào)用getConnection()后等待獲取新連接的時(shí)間,超時(shí)后將拋出SQLException,如設(shè)為0則無限期等待。單位毫秒。Default:0connectionTesterClassName:通過實(shí)現(xiàn)ConnectionTester或QueryConnectionTester的類來測試連接。類名需制定全路徑。Default:com.mchange.v2.c3p0.impl.DefaultConnectionTesterfactoryClassLocation:指定c3p0libraries的路徑,如果(通常都是這樣)在本地即可獲得那么無需設(shè)置,默認(rèn)null即可Default:nullidleConnectionTestPeriod:每60秒檢查所有連接池中的空閑連接。Default:0initialPoolSize:初始化時(shí)獲取三個(gè)連接,取值應(yīng)在minPoolSize與maxPoolSize之間。Default:3maxIdleTime:最大空閑時(shí)間,60秒內(nèi)未使用則連接被丟棄。若為0則永不丟棄。Default:0maxPoolSize:連接池中保留的最大連接數(shù)。Default:15maxStatements:JDBC的標(biāo)準(zhǔn)參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatements數(shù)量。但由于預(yù)緩存的statements屬于單個(gè)connection而不是整個(gè)連接池。所以設(shè)置這個(gè)參數(shù)需要考慮到多方面的因素。如果maxStatements與maxStatementsPerConnection均為0,則緩存被關(guān)閉。Default:0maxStatementsPerConnection:maxStatementsPerConnection定義了連接池內(nèi)單個(gè)連接所擁有的最大緩存statements數(shù)。Default:0numHelperThreads:c3p0是異步操作的,緩慢的JDBC操作通過幫助進(jìn)程完成。擴(kuò)展這些操作可以有效的提升性能通過多線程實(shí)現(xiàn)多個(gè)操作同時(shí)被執(zhí)行。Default:3overrideDefaultUser:當(dāng)用戶調(diào)用getConnection()時(shí)使root用戶成為去獲取連接的用戶。主要用于連接池連接非c3p0的數(shù)據(jù)源時(shí)。Default:nulloverrideDefaultPassword:與overrideDefaultUser參數(shù)對(duì)應(yīng)使用的一個(gè)參數(shù)。Default:nullpassword:密碼。Default:nulluser:用戶名。Default:nullpreferredTestQuery:定義所有連接測試都執(zhí)行的測試語句。在使用連接測試的情況下這個(gè)一顯著提高測試速度。注意:測試的表必須在初始數(shù)據(jù)源的時(shí)候就存在。Default:nullpropertyCycle:用戶修改系統(tǒng)配置參數(shù)執(zhí)行前最多等待300秒。Default:300testConnectionOnCheckout:因性能消耗大請(qǐng)只在需要的時(shí)候使用它。如果設(shè)為true那么在每個(gè)connection提交的時(shí)候都將校驗(yàn)其有效性。建議使用idleConnectionTestPeriod或automaticTestTable等方法來提升連接測試的性能。Default:falsetestConnectionOnCheckin:如果設(shè)為true那么在取得連接的同時(shí)將校驗(yàn)連接的有效性。Default:false3.2.2實(shí)現(xiàn):c3p0不依賴任何其他框架,所以只需要引入c3p0的JAR包即可,下載地址為:/projects/c3p0/WEB項(xiàng)目中實(shí)現(xiàn):這次我采用的實(shí)現(xiàn)方式是直接在Spring中寫入,然后將c3p0的JAR包c(diǎn)3p0-0.9.0.jar放入工程中即可,部分代碼見下,完整代碼見C3P0_Demo<beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><propertyname="driverClass"><value>com.mysql.jdbc.Driver</value></property><propertyname="jdbcUrl"><value>jdbc:mysql://:3306/ConnTest?useUnicode=true&characterEncoding=GBK</value></property><propertyname="user"><value>root</value></property><propertyname="password"><value>root</value></property><propertyname="minPoolSize"><value>10</value></property><propertyname="maxPoolSize"><value>100</value></property><propertyname="initialPoolSize"><value>50</value></property></bean>JAVA項(xiàng)目中實(shí)現(xiàn):C3P0.java:publicclassC3P0{privatestaticComboPooledDataSourcedataSource=null;publicC3P0(){dataSource=newComboPooledDataSource。;}publicstaticvoidinit(){dataSource=newComboPooledDataSource。;try{dataSourc.setDriverClass(〃com.mysql.jdbc.Driver〃);dataSourc.setJdbcUrl("jdbc:mysql://:3306/ConnTest?useUnicode=true&characterEncoding=GBK〃);dataSourc.setUser(〃root〃);dataSourc.setPassword(〃root〃);dataSourc.setMaxPoolSize(500);dataSourc.setMinPoolSize(30);dataSourc.setInitialPoolSize(30);}catch(Exceptione){//}}publicstaticsynchronizedConnectiongetConnection()throwsSQLException{returndataSourc.getConnection();}}PROXOOL3.3.1相關(guān)的參數(shù)有:acquireIncrement:當(dāng)連接池中的連接耗盡的時(shí)候c3p0一次同時(shí)獲取的連接數(shù)。Default:3fatal-sql-exception:它是一個(gè)逗號(hào)分割的信息片段.當(dāng)一個(gè)SQL異常發(fā)生時(shí),他的異常信息將與這個(gè)信息片段進(jìn)行比較.如果在片段中存在,那么這個(gè)異常將被認(rèn)為是個(gè)致命錯(cuò)誤(FatalSQLException)這種情況下,數(shù)據(jù)庫連接將要被放棄.無論發(fā)生什么,這個(gè)異常將會(huì)被重?cái)S以提供給消費(fèi)者.用戶最好自己配置一個(gè)不同的異常來拋出.fatal-sql-exception-wrapper-class:正如上面所說,你最好配置一個(gè)不同的異常來重?cái)S.利用這個(gè)屬性,用戶可以包裝SQLException,使他變成另外一個(gè)異常.這個(gè)異?;蛘呃^承SQLException或者繼承字RuntimeExool自帶了2個(gè)實(shí)現(xiàn):'xool.FatalSQLException'和'xool.FatalRuntimeException'.后者更合適.house-keeping-sleep-time:housekeeper保留線程處于睡眠狀態(tài)的最長時(shí)間,housekeeper的職責(zé)就是檢查各個(gè)連接的狀態(tài),并判斷是否需要銷毀或者創(chuàng)建.house-keeping-test-sql:如果發(fā)現(xiàn)了空閑的數(shù)據(jù)庫連接.housekeeper將會(huì)用這個(gè)語句來測試.這個(gè)語句最好非??斓谋粓?zhí)行.如果沒有定義,測試過程將會(huì)被忽略。injectable-connection-interface:允許proxool實(shí)現(xiàn)被代理的connection對(duì)象法.injectable-statement-interface:允許proxool實(shí)現(xiàn)被代理的Statement對(duì)象方法.injectable-prepared-statement-interface:允許proxool實(shí)現(xiàn)被代理的PreparedStatement對(duì)象方法.injectable-callable-statement-interface:允許proxool實(shí)現(xiàn)被代理的CallableStatement對(duì)象方法.jmx:如果屬性為true,就會(huì)注冊(cè)一個(gè)消息Bean到j(luò)ms服務(wù),消息Bean對(duì)象名:"Proxool:type=Pool,name=<alias>”.默認(rèn)值為false.jmx-agent-id:一個(gè)逗號(hào)分隔的JMX代理列表(如使用MbeanServerFactory.findMBeanServer(StringagentId)注冊(cè)的連接池。)這個(gè)屬性是僅當(dāng)'jmx"屬性設(shè)置為"true"才有效。所有注冊(cè)jmx服務(wù)器使用這個(gè)屬性是不確定的jndi-name:數(shù)據(jù)源的名稱maximum-active-time:如果housekeeper檢測到某個(gè)線程的活動(dòng)時(shí)間大于這個(gè)數(shù)值.它將會(huì)殺掉這個(gè)線程.所以確認(rèn)一下你的服務(wù)器的帶寬.然后定一個(gè)合適的值.默認(rèn)是5分鐘.maximum-connection-count:最大的數(shù)據(jù)庫連接數(shù).maximum-connection-lifetime:一個(gè)線程的最大壽命.minimum-connection-count:最小的數(shù)據(jù)庫連接數(shù)overload-without-refusal-lifetime:這可以幫助我們確定連接池的狀態(tài)。如果我們已經(jīng)拒絕了一個(gè)連接在這個(gè)設(shè)定值(毫秒),然后被認(rèn)為是超載。默認(rèn)為60秒。prototype-count:連接池中可用的連接數(shù)量.如果當(dāng)前的連接池中的連接少于這個(gè)數(shù)值.新的連接將被建立(假設(shè)沒有超過最大可用數(shù)).例如.我們有3個(gè)活動(dòng)連接2個(gè)可用連接,而我們的prototype-count是4,那么數(shù)據(jù)庫連接池將試圖建立另外2個(gè)連接.這和minimum-connection-count不同.minimum-connection-count把活動(dòng)的連接也計(jì)算在內(nèi).prototype-count是spareconnections的數(shù)量.recently-started-threshold:這可以幫助我們確定連接池的狀態(tài),連接數(shù)少還是多或超載。只要至少有一個(gè)連接已開始在此值(毫秒)內(nèi),或者有一些多余的可用連接,那么我們假設(shè)連接池是開啟的。默認(rèn)為60秒simultaneous-build-throttle這是我們可一次建立的最大連接數(shù)。那就是新增的連接請(qǐng)求,但還沒有可供使用的連接。由于連接可以使用多線程,在有限的時(shí)間之間建立聯(lián)系從而帶來可用連接,但是我們需要通過一些方式確認(rèn)一些線程并不是立即響應(yīng)連接請(qǐng)求的,默認(rèn)是10。statistics:連接池使用狀況統(tǒng)計(jì)。參數(shù)“10s,1m,1d”statistics-log-level:日志統(tǒng)計(jì)跟蹤類型。參數(shù)“ERROR"或“INFO”test-before-use:如果為true,在每個(gè)連接被測試前都會(huì)服務(wù)這個(gè)連接,如果一個(gè)連接失敗,那么將被丟棄,另一個(gè)連接將會(huì)被處理,如果所有連接都失敗,一個(gè)新的連接將會(huì)被建立。否則將會(huì)拋出一個(gè)SQLException異常。test-after-use:如果為true,在每個(gè)連接被測試后都會(huì)服務(wù)這個(gè)連接,使其回到連接池中,如果連接失敗,那么將被廢棄。trace:如果為true,那么每個(gè)被執(zhí)行的SQL語句將會(huì)在執(zhí)行期被log記錄(DEBUGLEVEL).你也可以注冊(cè)一個(gè)ConnectionListener(參看ProxoolFacade)得到這些信息.3.3.2實(shí)現(xiàn):proxool不依賴任何其他框架,所以只需要引入proxool的JAR包即可,下載地址為:/WEB項(xiàng)目中實(shí)現(xiàn):我的實(shí)現(xiàn)方式是首先在src目錄下建立一個(gè)proxool.xml,主要代碼如下:<proxool-config><proxool><alias>ConnTest</alias><!--數(shù)據(jù)源的別名--><driver-url>jdbc:mysql://:3306/ConnTest?useUnicode=true&characterEncoding=GBK</driver-url><!--url連接串--><driver-class>com.mysql.jdbc.Driver</driver-class><!--驅(qū)動(dòng)類--><driver-properties><propertyname="user"value="root"/><!--用戶名--><propertyname="password"value="root"/><!--密碼--></driver-properties><maximum-connection-count>100</maximum-connection-count><minimum-connection-count>10</minimum-connection-count><house-keeping-sleep-time>90000</house-keeping-sleep-time><maximum-new-connections>10</maximum-new-connections><prototype-count>5</prototype-count></proxool></proxool-config>然后在web.xml中加入<servlet><servlet-name>datasource_situation</servlet-name><servlet-class>xool.admin.servlet.AdminServlet</servlet-class></servlet><servlet-mapping><servlet-name>datasource_situation</servlet-name><url-pattern>/datasource_situation</url-pattern></servlet-mapping>它的作用是用來提供察看連接池的信息,即在域名后跟上/datasource_situation就可以查看了。最后在applicationContext.xml中sessionFactory中注入<beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"singleton="true"><propertyname="hibernateProperties"><props><propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><propkey="hibernate.show_sql">true</prop><propkey="hibernate.connection.release_mode">after_statement</prop><propkey="hibernate.cglib.use_reflection_optimizer">true</prop><propkey="xool.xml">proxool.xml</prop><propkey="xool.pool_alias">ConnTest</prop></props></property><propertyname="mappingResources"><list><value>cn/ipanel/app8/domain/User.hbm.xml</value></list></property></bean>JAVA項(xiàng)目中實(shí)現(xiàn):Proxool.xml:<proxool-config><proxool><alias>ConnTest</alias><!--數(shù)據(jù)源的別名--><driver-url>jdbc:mysql://:3306/ConnTest?useUnicode=true&characterEncoding=GBK</driver-url><!--url連接串--><driver-class>com.mysql.jdbc.Driver</driver-class><!--驅(qū)動(dòng)類--><driver-properties><propertyname="user"value="root"/><!--用戶名--><propertyname="password"value="root"/><!--密碼--></driver-properties><!--最大連接數(shù)(默認(rèn)5個(gè)),超過了這個(gè)連接數(shù),再有請(qǐng)求時(shí),就排在隊(duì)列中等候,最大的等待請(qǐng)求數(shù)由maximum-new-connections決定--><maximum-connection-count>200</maximum-connection-count><!--最小連接數(shù)(默認(rèn)2個(gè))--><minimum-connection-count>10</minimum-connection-count><!--最少保持的空閑連接數(shù)(默認(rèn)2個(gè))--><prototype-count>20</prototype-count></proxool></proxool-config>Proxool.java:publicclassProxool{privatestaticProxoolproxool=null;privateConnectioncon=null;publicProxool(){InputStreamis=getClass().getResourceAsStream(〃/proxool.xml〃);try{JAXPConfigurator.configure(newInputStreamReader(is),false);System.out.println("Configurationfile(proxool.xml)hasbeenloaded!");}catch(Exceptione){System.out.println("LoadConfigurationfailed!"+e.getMessage());}finally{try{is.close();}catch(Exceptionex){}}}publicstaticProxoolgetInstance(){if(null==proxool)proxool=newProxool();returnproxool;}publicsynchronizedConnectiongetConnection(){try{con=DriverManager.getConnectior("proxool.ConnTest");}catch(Exceptione){System.out.println("Connectionfailed!〃+e.getMessage());}returncon;}}BoneCP3.4.1相關(guān)的參數(shù)有:acquireIncrement:當(dāng)連接池中的連接耗盡的時(shí)候c3p0一次同時(shí)獲取的連接數(shù)。Default:3driveClass:數(shù)據(jù)庫驅(qū)動(dòng)jdbcUrl:響應(yīng)驅(qū)動(dòng)的jdbcUrlusername:數(shù)據(jù)庫的用戶名password:數(shù)據(jù)庫的密碼idleConnectionTestPeriod:檢查數(shù)據(jù)庫連接池中控線連接的間隔時(shí)間,單位是分,默認(rèn)值:240,如果要取消則設(shè)置為0idleMaxAge:連接池中未使用的鏈接最大存活時(shí)間,單位是分,默認(rèn)值:60,如果要永遠(yuǎn)存活設(shè)置為0maxConnectionsPerPartition海個(gè)分區(qū)最大的連接數(shù)minConnectionsPerPartition海個(gè)分區(qū)最小的連接數(shù)partitionCount:分區(qū)數(shù),默認(rèn)值2,最小1,推薦3-4,視應(yīng)用而定acquireIncrement:每次去拿數(shù)據(jù)庫連接的時(shí)候一次性要拿幾個(gè),默認(rèn)值:2statementsCacheSize:緩存preparedstatements的大小,默認(rèn)值:0releaseHelperThreads:每個(gè)分區(qū)釋放鏈接助理進(jìn)程的數(shù)量,默認(rèn)值:3,除非你的一個(gè)數(shù)據(jù)庫連接的時(shí)間內(nèi)做了很多工作,不然過多的助理進(jìn)程會(huì)影響你的性能3*4.2頭現(xiàn):使用BoneCP需要引入的包有3中,分別是BoneCP,slf4j,google-collection都可以在/download.html下載WEB項(xiàng)目中實(shí)現(xiàn):這次我采用的實(shí)現(xiàn)方式是直接在Spring中寫入,然后將BoneCP的所需的JAR包放入工程中即可,部分代碼見下,完整代碼見BoneCP_Demo<beanid="dataSource"class="com.jolbox.bonecp.BoneCPDataSource"destroy-method="close"><!--數(shù)據(jù)庫驅(qū)動(dòng)--><propertyname="driverClass"value="com.mysql.jdbc.Driver"/><!--相應(yīng)驅(qū)動(dòng)的jdbcUrl,你懂的--><propertyname="jdbcUrl"value="jdbc:mysql://:3306/ConnTest?useUnicode=true&characterEncoding=GBK"/><!--數(shù)據(jù)庫的用戶名--><propertyname="username"value="root"/><!--數(shù)據(jù)庫的密碼--><propertyname="password"value="root"/><!--每個(gè)分區(qū)最大的連接數(shù)--><propertyname="maxConnectionsPerPartition"value="200"/><!--每個(gè)分區(qū)最小的連接數(shù)-->〈propertyname="minConnectionsPerPartition"value="30"/><!--分區(qū)數(shù),默認(rèn)值2,最小1,推薦3-4,視應(yīng)用而定--><propertyname="partitionCount"value="3"/></bean>JAVA項(xiàng)目中實(shí)現(xiàn):實(shí)現(xiàn)方式如下BoneCPConn.javapublicclassBoneCPConn{publicstaticBoneCPconnectionPool=null;publicBoneCPConn(){}publicstaticvoidinit(){try{BoneCPConfigconfig=newBoneCPConfig();Class.forName(〃com.mysql.jdbc.Driver〃);config.setJdbcUrl(〃jdbc:mysql://:3306/ConnTest?useUnicode=true&characterEncoding=GBK〃);config.setUsername(〃root〃);config.setPassword(〃root〃);config.setMinConnectionsPerPartition(30);config.setMaxConnectionsPerPartition(200);config.setPartitionCount(3);connectionPoo=newBoneCP(config);}catch(Exceptione){}}publicstaticsynchronizedConnectiongetConnection()throwsSQLException{returnconnectionPoo.getConnection();}4c3p0、dbcp、proxool、BoneCP在WEB項(xiàng)目中的比較4.1環(huán)境依賴:C3P0、proxool對(duì)環(huán)境沒有依賴DBCP是一個(gè)依賴Jakartacommons-pool對(duì)象池機(jī)制的數(shù)據(jù)庫連接池,所以在類路徑下還必須包括commons-pool.jar4.2測試環(huán)境:操作系統(tǒng):windowsxpsp3數(shù)據(jù)庫:mysql5.1web服務(wù)器:Tomcat5.5.27測試工具:jakarta-jmeter-2.44.3測試條件:initialSize=10;maxSize=15;minSize=5;4.4其余參數(shù)為默認(rèn)值;用jmeter模擬HTTP請(qǐng)求訪問TestServlet,TestServlet的代碼如下:測試代碼:4.4用jmeter模擬HTTP請(qǐng)求訪問TestServlet,TestServlet的代碼如下:publicvoidinit()throwsServletException{WebApplicationContextapplicationContext=WebApplicationContextUtils.getWebApplicationContex(hthis.getServletContext());userService=(UserService)applicationContext.getBean(〃userService〃);}protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Useruser=userService.getUserById(9999);System.out.println(user.getUsername());}4.5測試數(shù)據(jù)以及測試結(jié)果:測試結(jié)果字段解釋:Label:說明是請(qǐng)求類型,如Http,F(xiàn)TP等請(qǐng)求。Samples:也就是圖形報(bào)表中的樣本數(shù)目,總共發(fā)送到服務(wù)器的樣本數(shù)目。Average:也就是圖形報(bào)表中的平均值,是總運(yùn)行時(shí)間除以發(fā)送到服務(wù)器的請(qǐng)求數(shù)。Median:也就是圖形報(bào)表中的中間值,是代表時(shí)間的數(shù)字,有一半的服務(wù)器響應(yīng)時(shí)間低于該值而另一半高于該值。90%line:是指90%請(qǐng)求的響應(yīng)時(shí)間比所得數(shù)值還要小。Min:是代表時(shí)間的數(shù)字,是服務(wù)器響應(yīng)的最短時(shí)間。Max:是代表時(shí)間的數(shù)字,是服務(wù)器響應(yīng)的最長時(shí)間。Error%:請(qǐng)求的錯(cuò)誤百分比。Throughput:也就是圖形報(bào)表中的吞吐量,這里是服務(wù)器每單位時(shí)間處理的請(qǐng)求數(shù),注意查看是秒或是分鐘。4.5.1在3秒內(nèi)模擬30個(gè)線程請(qǐng)求TestServlet,循環(huán)5次DBCPLabel#SamplesAverageMedian90%LineMinMax;-Error%ThroughputHTTP請(qǐng)求15022310.00%51,1/sec總體15022310.00%51,1/secC3P0Lab&l#SamplesAverageMedian90%LineMinMa^::Error%ThroughputHTTP請(qǐng)求1501120120.00%51.S/seQ總體150110120.00%51ProxoolLabel#SamplesAverageMedian90%LineMinMaxError%ThroughputHTTP詰求1503.241310.00%51,0/sec總體1503241310.00%51.0/^ecBoneCPLabel#Samples-AverageMedian90%LineMinMaxError%ThroughputHTTP請(qǐng)求150a:231360.00%51.S/sec.總體1502231360.00%51,8/sec4.5.2在3秒內(nèi)模擬60個(gè)線程請(qǐng)求TestServlet,循環(huán)5次DBCP
Label#SamplesAverageMedian90%LineMinMaxError%ThroughputHTTP1話求3001130100.00%101.2/sec總體3001130180.00%101.2/secC3PLabel0#SamplesAverageMedian90%LineMinMaxError%ThroughputHTTP話求_^300112060.00%101.0/sec總體112060.00%101.0/s:ecProxoolLabel#SamplesAverageMedian90%LineMinMax.Error%ThroughputHTTP請(qǐng)求'3002241310.00%100.6/see總體3002241310.00%100.6/secBoneCPLabel#SamplesAverageMedian90%LineMinMax.Error%ThroughputHTTP請(qǐng)求300■2231290.00%101.1/sec總體300■2231290.00%101.1/sec4.5.3在6秒內(nèi)模擬60個(gè)線程請(qǐng)求TestServlet,循環(huán)5次DBCPLabel#SamplesAverageMedian90%LineMinMa七Error%ThroughputHTTP話求_30011301220.00%50.0/sec總體■~30011301220.00%50.3/secC3P0Label#SamplesAverageMedian90%LineMmMaxError%ThroughputHTTP請(qǐng)求00011■2C160.00%50.8/se&總體300T:1■20160.00%50.8/secProxoolLabel#SamplesAverageMedian90%.LineMinMax;Error%ThroughputHTTP請(qǐng)求■3001131150.00%50.3/sec總體Bo■300neCP1131150.00%50.3/secLabel#SamplesAverageMedian9。%LineMinMait.Error%ThroughputHTTP請(qǐng)求3001130200.00%50.7/sec總體3001130200.00%50..7/sec4.5.4在6秒內(nèi)模擬120個(gè)線程請(qǐng)求TestServlet,循環(huán)5次
DBCPLabel#SamplesAverageMedian90%LineMinMastError%ThroughputHTTP請(qǐng)求6001120_J60.00%10O.Vsec總體C3P60001120260.00%100.1JsecLabel#SamplesAverageMedian90%LinsMinMaxError%ThroughputHTTP請(qǐng)求600113010000%101O/s&c總體6001130100.00%101.0/seCProxoolBoneCPLabeltSamplesAverageMedian90%LineMinMaxError%Throughputhttp話求6001130320.00%10O^/sec總體6001130320.00%100^/see4.5.5在10秒內(nèi)模擬120個(gè)線程請(qǐng)求TestServlet,循環(huán)5次DBCPLabel#Samples--AverageMedian90%LineMinMaxError%ThroughputHTTP請(qǐng)求6001120270.00%6O.-3i(sec.總體600110*0.00%60.3(secC3P0Label#SamplesAverageMedian90%LineMinMayError%ThroughputHTTFvf求60011.2060.00%60.3^sec總體60011:2060.00%60.3/secProxool
Label#Samples.AverageMedian90%LineMinMa又Error%ThroughputHTTF1請(qǐng)求60011200.00%603/sec總體6001120■220.00%60:^secBoneCPLabel#Samples;/AverageMedian90%LineMinM液Error%ThroughputHTTP請(qǐng)求6001130410.00%60.Usee總體6001130410.00%60.1/sec4.5.6在10秒內(nèi)模擬150個(gè)線程請(qǐng)求TestServlet,循環(huán)5次DBCPLabel#Samples--AverageMedian90%LineMinMaxError%ThroughputHTTP請(qǐng)求7501120a0.00%75孕招ec.總體7501120270.00%75^fsecC3P0Label#SamplesAverageMedian90%LineMrnMax;-Error%ThroughputHTTP請(qǐng)求750112C190.00%75.3/sec總體ProLabelHTTP諾求總體Bo750xool#Samples.750750neCP1w11;2.90%Line.0Min19Mas;:66660.00%Error%70.00%0.00%75.3/sechrci^ghput.75.2玲凱75.2^ecLabel#SamplesAverageMedian90%LineMtnMax;-Error%ThroughputHTTP話求750215C750.00%75.1/sec總體7502150750.00%75.1/sec4.5.7在10秒內(nèi)模擬200個(gè)線程請(qǐng)求TestServlet,循環(huán)5次篷程雇性魏程數(shù):||ooRamp-UpPeriod(inseconds):10循環(huán)次戮□永遠(yuǎn)5口調(diào)度器DBCP
Label#SamplesAverageMedian90%LineMinMaxError%ThroughputHTTP話求10001120370.00%100.6/sec總體10001120~17.0.00%100.6/secC3P0Label#SamplesAverageMedian90%LineMinMayError%ThroughputHTTP話求10001130660.00%100.2/sec總體1000110660.00%100.2/secProxoolLabel#SamplesAverageMedian90%LineMinMasError%ThroughputHTTP請(qǐng)求10001130■340.00%100:3/sec總體Bo1000neCP11:G0■340.00%100:3/secLabel#Samplas/AverageMedian90%LineMinMax-;Error%ThroughputHTTP請(qǐng)求10001130650.00%99.5/see總體10001130650.00%99.6/sec4.5.8在5秒內(nèi)模擬400個(gè)線程請(qǐng)求TestServlet,循環(huán)5次DBCPLabel#SamplesAverageMedian90%LineMinMaxError%ThroughputHTTP請(qǐng)求■200031500.00%3r94.0/sec總體2000?3150730.00%3r94.0<secC3P0Label#Sample.sAverageMedian30%LineMinMaxError%ThroughputHTTP請(qǐng)求2000110650.00%總體20001130650.00%394③杼的ProxoolLabel#SamplesAverageMedian90%LineMinMax.Error%ThroughputHTTP話求20003270600.00%392.6/sec總佐■20003270600.00%392.6/secBoneCPLabel#SamplesAverageMedian90%LineMinMaxError%ThroughputHTTP請(qǐng)求20003190530.00%390.0/sec總體20003190530.00%■390.0/sec4.6測試結(jié)果分析:相同時(shí)間內(nèi)同等量的線程數(shù)和循環(huán)次數(shù)下:通過對(duì)四個(gè)連接池的三個(gè)標(biāo)志性性能測試參數(shù)(Average,median,90%Line)進(jìn)行比較發(fā)現(xiàn):DBCP和C3P0差不多,proxool和BoneCP性能較差。4.7測試結(jié)論通過對(duì)三種數(shù)據(jù)庫連接池的性能測試發(fā)現(xiàn),dbcp和c3p0能夠更好的支持高并發(fā),但是在穩(wěn)定性方面,c3p0略微優(yōu)于DBCP。5c3p0、dbcp、
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度二手車寄售代理服務(wù)合同
- 2025年度吊車租賃與施工現(xiàn)場管理服務(wù)協(xié)議
- 2025年車貸居間服務(wù)收費(fèi)標(biāo)準(zhǔn)合同范本
- 建立適應(yīng)性強(qiáng)的財(cái)務(wù)體系計(jì)劃
- 學(xué)生領(lǐng)導(dǎo)力培養(yǎng)課程計(jì)劃
- 教學(xué)工作創(chuàng)新方向計(jì)劃
- 年度戰(zhàn)略性談判的技巧分享計(jì)劃
- 市場調(diào)研與分析工作安排計(jì)劃
- 特色課程開發(fā)與實(shí)施方案計(jì)劃
- 高危作業(yè)的安全保障措施優(yōu)化計(jì)劃
- 《紡織服裝材料》課件-0緒論
- 盤扣式卸料平臺(tái)施工方案
- 繪本故事在小學(xué)道德與法治課堂中的有效教學(xué)策略分析
- 2023年江蘇省鹽城市中考數(shù)學(xué)試卷及答案
- 胃癌影像診斷(共42張)
- 2024新高考英語1卷試題及答案(含聽力原文)
- G -B- 43068-2023 煤礦用跑車防護(hù)裝置安全技術(shù)要求(正式版)
- 劍橋KET詞匯表(中英對(duì)照)
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫附答案
- 2024年4月浙江省00015英語二試題及答案含評(píng)分參考
- 2024年注冊(cè)安全工程師考試題庫【含答案】
評(píng)論
0/150
提交評(píng)論