Tomcat數(shù)據庫連接池的配(pèi)置方法總結
數據庫連接是一種關鍵的有限的昂貴的資源,這在(zài)多用戶網頁應用程(chéng)序中體現的尤為突出.對(duì)數據庫連接的管理能顯著影響到整個應用(yòng)程序的(de)伸縮(suō)性和健壯性,影響到程(chéng)序的(de)性能指標,數(shù)據庫連接池正是(shì)針對這(zhè)個(gè)問題提出的.
數(shù)據庫(kù)連接池負責分(fèn)配,管理和釋放數據庫連接,它允許應用程(chéng)序重複使用(yòng)一個現有的(de)數(shù)據(jù)庫連接,而不是(shì)再(zài)重新建立一(yī)個;釋放空閑時間超過最(zuì)大空閑時間(jiān)的數據(jù)庫連接來避免因為(wéi)沒有釋(shì)放數據庫(kù)連接而(ér)引(yǐn)起的數(shù)據(jù)庫連接遺(yí)漏,這樣(yàng)可(kě)以明顯提高對數據(jù)庫操作的性能.
數(shù)據庫連接(jiē)池在初始(shǐ)化的時將創建一定數量的數據庫連接放到連接池中,這(zhè)些數據(jù)庫(kù)連接的數量是又(yòu)最(zuì)小數(shù)據庫連(lián)接數來設(shè)定的,無論這些數據庫(kù)連接是否(fǒu)被使用,連接(jiē)池都將一直保證至少擁有(yǒu)這麽多的連接(jiē)數(shù),當應用程序向(xiàng)連接(jiē)池請(qǐng)求的連接數超(chāo)過最大連接數量時,這些請(qǐng)求將被加入到等待隊列中.
數據庫連接池的最小連接數和(hé)最大連接數的設置要考(kǎo)慮到下列幾個因素:
1.最小連接數是連接(jiē)池一直(zhí)保(bǎo)持(chí)的數據庫連接,所以如(rú)果應(yīng)用程序對數(shù)據庫連接的使用(yòng)量不大,將會有大量(liàng)的數(shù)據庫連接資源被浪費.
2.最大連接數是連接(jiē)池申請的(de)最(zuì)大(dà)連接數,如果數據庫連接(jiē)請求超過次數,後麵的數據庫連接請求將被加入到(dào)等待對(duì)了中,這回影響之後的(de)數據庫操作
如果最小連接數(shù)與最(zuì)大連接數相差太(tài)大,那麽最先的(de)連接(jiē)請求將會獲利,之後超過最(zuì)小連接(jiē)數量的連接請求等價於建立一個新的數據庫連接,不(bú)過,這些小於最小連接(jiē)數的(de)數據庫連(lián)接在使用(yòng)完不會馬上被釋(shì)放,它將被放到連接池中等待重複使用或(huò)是空閑超時被釋放.
實例使用的Tomcat版本為6.0
方法一: 在Tomcat的conf/context.xml中配置
在Tomcat\apache-tomcat-6.0.33\conf目錄下的context.xml文(wén)件中配置默認值(zhí)如下:
<?xml version='1.0' encoding='utf-8'?> <Context> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context>
配置連(lián)接池:
<?xml version='1.0' encoding='utf-8'?>
<Context> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!--配置(zhì)oracle數據(jù)庫(kù)的連接(jiē)池--> <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驅動類(lèi)放到tomcat的lib目錄下(xià) maxIdle 連接池中最多可空(kōng)閑maxIdle個連(lián)接 minIdle 連接池中最少空閑maxIdle個(gè)連(lián)接 initialSize 初始化連接數目 maxWait 連接池中連接用完時,新的請求等待時間,毫秒(miǎo) username 數據庫用(yòng)戶名 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>
配置好後(hòu)需要注意的(de)兩個步驟
1.將(jiāng)對應數(shù)據庫的驅動類放(fàng)到tomcat的lib目(mù)錄西安
2.重新啟動tomcat服務器,讓(ràng)配(pèi)置生(shēng)效
在web應用(yòng)程(chéng)序的web.xml中設置數(shù)據源參考,如(rú)下(xià):
在<web-app></web-app>節點中加入下(xià)麵內容
<resource-ref>
<description>mysql數據庫(kù)連(lián)接(jiē)池</description> <!-- 參考數據源名字,同Tomcat中配置的Resource節(jiē)點中name屬(shǔ)性值"jdbc/mysqlds"一(yī)致(zhì) --> <res-ref-name>jdbc/mysqlds</res-ref-name> <!-- 資源類(lèi)型 --> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref>
錯(cuò)誤解(jiě)決(jué):
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)
解(jiě)決方(fāng)案:
上麵的異常(cháng)信息是配置文件(jiàn)中(zhōng)JNDI沒有初始化造成的(de)
如果下麵的問(wèn)題都不存在
1.要去檢查下配置文件(jiàn)中連(lián)接(jiē)數據庫(kù)的(de)URL參數是(shì)否正確2.以及是否導入了正常的包3.檢(jiǎn)查在Tomcat中(zhōng)conf/server.xml文件,檢查是否設置useNaming="false",如果是,去掉
2.那就是通過main方法測(cè)試的,這個數據(jù)源不支持(chí)這樣的測試方法,程(chéng)序要運行在Tomcat中才能(néng)找(zhǎo)到相應(yīng)的數據源.[我在測試時(shí)犯這樣(yàng)的錯(cuò)導致上麵錯誤出現]
<%@ 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連接池測(cè)試,獲取數(shù)據源 <br> <% try { //初始化(huà)查找命名空間 Context ctx = new InitialContext(); //參數java:/comp/env為(wéi)固(gù)定路徑 Context envContext = (Context)ctx.lookup("java:/comp/env"); //參數jdbc/mysqlds為數據(jù)源和JNDI綁定(dìng)的名(míng)字 DataSource ds = (DataSource)envContext.lookup("jdbc/mysqlds"); Connection conn = ds.getConnection(); conn.close(); out.println("<span style='color:red;'>JNDI測試成(chéng)功<span>"); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } %> </body> </html>
運行效果(guǒ):
方法二:在Tomcat的conf/server.xml中配置(zhì)
打(dǎ)開tomcat的conf/server.xml文件(jiàn),找到<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>
在該節點中加入相關(guān)的池配置信息,如下
<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的(de)lib目錄下 --> <Reso
關鍵詞:Tomcat,數據庫
閱讀本文後您有什麽感(gǎn)想(xiǎng)? 已有 人(rén)給出評價!
- 0
- 0
- 0
- 0
- 0
- 0