數(shù)據(jù)庫連接池技術(shù)_第1頁
數(shù)據(jù)庫連接池技術(shù)_第2頁
數(shù)據(jù)庫連接池技術(shù)_第3頁
數(shù)據(jù)庫連接池技術(shù)_第4頁
數(shù)據(jù)庫連接池技術(shù)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

數(shù)據(jù)庫連接池技術(shù)1連接池原理連接池技術(shù)的核心思想是:連接復(fù)用,通過建立一個數(shù)據(jù)庫連接池以及一套連接使用、分配、治理策略,使得該連接池中的連接可以得到高效、安全的復(fù)用,避免了數(shù)據(jù)庫連接頻繁建立、關(guān)閉的開銷。另外,由于對JDBC中的原始連接進(jìn)行了封裝,從而方便了數(shù)據(jù)庫應(yīng)用對于連接的使用(非凡是對于事務(wù)處理),提高了開發(fā)效率,也正是因為這個封裝層的存在,隔離了應(yīng)用的本身的處理邏輯和具體數(shù)據(jù)庫訪問邏輯,使應(yīng)用本身的復(fù)用成為可能。連接池主要由三部分組成:連接池的建立、連接池中連接的使用治理、連接池的關(guān)閉。下面就著重討論這三部分及連接池的配置問題。1.1連接池的建立應(yīng)用程序中建立的連接池其實是一個靜態(tài)的。所謂靜態(tài)連接池是指連接池中的連接在系統(tǒng)初始化時就已分配好,且不能隨意關(guān)閉連接。Java中提供了很多容器類可以方便的構(gòu)建連接池,如:Vector、Stack、Servlet、Bean等,通過讀取連接屬性文件Cperties與數(shù)據(jù)庫實例建立連接。在系統(tǒng)初始化時,根據(jù)相應(yīng)的配置創(chuàng)建連接并放置在連接池中,以便需要使用時能從連接池中獲取,這樣就可以避免連接隨意的建立、關(guān)閉造成的開銷。1.2連接池的治理連接池治理策略是連接池機(jī)制的核心。當(dāng)連接池建立后,如何對連接池中的連接進(jìn)行治理,解決好連接池內(nèi)連接的分配和釋放,對系統(tǒng)的性能有很大的影響。連接的合理分配、釋放可提高連接的復(fù)用,降低了系統(tǒng)建立新連接的開銷,同時也加速了用戶的訪問速度。下面介紹連接池中連接的分配、釋放策略。連接池的分配、釋放策略對于有效復(fù)用連接非常重要,我們采用的方法是一個很有名的設(shè)計模式:ReferenceCounting(引用記數(shù))。該模式在復(fù)用資源方面應(yīng)用的非常廣泛,把該方法運用到對于連接的分配釋放上,為每一個數(shù)據(jù)庫連接,保留一個引用記數(shù),用來記錄該連接的使用者的個數(shù)。具體的實現(xiàn)方法是:當(dāng)客戶請求數(shù)據(jù)庫連接時,首先查看連接池中是否有空閑連接(指當(dāng)前沒有分配出去的連接)。假如存在空閑連接,則把連接分配給客戶并作相應(yīng)處理(即標(biāo)記該連接為正在使用,引用計數(shù)加1)。假如沒有空閑連接,則查看當(dāng)前所開的連接數(shù)是不是已經(jīng)達(dá)到maxConn(最大連接數(shù)),假如沒達(dá)到就重新創(chuàng)建一個連接給請求的客戶;假如達(dá)到就按設(shè)定的maxWaitTime(最大等待時間)進(jìn)行等待,假如等待maxWaitTime后仍沒有空閑連接,就拋出無空閑連接的異常給用戶。當(dāng)客戶釋放數(shù)據(jù)庫連接時,先判定該連接的引用次數(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)用程序退出時,應(yīng)關(guān)閉連接池,此時應(yīng)把在連接池建立時向數(shù)據(jù)庫申請的連接對象統(tǒng)一歸還給數(shù)據(jù)庫(即關(guān)閉所有數(shù)據(jù)庫連接),這與連接池的建立正好是一個相反過程。1.4連接池的配置數(shù)據(jù)庫連接池中到底要放置多少個連接,才能使系統(tǒng)的性能更佳,用minConn和maxConn來限制。minConn是當(dāng)應(yīng)用啟動的時候連接池所創(chuàng)建的連接數(shù),假如過大啟動將變慢,但是啟動后響應(yīng)更快;假如過小啟動加快,但是最初使用的用戶將因為連接池中沒有足夠的連接不可避免的延緩了執(zhí)行速度。因此應(yīng)該在開發(fā)的過程中設(shè)定較小minConn,而在實際應(yīng)用的中設(shè)定較大minConn。maxConn是連接池中的最大連接數(shù),可以通過反復(fù)試驗來確定此飽和點。為此在連接池類ConnectionPool中加入兩個方法getActiveSize()和getOpenSize(),ActiveSize表示某一時間有多少連接正被使用,OpenSize表示連接池中有多少連接被打開,反映了連接池使用的峰值。將這兩個值在日志信息中反應(yīng)出來,minConn的值應(yīng)該小于平均ActiveSize,而maxConn的值應(yīng)該在activeSize和OpenSize之間2數(shù)據(jù)庫連接池技術(shù)在Java中開源的數(shù)據(jù)庫連接池有以下幾種:C3P0C3P0是一個開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發(fā)布,包括了實現(xiàn)jdbc3和jdbc2擴(kuò)展規(guī)范說明的Connection和Statement池的DataSources對象。Proxool這是一個JavaSQLDriver驅(qū)動程序,提供了對你選擇的其它類型的驅(qū)動程序的連接池封裝??梢苑浅:唵蔚囊浦驳浆F(xiàn)存的代碼中。完全可配置。快速,成熟,健壯??梢酝该鞯貫槟悻F(xiàn)存的JDBC驅(qū)動程序增加連接池功能。JakartaDBCPDBCP是一個依賴Jakartacommons-pool對象池機(jī)制的數(shù)據(jù)庫連接池.DBCP可以直接的在應(yīng)用程序用使用。DDConnectionBrokerDDConnectionBroker是一個簡單,輕量級的數(shù)據(jù)庫連接池。DBPoolDBPool是一個高效的易配置的數(shù)據(jù)庫連接池。它除了支持連接池應(yīng)有的功能之外,還包括了一個對象池使你能夠開發(fā)一個滿足自已需求的數(shù)據(jù)庫連接池。XAPoolXAPool是一個XA數(shù)據(jù)庫連接池。它實現(xiàn)了javax.sql.XADataSource并提供了連接池工具。7,PrimrosePrimrose是一個Java開發(fā)的數(shù)據(jù)庫連接池。當(dāng)前支持的容器包括Tomcat4&5,Resin3與JBoss3.它同樣也有一個獨立的版本可以在應(yīng)用程序中使用而不必運行在容器中。Primrose通過一個web接口來控制SQL處理的追蹤,配置,動態(tài)池管理。在重負(fù)荷的情況下可進(jìn)行連接請求隊列處理。8,SmartPoolSmartPool是一個連接池組件,它模仿應(yīng)用服務(wù)器對象池的特性。SmartPool能夠解決一些臨界問題如連接泄漏(connectionleaks),連接阻塞,打開的JDBC對象如Statements,PreparedStatements等.SmartPool的特性包括支持多個pools,自動關(guān)閉相關(guān)聯(lián)的JDBC對象,在所設(shè)定time-outs之后察覺連接泄漏,追蹤連接使用情況,強制啟用最近最少用到的連接,把SmartPool"包裝”成現(xiàn)存的一個pool等。MiniConnectionPoolManagerMiniConnectionPoolManager是一個輕量級JDBC數(shù)據(jù)庫連接池。它只需要Java1.5(或更高)并且沒有依賴第三方包。BoneCPBoneCP是一個快速,開源的數(shù)據(jù)庫連接池。幫你管理數(shù)據(jù)連接讓你的應(yīng)用程序能更快速地訪問數(shù)據(jù)庫。比C3P0/DBCP連接池快25倍。3常用開源數(shù)據(jù)庫連接池的實現(xiàn)方式現(xiàn)在常用的開源數(shù)據(jù)連接池主要有c3p0,dbcp,proxool和BoneCP四種,其中:---hibernate開發(fā)組推薦使用c3p0;---spring開發(fā)組推薦使用dbcp(dbcp連接池有weblogic連接池同樣的問題,就是強行關(guān)閉連接或數(shù)據(jù)庫重啟后,無法reconnect,告訴連接被重置,這個設(shè)置可以解決);---hibernateinaction推薦使用c3p0和proxool;下面一一介紹這三種數(shù)據(jù)庫連接池的使用方法和配置信息3.1Apache-DBCP:3.1.1相關(guān)的參數(shù)有:dataSource:要連接的datasource(通常我們不會定義在server.xml)defaultAutoCommit:對于事務(wù)是否autoCommit,默認(rèn)值為truedefaultReadOnly:對于數(shù)據(jù)庫是否只能讀取,默認(rèn)值為falsedriverClassName:連接數(shù)據(jù)庫所用的JDBCDriverClass,maxActive:可以從對象池中取出的對象最大個數(shù),為0則表示沒有限制,默認(rèn)為8maxIdle:最大等待連接中的數(shù)量,設(shè)0為沒有限制(對象池中對象最大個數(shù))minIdle:對象池中對象最小個數(shù)maxWait:最大等待秒數(shù),單位為ms,超過時間會丟出錯誤信息password:登陸數(shù)據(jù)庫所用的密碼url:連接數(shù)據(jù)庫的URLusername:登陸數(shù)據(jù)庫所用的帳號validationQuery:驗證連接是否成功,SQLSELECT指令至少要返回一行removeAbandoned:是否自我中斷,默認(rèn)是false

removeAbandonedTimeout:幾秒后會自我中斷,removeAbandoned必須為truelogAbandoned:是否記錄中斷事件,默認(rèn)為falseminEvictableldleTimeMillis:大于0,進(jìn)行連接空閑時間判斷,或為0,對空閑的連接不進(jìn)行驗證;默認(rèn)30分鐘timeBetweenEvictionRunsMillis:失效檢查線程運行時間間隔,如果小于等于0,不會啟動檢查線程,默認(rèn)-1testOnBorrow:取得對象時是否進(jìn)行驗證,檢查對象是否有效,默認(rèn)為falsetestOnReturn:返回對象時是否進(jìn)行驗證,檢查對象是否有效,默認(rèn)為falsetestWhileIdle:空閑時是否進(jìn)行驗證,檢查對象是否有效,默認(rèn)為false3.1.2實現(xiàn):initialSize:初始化線程數(shù)首先下載DBCP所需JAR包,/commons/3bcp/有pool包,/commons/pool/如果下載的pool包是1.2的版本,還要下載common-collections包,/commons/collections/WEB項目中實現(xiàn):我的實現(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實現(xiàn):</bean>JAVA項目中實現(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)連接池中的連接耗盡的時候c3p0一次同時獲取的連接數(shù)。Default:3acquireRetryAttempts:定義在從數(shù)據(jù)庫獲取新連接失敗后重復(fù)嘗試的次數(shù)。Default:30acquireRetryDelay:兩次連接中間隔時間,單位毫秒。Default:1000autoCommitOnClose:連接關(guān)閉時默認(rèn)將所有未提交的操作回滾。Default:falseautomaticTestTable:c3p0將建一張名為Test的空表,并使用其自帶的查詢語句進(jìn)行測試。如果定義了這個參數(shù)那么屬性preferredTestQuery將被忽略。你不能在這張Test表上進(jìn)行任何操作,它將只供c3p0測試使用。Default:nullbreakAfterAcquireFailure:獲取連接失敗將會引起所有等待連接池來獲取連接的線程拋出異常。但是數(shù)據(jù)源仍有效保留,并在下次調(diào)用getConnection()的時候繼續(xù)嘗試獲取連接。如果設(shè)為true,那么在嘗試獲取連接失敗后該數(shù)據(jù)源將申明已斷開并永久關(guān)閉。Default:falsecheckoutTimeout:當(dāng)連接池用完時客戶端調(diào)用getConnection()后等待獲取新連接的時間,超時后將拋出SQLException,如設(shè)為0則無限期等待。單位毫秒。Default:0connectionTesterClassName:通過實現(xiàn)ConnectionTester或QueryConnectionTester的類來測試連接。類名需制定全路徑。Default:com.mchange.v2.c3p0.impl.DefaultConnectionTesterfactoryClassLocation:指定c3p0libraries的路徑,如果(通常都是這樣)在本地即可獲得那么無需設(shè)置,默認(rèn)null即可Default:nullidleConnectionTestPeriod:每60秒檢查所有連接池中的空閑連接。Default:0initialPoolSize:初始化時獲取三個連接,取值應(yīng)在minPoolSize與maxPoolSize之間。Default:3maxIdleTime:最大空閑時間,60秒內(nèi)未使用則連接被丟棄。若為0則永不丟棄。Default:0maxPoolSize:連接池中保留的最大連接數(shù)。Default:15maxStatements:JDBC的標(biāo)準(zhǔn)參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatements數(shù)量。但由于預(yù)緩存的statements屬于單個connection而不是整個連接池。所以設(shè)置這個參數(shù)需要考慮到多方面的因素。如果maxStatements與maxStatementsPerConnection均為0,則緩存被關(guān)閉。Default:0maxStatementsPerConnection:maxStatementsPerConnection定義了連接池內(nèi)單個連接所擁有的最大緩存statements數(shù)。Default:0numHelperThreads:c3p0是異步操作的,緩慢的JDBC操作通過幫助進(jìn)程完成。擴(kuò)展這些操作可以有效的提升性能通過多線程實現(xiàn)多個操作同時被執(zhí)行。Default:3overrideDefaultUser:當(dāng)用戶調(diào)用getConnection()時使root用戶成為去獲取連接的用戶。主要用于連接池連接非c3p0的數(shù)據(jù)源時。Default:nulloverrideDefaultPassword:與overrideDefaultUser參數(shù)對應(yīng)使用的一個參數(shù)。Default:nullpassword:密碼。Default:nulluser:用戶名。Default:nullpreferredTestQuery:定義所有連接測試都執(zhí)行的測試語句。在使用連接測試的情況下這個一顯著提高測試速度。注意:測試的表必須在初始數(shù)據(jù)源的時候就存在。Default:nullpropertyCycle:用戶修改系統(tǒng)配置參數(shù)執(zhí)行前最多等待300秒。Default:300testConnectionOnCheckout:因性能消耗大請只在需要的時候使用它。如果設(shè)為true那么在每個connection提交的時候都將校驗其有效性。建議使用idleConnectionTestPeriod或automaticTestTable等方法來提升連接測試的性能。Default:falsetestConnectionOnCheckin:如果設(shè)為true那么在取得連接的同時將校驗連接的有效性。Default:false3.2.2實現(xiàn):c3p0不依賴任何其他框架,所以只需要引入c3p0的JAR包即可,下載地址為:/projects/c3p0/WEB項目中實現(xiàn):這次我采用的實現(xiàn)方式是直接在Spring中寫入,然后將c3p0的JAR包c3p0-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à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)連接池中的連接耗盡的時候c3p0一次同時獲取的連接數(shù)。Default:3fatal-sql-exception:它是一個逗號分割的信息片段.當(dāng)一個SQL異常發(fā)生時,他的異常信息將與這個信息片段進(jìn)行比較.如果在片段中存在,那么這個異常將被認(rèn)為是個致命錯誤(FatalSQLException)這種情況下,數(shù)據(jù)庫連接將要被放棄.無論發(fā)生什么,這個異常將會被重擲以提供給消費者.用戶最好自己配置一個不同的異常來拋出.fatal-sql-exception-wrapper-class:正如上面所說,你最好配置一個不同的異常來重擲.利用這個屬性,用戶可以包裝SQLException,使他變成另外一個異常.這個異常或者繼承SQLException或者繼承字RuntimeExool自帶了2個實現(xiàn):'xool.FatalSQLException'和'xool.FatalRuntimeException'.后者更合適.house-keeping-sleep-time:housekeeper保留線程處于睡眠狀態(tài)的最長時間,housekeeper的職責(zé)就是檢查各個連接的狀態(tài),并判斷是否需要銷毀或者創(chuàng)建.house-keeping-test-sql:如果發(fā)現(xiàn)了空閑的數(shù)據(jù)庫連接.housekeeper將會用這個語句來測試.這個語句最好非常快的被執(zhí)行.如果沒有定義,測試過程將會被忽略。injectable-connection-interface:允許proxool實現(xiàn)被代理的connection對象法.injectable-statement-interface:允許proxool實現(xiàn)被代理的Statement對象方法.injectable-prepared-statement-interface:允許proxool實現(xiàn)被代理的PreparedStatement對象方法.injectable-callable-statement-interface:允許proxool實現(xiàn)被代理的CallableStatement對象方法.jmx:如果屬性為true,就會注冊一個消息Bean到j(luò)ms服務(wù),消息Bean對象名:"Proxool:type=Pool,name=<alias>”.默認(rèn)值為false.jmx-agent-id:一個逗號分隔的JMX代理列表(如使用MbeanServerFactory.findMBeanServer(StringagentId)注冊的連接池。)這個屬性是僅當(dāng)'jmx"屬性設(shè)置為"true"才有效。所有注冊jmx服務(wù)器使用這個屬性是不確定的jndi-name:數(shù)據(jù)源的名稱maximum-active-time:如果housekeeper檢測到某個線程的活動時間大于這個數(shù)值.它將會殺掉這個線程.所以確認(rèn)一下你的服務(wù)器的帶寬.然后定一個合適的值.默認(rèn)是5分鐘.maximum-connection-count:最大的數(shù)據(jù)庫連接數(shù).maximum-connection-lifetime:一個線程的最大壽命.minimum-connection-count:最小的數(shù)據(jù)庫連接數(shù)overload-without-refusal-lifetime:這可以幫助我們確定連接池的狀態(tài)。如果我們已經(jīng)拒絕了一個連接在這個設(shè)定值(毫秒),然后被認(rèn)為是超載。默認(rèn)為60秒。prototype-count:連接池中可用的連接數(shù)量.如果當(dāng)前的連接池中的連接少于這個數(shù)值.新的連接將被建立(假設(shè)沒有超過最大可用數(shù)).例如.我們有3個活動連接2個可用連接,而我們的prototype-count是4,那么數(shù)據(jù)庫連接池將試圖建立另外2個連接.這和minimum-connection-count不同.minimum-connection-count把活動的連接也計算在內(nèi).prototype-count是spareconnections的數(shù)量.recently-started-threshold:這可以幫助我們確定連接池的狀態(tài),連接數(shù)少還是多或超載。只要至少有一個連接已開始在此值(毫秒)內(nèi),或者有一些多余的可用連接,那么我們假設(shè)連接池是開啟的。默認(rèn)為60秒simultaneous-build-throttle這是我們可一次建立的最大連接數(shù)。那就是新增的連接請求,但還沒有可供使用的連接。由于連接可以使用多線程,在有限的時間之間建立聯(lián)系從而帶來可用連接,但是我們需要通過一些方式確認(rèn)一些線程并不是立即響應(yīng)連接請求的,默認(rèn)是10。statistics:連接池使用狀況統(tǒng)計。參數(shù)“10s,1m,1d”statistics-log-level:日志統(tǒng)計跟蹤類型。參數(shù)“ERROR"或“INFO”test-before-use:如果為true,在每個連接被測試前都會服務(wù)這個連接,如果一個連接失敗,那么將被丟棄,另一個連接將會被處理,如果所有連接都失敗,一個新的連接將會被建立。否則將會拋出一個SQLException異常。test-after-use:如果為true,在每個連接被測試后都會服務(wù)這個連接,使其回到連接池中,如果連接失敗,那么將被廢棄。trace:如果為true,那么每個被執(zhí)行的SQL語句將會在執(zhí)行期被log記錄(DEBUGLEVEL).你也可以注冊一個ConnectionListener(參看ProxoolFacade)得到這些信息.3.3.2實現(xiàn):proxool不依賴任何其他框架,所以只需要引入proxool的JAR包即可,下載地址為:/WEB項目中實現(xiàn):我的實現(xiàn)方式是首先在src目錄下建立一個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ū)動類--><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à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ū)動類--><driver-properties><propertyname="user"value="root"/><!--用戶名--><propertyname="password"value="root"/><!--密碼--></driver-properties><!--最大連接數(shù)(默認(rèn)5個),超過了這個連接數(shù),再有請求時,就排在隊列中等候,最大的等待請求數(shù)由maximum-new-connections決定--><maximum-connection-count>200</maximum-connection-count><!--最小連接數(shù)(默認(rèn)2個)--><minimum-connection-count>10</minimum-connection-count><!--最少保持的空閑連接數(shù)(默認(rèn)2個)--><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)連接池中的連接耗盡的時候c3p0一次同時獲取的連接數(shù)。Default:3driveClass:數(shù)據(jù)庫驅(qū)動jdbcUrl:響應(yīng)驅(qū)動的jdbcUrlusername:數(shù)據(jù)庫的用戶名password:數(shù)據(jù)庫的密碼idleConnectionTestPeriod:檢查數(shù)據(jù)庫連接池中控線連接的間隔時間,單位是分,默認(rèn)值:240,如果要取消則設(shè)置為0idleMaxAge:連接池中未使用的鏈接最大存活時間,單位是分,默認(rèn)值:60,如果要永遠(yuǎn)存活設(shè)置為0maxConnectionsPerPartition海個分區(qū)最大的連接數(shù)minConnectionsPerPartition海個分區(qū)最小的連接數(shù)partitionCount:分區(qū)數(shù),默認(rèn)值2,最小1,推薦3-4,視應(yīng)用而定acquireIncrement:每次去拿數(shù)據(jù)庫連接的時候一次性要拿幾個,默認(rèn)值:2statementsCacheSize:緩存preparedstatements的大小,默認(rèn)值:0releaseHelperThreads:每個分區(qū)釋放鏈接助理進(jìn)程的數(shù)量,默認(rèn)值:3,除非你的一個數(shù)據(jù)庫連接的時間內(nèi)做了很多工作,不然過多的助理進(jìn)程會影響你的性能3*4.2頭現(xiàn):使用BoneCP需要引入的包有3中,分別是BoneCP,slf4j,google-collection都可以在/download.html下載WEB項目中實現(xiàn):這次我采用的實現(xiàn)方式是直接在Spring中寫入,然后將BoneCP的所需的JAR包放入工程中即可,部分代碼見下,完整代碼見BoneCP_Demo<beanid="dataSource"class="com.jolbox.bonecp.BoneCPDataSource"destroy-method="close"><!--數(shù)據(jù)庫驅(qū)動--><propertyname="driverClass"value="com.mysql.jdbc.Driver"/><!--相應(yīng)驅(qū)動的jdbcUrl,你懂的--><propertyname="jdbcUrl"value="jdbc:mysql://:3306/ConnTest?useUnicode=true&characterEncoding=GBK"/><!--數(shù)據(jù)庫的用戶名--><propertyname="username"value="root"/><!--數(shù)據(jù)庫的密碼--><propertyname="password"value="root"/><!--每個分區(qū)最大的連接數(shù)--><propertyname="maxConnectionsPerPartition"value="200"/><!--每個分區(qū)最小的連接數(shù)-->〈propertyname="minConnectionsPerPartition"value="30"/><!--分區(qū)數(shù),默認(rèn)值2,最小1,推薦3-4,視應(yīng)用而定--><propertyname="partitionCount"value="3"/></bean>JAVA項目中實現(xiàn):實現(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項目中的比較4.1環(huán)境依賴:C3P0、proxool對環(huán)境沒有依賴DBCP是一個依賴Jakartacommons-pool對象池機(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請求訪問TestServlet,TestServlet的代碼如下:測試代碼:4.4用jmeter模擬HTTP請求訪問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:說明是請求類型,如Http,F(xiàn)TP等請求。Samples:也就是圖形報表中的樣本數(shù)目,總共發(fā)送到服務(wù)器的樣本數(shù)目。Average:也就是圖形報表中的平均值,是總運行時間除以發(fā)送到服務(wù)器的請求數(shù)。Median:也就是圖形報表中的中間值,是代表時間的數(shù)字,有一半的服務(wù)器響應(yīng)時間低于該值而另一半高于該值。90%line:是指90%請求的響應(yīng)時間比所得數(shù)值還要小。Min:是代表時間的數(shù)字,是服務(wù)器響應(yīng)的最短時間。Max:是代表時間的數(shù)字,是服務(wù)器響應(yīng)的最長時間。Error%:請求的錯誤百分比。Throughput:也就是圖形報表中的吞吐量,這里是服務(wù)器每單位時間處理的請求數(shù),注意查看是秒或是分鐘。4.5.1在3秒內(nèi)模擬30個線程請求TestServlet,循環(huán)5次DBCPLabel#SamplesAverageMedian90%LineMinMax;-Error%ThroughputHTTP請求15022310.00%51,1/sec總體15022310.00%51,1/secC3P0Lab&l#SamplesAverageMedian90%LineMinMa^::Error%ThroughputHTTP請求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請求150a:231360.00%51.S/sec.總體1502231360.00%51,8/sec4.5.2在3秒內(nèi)模擬60個線程請求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請求'3002241310.00%100.6/see總體3002241310.00%100.6/secBoneCPLabel#SamplesAverageMedian90%LineMinMax.Error%ThroughputHTTP請求300■2231290.00%101.1/sec總體300■2231290.00%101.1/sec4.5.3在6秒內(nèi)模擬60個線程請求TestServlet,循環(huán)5次DBCPLabel#SamplesAverageMedian90%LineMinMa七Error%ThroughputHTTP話求_30011301220.00%50.0/sec總體■~30011301220.00%50.3/secC3P0Label#SamplesAverageMedian90%LineMmMaxError%ThroughputHTTP請求00011■2C160.00%50.8/se&總體300T:1■20160.00%50.8/secProxoolLabel#SamplesAverageMedian90%.LineMinMax;Error%ThroughputHTTP請求■3001131150.00%50.3/sec總體Bo■300neCP1131150.00%50.3/secLabel#SamplesAverageMedian9。%LineMinMait.Error%ThroughputHTTP請求3001130200.00%50.7/sec總體3001130200.00%50..7/sec4.5.4在6秒內(nèi)模擬120個線程請求TestServlet,循環(huán)5次

DBCPLabel#SamplesAverageMedian90%LineMinMastError%ThroughputHTTP請求6001120_J60.00%10O.Vsec總體C3P60001120260.00%100.1JsecLabel#SamplesAverageMedian90%LinsMinMaxError%ThroughputHTTP請求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個線程請求TestServlet,循環(huán)5次DBCPLabel#Samples--AverageMedian90%LineMinMaxError%ThroughputHTTP請求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請求60011200.00%603/sec總體6001120■220.00%60:^secBoneCPLabel#Samples;/AverageMedian90%LineMinM液Error%ThroughputHTTP請求6001130410.00%60.Usee總體6001130410.00%60.1/sec4.5.6在10秒內(nèi)模擬150個線程請求TestServlet,循環(huán)5次DBCPLabel#Samples--AverageMedian90%LineMinMaxError%ThroughputHTTP請求7501120a0.00%75孕招ec.總體7501120270.00%75^fsecC3P0Label#SamplesAverageMedian90%LineMrnMax;-Error%ThroughputHTTP請求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個線程請求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請求10001130■340.00%100:3/sec總體Bo1000neCP11:G0■340.00%100:3/secLabel#Samplas/AverageMedian90%LineMinMax-;Error%ThroughputHTTP請求10001130650.00%99.5/see總體10001130650.00%99.6/sec4.5.8在5秒內(nèi)模擬400個線程請求TestServlet,循環(huán)5次DBCPLabel#SamplesAverageMedian90%LineMinMaxError%ThroughputHTTP請求■200031500.00%3r94.0/sec總體2000?3150730.00%3r94.0<secC3P0Label#Sample.sAverageMedian30%LineMinMaxError%ThroughputHTTP請求2000110650.00%總體20001130650.00%394③杼的ProxoolLabel#SamplesAverageMedian90%LineMinMax.Error%ThroughputHTTP話求20003270600.00%392.6/sec總佐■20003270600.00%392.6/secBoneCPLabel#SamplesAverageMedian90%LineMinMaxError%ThroughputHTTP請求20003190530.00%390.0/sec總體20003190530.00%■390.0/sec4.6測試結(jié)果分析:相同時間內(nèi)同等量的線程數(shù)和循環(huán)次數(shù)下:通過對四個連接池的三個標(biāo)志性性能測試參數(shù)(Average,median,90%Line)進(jìn)行比較發(fā)現(xiàn):DBCP和C3P0差不多,proxool和BoneCP性能較差。4.7測試結(jié)論通過對三種數(shù)據(jù)庫連接池的性能測試發(fā)現(xiàn),dbcp和c3p0能夠更好的支持高并發(fā),但是在穩(wěn)定性方面,c3p0略微優(yōu)于DBCP。5c3p0、dbcp、

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論