Tomcat數據庫連接池的配置方法總結
數據庫連接是一種關鍵的有限的昂貴的資源,這在多用戶網頁應用程序中體現的尤為突出.對數據庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標,數據庫連接池正是針對這個問題提出的.
數據庫連接池負責分配,管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏,這樣可以明顯提高對數據庫操作的性能.
數據庫連接池在初始化的時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的,無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中.
數據庫連接池的最小連接數和最大連接數的設置要考慮到下列幾個因素:
1.最小連接數是連接池一直保持的數據庫連接,所以如果應用程序對數據庫連接的使用量不大,將會有大量的數據庫連接資源被浪費.
2.最大連接數是連接池申請的最大連接數,如果數據庫連接請求超過次數,后面的數據庫連接請求將被加入到等待對列中,這會影響之后的數據庫操作
如果最小連接數與最大連接數相差太大,那么最先的連接請求將會獲利,之后超過最小連接數量的連接請求等價於建立一個新的數據庫連接,不過,這些小於最小連接數的數據庫連接在使用完不會馬上被釋放,它將被放到連接池中等待重復使用或是空閑超時被釋放.
實例使用的Tomcat版本為6.0
方法一: 在Tomcat的conf/context.xml中配置
在Tomcat\apache-tomcat-6.0.33\conf目錄下的context.xml文件中配置默認值如下:
<?xml version='1.0' encoding='utf-8'?> <Context> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context>
配置連接池:
<?xml version='1.0' encoding='utf-8'?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!--配置oracle數據庫的連接池-->
<Resource name="jdbc/oracleds"
author="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="scott"
password="tiger"
driverClassName="oracle.jdbc.dirver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:ora9" />
<!--配置mysql數據庫的連接池,
需要做的額外步驟是將mysql的Java驅動類放到tomcat的lib目錄下
maxIdle 連接池中最多可空閑maxIdle個連接
minIdle 連接池中最少空閑maxIdle個連接
initialSize 初始化連接數目
maxWait 連接池中連接用完時,新的請求等待時間,毫秒
username 數據庫用戶名
password 數據庫密碼
-->
<Resource name="jdbc/mysqlds"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
maxIdle="30"
maxWait="10000"
maxActive="100"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/db_blog" />
</Context>
配置好后需要注意的兩個步驟
1.將對應數據庫的驅動類放到tomcat的lib目錄下
2.重新啟動tomcat服務器,讓配置生效
在web應用程序的web.xml中設置數據源參考,如下:
在<web-app></web-app>節點中加入下面內容
<resource-ref>
<description>mysql數據庫連接池</description>
<!-- 參考數據源名字,同Tomcat中配置的Resource節點中name屬性值"jdbc/mysqlds"一致 -->
<res-ref-name>jdbc/mysqlds</res-ref-name>
<!-- 資源類型 -->
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
錯誤解決:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at com.iblog.util.DBPoolUtil.<clinit>(DBPoolUtil.java:34)
解決方案:
上面的異常信息是配置文件中JNDI沒有初始化造成的
如果下面的問題都不存在
1.要去檢查下配置文件中連接數據庫的URL參數是否正確2.以及是否導入了正常的包3.檢查在Tomcat中conf/server.xml文件,檢查是否設置useNaming="false",如果是,去掉
2.那就是通過main方法測試的,這個數據源不支持這樣的測試方法,程序要運行在Tomcat中才能找到相應的數據源.[我在測試時犯這樣的錯導致上面錯誤出現]
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="javax.sql.DataSource" %>
<html>
<head>
<title>Tomcat6.0 JNDI!</title>
</head>
<body>
Tomcat連接池測試,獲取數據源 <br>
<%
try {
//初始化查找命名空間
Context ctx = new InitialContext();
//參數java:/comp/env為固定路徑
Context envContext = (Context)ctx.lookup("java:/comp/env");
//參數jdbc/mysqlds為數據源和JNDI綁定的名字
DataSource ds = (DataSource)envContext.lookup("jdbc/mysqlds");
Connection conn = ds.getConnection();
conn.close();
out.println("<span style='color:red;'>JNDI測試成功<span>");
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
%>
</body>
</html>
運行效果:

方法二:在Tomcat的conf/server.xml中配置
打開tomcat的conf/server.xml文件,找到<GlobalNamingResources></GlobalNamingResources>節點,默認的內容如下
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
在該節點中加入相關的池配置信息,如下
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
<!--配置mysql數據庫的連接池,
需要做的額外步驟是將mysql的Java驅動類放到tomcat的lib目錄下
-->
<Resource name="jdbc/mysqlds"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
maxIdle="30"
maxWait="10000"
maxActive="100"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/db_blog" />
</GlobalNamingResources>
在tomcat的conf/context.xml文件中的<Context></Context>節點中加入如下內容
<ResourceLink name="jdbc/mysqlds" global="jdbc/mysqlds" type="javax.sql.DataSource"/>
然后在web項目中的WEB-INF目錄下的web.xml中配置
<resource-ref>
<description>mysql數據庫連接池</description>
<!-- 參考數據源名字,同Tomcat中配置的Resource節點中name屬性值"jdbc/mysqlds"一致 -->
<res-ref-name>jdbc/mysqlds</res-ref-name>
<!-- 資源類型 -->
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
同樣配置好后,需要重新啟動服務器,讓配置生效.
方法三:在Tomcat的conf/server.xml中配置虛擬目錄時配置
在配置虛擬目錄時,也就是在配置conf下面的server.xml時,在context標簽內添加池配置.
在說該方法之前,先說一下,如何用tomcat配置虛擬目錄
在tomcat\conf下server.xml中找到
<Host name="localhost" appBase="webapPS" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host>
在其中添加:
<Context path="/website" docBase="F:/myweb" reloadable="true"></Context>
注意:
docBase要改成你的項目目錄。
path為虛擬路徑,訪問時的路徑,注意:一定要加“/” debug建議設置為0
reloadable設置為true。
這樣重新啟動tomcat
實例中如下配置
<Context path="/website" docBase="D:/program files/Tomcat/apache-tomcat-6.0.33/webapps/iblog.war" reloadable="true"> </Context>
接下來添加池配置,如下
<!--配置虛擬目錄-->
<Context path="/website" docBase="D:/program files/Tomcat/apache-tomcat-6.0.33/webapps/iblog.war" reloadable="true">
<Resource name="jdbc/mysqlds"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
maxIdle="30"
maxWait="10000"
maxActive="100"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/db_blog"
/>
</Context>
啟動服務器,測試,注意因為我們配置了path值為”/website”,所以訪問的路徑應該為website.如下圖:

方法四:在Web項目中的META-INF目錄下新建一個文件context.xml,寫入配置
注意:是META-INF目錄下,不是WEB-INF目錄下
<?xml version='1.0' encoding='utf-8'?>
<Context>
<Resource name="jdbc/mysqlds"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
maxIdle="30"
maxWait="10000"
maxActive="100"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/db_blog"
logAbandoned="true" />
</Context>
