Posted on 2006-10-20 09:45
帥子 閱讀(1306)
評論(2) 編輯 收藏
?本文旨在給程序開發人員提供一個比較具體的Tomcat連接池參考方案,為了提高文章的可讀性,文章前端引用了一位前輩的話,如果構成誤解,請多多諒
解,本文不是從商業考慮的。有問題請聯系作者MSN:hpj2001(at)hotmail.com,Email:tocow(at)
google.com。
連接池簡介
?程序開發,存在很多問題:首先,每一次Web請求都要建立一次數據庫連
接。建立連接是一個費時的活動,每次都得花費0.05s~1s的時間,而且系統還要分配內存資源。這個時間對于一次或幾次數據庫操作,或許感覺不出系統有
多大的開銷。可是對于現在的Web應用,尤其是大型電子商務網站,同時有幾百人甚至幾千人在線是很正常的事。在這種情況下,頻繁的進行數據庫連接操作勢必
占用很多的系統資源,網站的響應速度必定下降,嚴重的甚至會造成服務器的崩潰。不是危言聳聽,這就是制約某些電子商務網站發展的技術瓶頸問題。其次,對于
每一次數據庫連接,使用完后都得斷開。否則,如果程序出現異常而未能關閉,將會導致數據庫系統中的內存泄漏,最終將不得不重啟數據庫。還有,這種開發不能
控制被創建的連接對象數,系統資源會被毫無顧及的分配出去,如連接過多,也可能導致內存泄漏,服務器崩潰。
??????數據庫連接池(connection?pool)的工作原理:
??????由上面的分析可以看出,問題的根源就在于對數據庫連接資源的低效管理。
對
于共享資源,有一個很著名的設計模式:資源池(Resource?Pool)。該模式正是為了解決資源的頻繁分配、釋放所造成的問題。為解決上述問題,可
以采用數據庫連接池技術。數據庫連接池的基本思想就是為數據庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時,只需
從“緩沖池”中取出一個,使用完畢之后再放回去。我們可以通過設定連接池最大連接數來防止系統無盡的與數據庫連接。更為重要的是我們可以通過連接池的管理
機制監視數據庫的連接的數量、使用情況,為系統開發、測試及性能調整提供依據。
一、Tomcat一般性說明
1、本壓縮包內的tomcat為apache-tomcat-5.5.20,截止到2006-10-12,是www.apache.org上最新的tomcat版本。
2、Tomcat使用的端口都是默認的。兩個比較重要的端口說明,shutdown?port:8005;non-SSL?HTTP/1.1?Connector?port:8080。
3、涉及到修改的文件:
???a../?conf下server.xml、web.xml
???b../common/lib下增加ms-sql?jdbc的三個jar包msbase.jar、mssqlserver.jar、msutil.jar
二、Tomcat配置連接池方案
???????本文針對的是tomcat?5.5版本的連接池介紹,其它版本可能不適用。
???????數據源可以配置成全局的和局部的:可以在任意Context中引用全局的數據源,在某一Context配置的數據源,不能在其它Context引用它。理解了全局和局部數據源的關系,下面就來介紹一下詳細配置說明,如下:
1、編輯打開./confCatalina/localhost/gdczsam.xml可以看到:
<!--F?hpj?2006-10-12?
????Defualt,?we?set?all?different?Resources?as?Global-Resource[which?defined?in?server.xml?<GlobalNamingResources></GlobalNamingResources>],?
????and?get?special?Resource?we?needed?in?per-web-application?contexts?from?Global-Resource.
????otherwise,we?can?set?Resource?we?needed?in?any?special?Context,?all?two?solutions?are?offered.
????A.during?application?development?set?reloadable="true",?when?deployed?production?set?reloadable="false"
????B.many?other?datebase,?url?and?driverClassName?like?underside?list:
??????1.ms-sql???????driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
?????????????????????url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=SAM_GDCZ"
??????2.oracle???????driverClassName="oracle.jdbc.driver.OracleDriver"
?????????????????????url="jdbc:oracle:thin:@127.0.0.1:1521:SAM_GDCZ"
??????3.postgresql???driverClassName="org.postgresql.Driver"
?????????????????????url="jdbc:postgresql://127.0.0.1:5432/SAM_GDCZ"
??????4.mysql????????driverClassName="org.gjt.mm.mysql.Driver"[old?mySql?jdbc?driver]
?????????????????????driverClassName="com.mysql.jdbc.Driver"
?????????????????????url="jdbc:mysql://127.0.0.1:3306/SAM_GDCZ"
-->
<Context?docBase="setup?directory"?path="/gdczsam"?reloadable="true"?cookies="true"?crossContext="true"?privileged="true"?antiResourceLocking="false"?antiJARLocking="false">
<!--
????<Resource?name="jdbc/mssql-SAM_GDCZ"
??????????????auth="Container"
????????????????type="javax.sql.DataSource"
????????????????driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
????????????????url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=SAM_GDCZ"
????????????????username="sa"
????????????????password=""
????????????????maxIdle="30"
????????????????maxWait="10000"
????????????????maxActive="100"/>
-->
<!--F?hpj?2006-10-12?
????name:?The?name?of?the?resource?link?to?be?created,?which?will?be?used?in?this?web-application?context?environment.
????global:?The?name?of?the?linked?global?resource?in?the?global?JNDI?context.
????type:?The?fully?qualified?Java?class?name?expected?by?the?web?application?when?it?performs?a?lookup?for?this?resource?link.
-->
???<ResourceLink?name="mssql-SAM_GDCZ"?global="jdbc/mssql-SAM_GDCZ"?type="javax.sql.DataSource"/>
</Context>
?????????本文提供的tomcat連接池的默認配置如上述,代碼的說明性很強,既采用在./?conf/server.xml配置的全局數據源,然后在指定的Context中調用的方式。
?????????server.xml中的數據源就是上述代碼段注釋的Resource節點,被包含在server.xml中的GlobalNamingResources節點中。
?????????其中需要注意的是,該數據源需要在./conf/web.xml中加入一段聲明,如下:
????<resource-ref>
????????<description>DB?Connection</description>
????????<res-ref-name>jdbc/mssql-SAM_GDCZ</res-ref-name>
????????<res-type>javax.sql.DataSource</res-type>
????????<res-auth>Container</res-auth>
????</resource-ref>
2、
第二種tomcat數據源的配置方式是本人推薦的:不在server.xml的GlobalNamingResources節點中加入Resource節
點,而是對每個指定的Context配置數據源,這樣結構比較清晰。采用這種方式的gdczsam.xml配置如下:
<Context?docBase="setup?directory"?path="/gdczsam"?reloadable="true"?cookies="true"?crossContext="true"?privileged="true"?antiResourceLocking="false"?antiJARLocking="false">
????<Resource?name="jdbc/mssql-SAM_GDCZ"
??????????????auth="Container"
????????????????type="javax.sql.DataSource"
????????????????driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
????????????????url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=SAM_GDCZ"
????????????????username="sa"
????????????????password=""
????????????????maxIdle="30"
????????????????maxWait="10000"
????????????????maxActive="100"/>
</Context>
3、以上兩種方式,只要是不同的數據源都必須在./conf/web.xml中加入resource-ref聲明。
4、產品部署時,不論使用什么方式來部署程序,都需要在./confCatalina/localhost中加入類似gdczsam.xml的文件來配置數據源。