標題:Tomcat4/5連接池的設置及簡單應用示例
關鍵字:Tomcat 連接池 JDBC驅動 Context?
作者:jrq
內容:
一、Win2k下Tomcat4的連接池的配置
1.安裝JDK1.4和jakarta-tomcat-4.1.27.exe。
? 路徑分別為 D:/jdk1.4 和 D:/Tomcat 4.1。
? 安裝Tomcat 4時,會要求填寫web訪問端口、用戶名、密碼等信息。
? web訪問端口默認為8080,用戶名默認為admin,密碼自己填寫。
? 啟動Tomcat4,訪問
http://127.0.0.1:8080/
,就能看到Apache Tomcat/4.1.27的歡迎訪問頁面,頁面上有一些相關介紹信息等。
2.設置數據庫的驅動
? 以Oracle的JDBC驅動設置為例:
? Oracle8i的驅動在/oracle/ora81/jdbc/lib/目錄下。名字為classes12.zip。
? Oracle9i的驅動在/oracle9i/jdbc/lib/目錄下,名字為ojdbc14.jar。
? 將這個文件copy到D:/Tomcat 4.1/common/lib 下。
? 注意,如果使用Oracle8i 的驅動,則需要在D:/Tomcat 4.1/common/lib 目錄下將classes12.zip更名為classes12.jar,因為Tomcat4不認識zip的后綴名。
3.設置Web應用。
? 新建一個文件夾,名字為mypool,位置為D:/mypool。這個D:/mypool路徑將是web應用的主目錄。
? 打開D:/Tomcat 4.1/conf/server.xml 文件,找到如下行:
?
? ?<!-- Tomcat Root Context -->
? ? ?<!--
? ? ? ? ?<Context path="" docBase="ROOT" debug="0"/>
? ? ?-->
?
?
? 在這下面,加入如下行:
?
? <Context path="/mypool" docBase="D:/mypool" privileged="true" reloadable="true"/>
?
? 完成后,成為這個樣子:
? ? <!-- Tomcat Root Context -->
? ? ?<!--
? ? ? ? ? <Context path="" docBase="ROOT" debug="0"/>
? ? ? -->
? ?
? ? ?<Context path="/mypool" docBase="D:/mypool" privileged="true" reloadable="true"/>
? 保存D:/Tomcat 4.1/conf/server.xml 文件。
? 配置完成后,重新啟動Tomcat,就可以這樣訪問這個web應用了:
http://127.0.0.1:8080/mypool/
。
4.設置Tomcat的連接池數據源。
? 訪問
http://127.0.0.1:8080/admin
頁面,用剛才安裝 Tomcat4 時填寫的用戶名和密碼登錄。
? 登錄成功后,會出現Tomcat 的web應用管理界面(Tomcat Web Server Administration Tool)。
? 然后在左邊的目錄樹點擊“Data Sources”項,右邊可以看到JNDI配置的頁面。
?
? 在右上角的下拉框中選擇“Create New Data Source”,接下來填寫配置信息:
?
? JNDI Name: jdbc/myOrcl ?
? Data Source URL: jdbc:oracle:thin:@192.168.6.40:1521:dbserver
? JDBC Driver Class: oracle.jdbc.driver.OracleDriver
? User Name: myname
? Password: mypassword
? Max. Active Connections: ?可用默認值
? Max. Idle Connections: ? ?可用默認值
? Max. Wait for Connection: 可用默認值
? Validation Query: 可不填寫。
? 然后,按下“save”按鈕保存。
? 再按下“Commit Changes”按鈕將配置更改提交完成。
? 此時如果看看 Tomcat4 的窗口,會發現在最下面有一行文字提示: ?
? ?Debugging -- changes saved to conf/server.xml
?
? 此時 D:/Tomcat 4.1/conf/server.xml 文件的配置已經更改保存完畢。
? 如果此時打開D:/Tomcat 4.1/conf/server.xml 文件,會發現server.xml 文件的內容改變了很多。
? 一些注釋文字都被去掉了。
? 還會發現上面第三步配置Web應用的如下文字
? ?
? ?<!-- Tomcat Root Context -->
? ? ?<!--
? ? ? ? ? <Context path="" docBase="ROOT" debug="0"/>
? ? ? -->
? ?
? ? ?<Context path="/mypool" docBase="D:/mypool" privileged="true" reloadable="true"/>
? 則被自動修改成了這樣的:
? ? ?<Context className="org.apache.catalina.core.StandardContext" cachingAllowed="true" charsetMapperClass="org.apache.catalina.util.CharsetMapper" cookies="true" crossContext="false" debug="0" docBase="D:/mypool" mapperClass="org.apache.catalina.core.StandardContextMapper" path="/mypool" privileged="true" reloadable="true" swallowOutput="false" useNaming="true" wrapperClass="org.apache.catalina.core.StandardWrapper">
? ? ? ? </Context>
? ?
? ?好了,至此位置,對Oracle的應用連接池已經配置完畢。
? ?
? ?仔細對照server.xml 文件,會發現剛才所配置的連接池信息被放置在<GlobalNamingResources>標簽中,這意味著這個信息是可以被全局引用的,大致是如下的樣子:
? ? <GlobalNamingResources>
? ? <Environment name="simpleValue" override="true" type="java.lang.Integer" value="30"/>
? ? <Resource name="jdbc/myOrcl" scope="Shareable" type="javax.sql.DataSource"/>
? ? <Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" scope="Shareable" type="org.apache.catalina.UserDatabase"/>
? ?
? ? <ResourceParams name="jdbc/myOrcl">
? ? ? <parameter>
? ? ? ? <name>maxWait</name>
? ? ? ? <value>5000</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>maxActive</name>
? ? ? ? <value>200</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>password</name>
? ? ? ? <value>mypassword</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>url</name>
? ? ? ? <value>jdbc:oracle:thin:@192.168.6.40:1521:dbserver</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>driverClassName</name>
? ? ? ? <value>oracle.jdbc.driver.OracleDriver</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>maxIdle</name>
? ? ? ? <value>20</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>username</name>
? ? ? ? <value>myname</value>
? ? ? </parameter>
? ? </ResourceParams>
? ? <ResourceParams name="UserDatabase">
? ? ? <parameter>
? ? ? ? <name>factory</name>
? ? ? ? <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>pathname</name>
? ? ? ? <value>conf/tomcat-users.xml</value>
? ? ? </parameter>
? ? </ResourceParams>
? </GlobalNamingResources> ?
5.設置web應用對連接池的引用。
?
? 打開D:/Tomcat 4.1/conf/server.xml 文件,找到剛才配置的web應用文字,由于剛才server.xml 文件被自動修改過,并去掉了很多注釋內容,所以剛才配置的web應用
? ?<Context path="/mypool" docBase="D:/mypool" privileged="true" reloadable="true"/>
? 被自動修改成了這樣的:
? ? ?<Context className="org.apache.catalina.core.StandardContext" cachingAllowed="true" charsetMapperClass="org.apache.catalina.util.CharsetMapper" cookies="true" crossContext="false" debug="0" docBase="D:/mypool" mapperClass="org.apache.catalina.core.StandardContextMapper" path="/mypool" privileged="true" reloadable="true" swallowOutput="false" useNaming="true" wrapperClass="org.apache.catalina.core.StandardWrapper">
? ? ? ? </Context>
? 在<Context></Context>的描述中加上本web應用對全局連接池的引用說明,如下文字:
? ? <ResourceLink global="jdbc/myOrcl" name="jdbc/myOrcl" type="javax.sql.DataSource"/> ?
? 設置完成后,web應用的描述大致如下面的樣子:
? ? <Context className="org.apache.catalina.core.StandardContext" cachingAllowed="true" charsetMapperClass="org.apache.catalina.util.CharsetMapper" cookies="true" crossContext="false" debug="0" docBase="D:/mypool" mapperClass="org.apache.catalina.core.StandardContextMapper" path="/mypool" privileged="true" reloadable="true" swallowOutput="false" useNaming="true" wrapperClass="org.apache.catalina.core.StandardWrapper"> ?
? ?
? ? ? <ResourceLink global="jdbc/myOrcl" name="jdbc/myOrcl" type="javax.sql.DataSource"/> ? ? ?
? ?
?</Context>
? 保存D:/Tomcat 4.1/conf/server.xml 文件。
? 注意,設置這個連接池的引用說明是非常重要的一步。
? 一些朋友在Tomcat4中配置連接池失敗的原因大都歸咎與此。還有網上一些文章說這是一個Tomcat4的一個Bug。
? 我用了整整兩天兩夜的時間才明白其中的奧秘。[:(]
? 當時離瘋掉只查一點點。因為畢竟配置一個連接池是很簡單的。[:(]
6.一般情況下,到此,連接池的設置就完成了。
? 然后需要重新啟動Tomcat,這樣就可以使用連接池來工作了。
? 但是,看到很多文章上說,還需要設置一下web.xml才能應用。我沒有設置web.xml,連接池也可以完全使用。
? 現在說一下web.xml的配置方法。
? 在D:/mypool中新建文件夾,命名為WEB-INF,注意是大寫的字母。
? 然后在D:/mypool/WEB-INF/ 下新建文件web.xml,其內容為:
? <web-app>
? ? <resource-ref>
? ? ? ? <description>Oracle DataSource example</description>
? ? ? ? <res-ref-name>jdbc/myOrcl</res-ref-name>
? ? ? ? <res-type>javax.sql.DataSource</res-type>
? ? ? ? <res-auth>Container</res-auth>
? ? </resource-ref>
? </web-app>
? 保存D:/mypool/WEB-INF/web.xml 文件。
7.一個簡單的應用示例。
? 寫了一個簡單的JSP頁面,用連接池來訪問數據庫。
內容如下:
---------------------
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="java.sql.*"%>
<%
? ? try
? ? { ? ? ? ? ? ? ? ? ?
? ? ? ?Context initCtx = new InitialContext();
?
? ? ? ?if(initCtx==null)
? ? ? ? ? throw new Exception("沒有匹配的環境");
? ? ? ?Context ctx = (Context) initCtx.lookup("java:comp/env");
? ? ?
? ? ? ?//獲取連接池對象 ? ? ? ? ? ? ? ? ?
? ? ? ?Object obj = (Object) ctx.lookup("jdbc/myOrcl"); ?
? ? ?
? ? ? //類型轉換
? ? ? ?javax.sql.DataSource ds = (javax.sql.DataSource)obj;
? ? ? ? ?
? ? ? ?if(ds==null)
? ? ? ? ? throw new Exception("沒有匹配數據庫"); ?
? ?
? ? ? ?Connection conn = ds.getConnection();
? ? ?
? ? ? ?Statement stmt = conn.createStatement(); ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?String strSql="select * from grade"; ?//SQL,要保證grade數據表里面有記錄。
? ? ? ? ? ? ? ? ? ? ?
? ? ? ?ResultSet rs=stmt.executeQuery(strSql);
? ? ? ?if(rs.next())
? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? out.println(rs.getString(1)); ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? out.println(rs.getString(2)); ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ?}
? ? ? ?rs.close(); ? ? ?//關閉ResultSet ?
? ? ? ?stmt.close(); ? ?//關閉Statement
? ? ? ?conn.close(); ? ?//將連接放回到連接池
? ? ?}
? ? ?catch(Exception ex)
? ? ?{ ? ?
? ? ? ? ?ex.printStackTrace();
? ? ? ? ?throw new SQLException("cannot get Connection pool."+ex);
? ? ?}
%>
<hr>
--------------------
?
記住,用完后的數據庫連接要釋放。
不然當打開的連接過多或惡意刷屏,連接池的連接數目會被用完。
當連接池的連接數目用完后,再訪問jsp頁面時,會在頁面出現如下的錯誤信息,報告連接池的連接被耗盡:
java.sql.SQLException: DBCP could not obtain an idle db connection, pool exhausted
二、Win2k下Tomcat5 的連接池的配置
安裝jakarta-tomcat-5.0.13.exe,假如Tomcat5的安裝目錄為 D:/Tomcat 5.0 。
別忘了把oracle的驅動程序classes12.jar文件copy到目錄 D:/Tomcat 5.0/common/lib/ 下。
Tomcat5的連接池設置和Tomcat4 的差不多,僅說明一下不同點或需要特別注意的地方。
1. Tomcat5啟動后,訪問
http://127.0.0.1:8080/admin
頁面,當設置完Tomcat的連接池數據源后,打開D:/Tomcat 5.0/conf/server.xml 文件,會看到配置的連接池相關信息大致如下樣子:
<GlobalNamingResources>
? ? <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
? ? <Resource name="jdbc/myOrcl" type="javax.sql.DataSource"/>
? ? <Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" type="org.apache.catalina.UserDatabase"/>
? ? <ResourceParams name="jdbc/myOrcl">
? ? ? <parameter>
? ? ? ? <name>maxWait</name>
? ? ? ? <value>5000</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>maxActive</name>
? ? ? ? <value>4</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>password</name>
? ? ? ? <value>mypassword</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>url</name>
? ? ? ? <value>jdbc:oracle:thin:@127.0.0.1:1521:dbserver</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>driverClassName</name>
? ? ? ? <value>oracle.jdbc.driver.OracleDriver</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>maxIdle</name>
? ? ? ? <value>2</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>username</name>
? ? ? ? <value>myusername</value>
? ? ? </parameter>
? ? </ResourceParams>
? ? <ResourceParams name="UserDatabase">
? ? ? <parameter>
? ? ? ? <name>factory</name>
? ? ? ? <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
? ? ? </parameter>
? ? ? <parameter>
? ? ? ? <name>pathname</name>
? ? ? ? <value>conf/tomcat-users.xml</value>
? ? ? </parameter>
? ? </ResourceParams>
? </GlobalNamingResources>
可以看到,一些連接池的信息配置參數已經和Tomcat4不同了。
但大致配置步驟和方法都是一樣的。
2.設置web應用對連接池的引用。
?打開D:/Tomcat 5.0/conf/Catalina/localhost/ 目錄,找到和web應用同名的xml文件(mypool.xml),打開這個文件,
修該其<Context></Context>的描述信息,添加如下行:
? ?<ResourceLink global="jdbc/myOrcl" name="jdbc/myOrcl" type="javax.sql.DataSource"/> ?
使mypool.xml文件的內容看起來大致這個:
?
? ?<Context docBase="D:/mypool" path="/mypool" privileged="true" reloadable="true">
? ? ?<ResourceLink global="jdbc/myOrcl" name="jdbc/myOrcl" type="javax.sql.DataSource"/>
? ?</Context>
然后保存mypool.xml,需要重新Tomcat5服務,使之生效。
3.JSP頁面測試文件的寫法也是一樣的,不再贅述。
4.一些補充:
? 如果web應用沒有配置對連接池的引用,即沒有配置<ResourceLink>,則會在訪問jsp頁面時出現如下錯誤:
? ? NameNotFoundException: Name jdbc is not bound in this Context
? 如果缺少Oracle的JDBC驅動,則會在訪問jsp頁面時出現如下錯誤:
? ? java.sql.SQLException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??????????? ? ? ????????????? ??????? ?? ? ? ? ? ? ? ? ? ? ? ? ??????????????????????????????????? ? ? ? ? ?by ?jrq
????????????????????
????????????????????????????? ??????????????????? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2004年10月26日夜 ?于石市
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
