tomcat服務器連接池知識 ??
什么是敏捷開發
簡單的說,敏捷開發是一種以人為核心、迭代、循序漸進的開發方法。在敏捷開發中,軟件項目的構建被切分成多個子項目,
各個子項目的成果都經過測試,具備集成和可運行的特征。換言之,就是把一個大項目分為多個相互聯系,但也可獨立運行的小項目,
并分別完成,在此過程中軟件一直處于可使用狀態。
Tomcat中配置連接池步驟
本方法的原理是,在%CATALINA%\conf\server.xml中設置數據庫的連接屬性,
在應用目錄的/WEB-INF/web.xml中配置一個引用,
然后在應用中的/META-INF/context.xml中將以上兩個配置聯系起來。
所以真正產生連接的是tomcat系統級,因此數據庫驅動應該放在%CATALINA%\common\lib中
以下是具體步驟:
1.將數據庫驅動程序的JAR文件放在Tomcat的 common/lib 中。
2.在server.xml中設置數據源,以MySQL數據庫為例,如下:
在<GlobalNamingResources> </GlobalNamingResources>節點中加入,
? <Resource
? name="jdbc/DBPool"
? type="javax.sql.DataSource"
? password="root"
? driverClassName="com.mysql.jdbc.Driver"
? maxIdle="2"
? maxWait="5000"
? username="root"
? url="jdbc:mysql://127.0.0.1:3306/test"
? maxActive="4"/>
? 屬性說明:name,數據源名稱,通常取”jdbc/XXX”的格式;
? type,”javax.sql.DataSource”;
? password,數據庫用戶密碼;
? driveClassName,數據庫驅動;
? maxIdle,最大空閑數,數據庫連接的最大空閑時間。超過空閑時間,數據庫連
? 接將被標記為不可用,然后被釋放。設為0表示無限制。
? MaxActive,連接池的最大數據庫連接數。設為0表示無限制。
? maxWait ,最大建立連接等待時間。如果超過此時間將接到異常。設為-1表示
? 無限制。
3.在你的web應用程序的web.xml中設置數據源參考,如下:
? 在<web-app></web-app>節點中加入,
? <resource-ref>
? <description>MySQL DB Connection Pool</description>
? <res-ref-name>jdbc/DBPool</res-ref-name>
? <res-type>javax.sql.DataSource</res-type>
? <res-auth>Container</res-auth>
? <res-sharing-scope>Shareable</res-sharing-scope>
?</resource-ref>
? 子節點說明: description,描述信息;
? res-ref-name,參考數據源名字,同上一步的屬性name;
? res-type,資源類型,”javax.sql.DataSource”;
? res-auth,”Container”;
? res-sharing-scope,”Shareable”;
4.在web應用程序的/META-INF/context.xml中設置數據源鏈接,如下:
? 在<Context></Context>中加入:
? <Context>
? <ResourceLink
? name="jdbc/DBPool"?
? type="javax.sql.DataSource"?
? global="jdbc/DBPool"/>
? </Context>
? 屬性說明:name,同第2步和第3步的屬性name值,和子節點res-ref-name值;
? type,同樣取”javax.sql.DataSource”;
? global,同name值。
?
至此,設置完成,下面是如何使用數據庫連接池。
1.建立一個連接池類,DBPool.java,用來創建連接池,代碼如下:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class DBPool {
? private static DataSource pool;
? static {
? Context env = null;
? try {
? env = (Context) new InitialContext().lookup("java:comp/env");
? pool = (DataSource)env.lookup("jdbc/DBPool");
? if(pool==null)?
? System.err.println("'DBPool' is an unknown DataSource");
? } catch(NamingException ne) {
? ne.printStackTrace();
? }
? }
? public static DataSource getPool() {
? return pool;
? }
}
2.在要用到數據庫操作的類或jsp頁面中,用DBPool.getPool().getConnection(),
獲得一個Connection對象,就可以進行數據庫操作,最后別忘了對Connection對象調用close()方法,
注意:這里不會關閉這個Connection,而是將這個Connection放回數據庫連接池。
數據源和數據庫共享連接池關系
一、數據源簡介:
在Java語言中,DataSource對象就是一個代表數據源實體的對象。一個數據源就是一個用來存儲數據的工具,它可以是復雜的大型企業級數據庫,
也可以是簡單得只有行和列的文件。數據源可以位于在服務器端,也可以位于客服端。
應用程序通過一個連接來訪問數據源,那么一個DataSource對象就是用于提供連接數據源的工具。DataSource接口提供了兩個方法用于建立和數據源的連接,
使用DataSource對象建立和數據庫的連接比起使用DriverManager接口更加高效,雖然兩者的使用范圍都很相似,并且都提供了方法用于建立和數據庫的連接,設置連接的最大超時時間,獲取流、登錄。
??
但兩者之間的區別更加明顯。和DriverManager不同,一個DataSource對象能夠識別和描述它所代表的數據源的屬性,
而且 DataSource對象的工作和JNDI(Javatm Naming and Directory Interfaceti)具有密切的關系, DataSource的建立、發布、獨立于應用程序的管理都依靠JNDI技術。
???
在JDBC2.0或JDBC3.0中,所有的數據庫驅動程序提供商必須提供一個實現了DataSource接口的類,要使用數據源必須首先在JNDI中注冊該數據源對象。
如果在JNDI中注冊了數據源對象,將會比起使用DriverManager來具有兩個方面的優勢:
首先程序不需要像使用DriverManager一樣對加載的數據庫驅動程序信息進行硬編碼,程序員可以選擇先在JNDI中注冊這個數據源對象,然后在程序中使用一個邏輯名稱來引用它,
JNDI會自動根據你給出的名稱找到與這個名稱綁定的DataSource對象。然后就可以使用這個DataSource對象來建立和具體數據庫的連接了。
其次,使用實現了DataSource接口的類所具有的第二個優勢體現在連接池和分布式事務上。連接池通過對連接的復用而不是新建一個物理連接來顯著地提高程序的效率。
從而適用于任務繁忙、負擔繁重的企業級分布式事務。
二、JNDI簡介:
JNDI是用于向Java程序提供目錄和命名功能的API。它被設計成獨立于特定的目錄服務,所以各種各樣的目錄都可以通過相同的方式進行訪問。
可以簡單地把JNDI理解為一種將對象和名字綁定的技術,對象工廠負責生產出對象,這些對象都和惟一的名字綁定。外部程序可以通過名字來獲取對某個對象的引用。
在Intranets (企業內部網)和Internates(互聯網)中目錄服務(Directory service)扮演了一個非常重要的角色,它能夠在眾多的用戶、機器、網絡、服務、應用程序中訪問各種各樣的信息。
目錄服務提供了一系列的命名措施,用人類可以理解的命名方式來刻畫各種各樣的實體之間的關系
一個企業式計算環境(computing environment)通常是由若干代表不同部分的命名復合而成。比如在一個企業級環境中DNS (Domain Name System)通常被當成頂層的命名方案(top-level namein facility)區分不同的部門或組織。而這些部門或組織自己又可以使用諸如LADP或NDS的目錄服務
從用戶的角度來看,這些都是由不同的命名方案構成的復合名稱。URL就是一個很典型的例子,它由多個命名方案構成。使用目錄服務的應用程序必須支持這種復合構成方式
使用目錄服務API的Java開發人員獲得的好處不僅在于API獨立于特定的目錄或命名服務,而且可以通過多層的命名方案無縫訪問 (seamless acess)目錄對象。實際上,
任何的應用程序都可以將自身的對象和特定的命名綁定起來,這種功能可以使到任何的Java程序查找和獲取任何類型的對象
終端用戶可以方便地使用邏輯名稱從而輕易地在網絡上查找和識別各種不同的對象,目錄服務的開發人員可以使用API方便地在不同的客服端之間切換而不需要作任何更改
三、數據源和連接池的關系:
JDBC2.0提供了javax.sql.DataSource接口,它負責建立與數據庫的連接,在應用程序訪問數據庫時不需要編寫連接數據庫的代碼,可以直接從數據源獲得數據庫連接。
在DataSource中事先建立了多個數據庫連接,這些數據庫連接保存在連接池(Connect Pool)中。Java程序訪問數據庫時,只需要從連接池中取出空閑狀態的數據庫連接;
當程序訪問數據庫結束,再將數據庫連接放回連接池。
四、數據源和JNDI的關系:
DataSource對象是由Tomcat提供的,因此不能在程序中采用創建一個實例的方式來生產DataSource對象,而需要采用Java的另一個技術JNDI,來獲得DataSource對象的引用。
Tomcat把DataSource作為一種可以配置的JNDI資源來處理。生成DataSource對象的工廠為org.apache.commons.dbcp.BasicDataSourceFactory。
在javax.naming包中提供了Context接口,該接口提供了將對象和名字綁定,以及通過名字檢索對象的方法。Context中的主要方法有:
bind(String name,Object object):將對象與一個名字綁定
lookup(String name):返回與指定的名字綁定的對象
五、Tomcat中數據源的配置:
數據源的配置涉及修改server.xml和web.xml,在server.xml中加入定義數據源的元素<Resource>,在web.xml加入<resource-ref>元素,聲明該Web應用所引用的數據
A.在server.xml中加入<Resource>元素:<Resource>元素用來定義JNDI Resource。
屬性??? 描述
name??? 指定Resource的JNDI名字
auth??? 指定管理Resource的Manager,它有兩個可選值:Container、Application
type??? 指定Resource所屬的Java類名
<Resource name = "jdbc/BookDb"
auth = "Container"
???? type = "javax.sql.DataSource" />
B.在<Resource>元素中加入<ResourceParams>元素:<ResourceParams>元素用來指定各種參數值
屬性??? 描述
factory??? 指定生成的DataResource的factory類名
maxActive??? 指定數據庫連接池中處于活動狀態的最大連接數目,0表示不受限制
maxIdle??? 指定數據庫連接池中處于空閑狀態的最大連接數目,0表示不受限制
maxWait??? 指定連接池中連接處于空閑狀態的最長時間,超過會拋出異常,-1表示無限
username??? 指定連接數據庫的用戶名
password??? 指定連接數據庫的口令
driverClassName??? 指定連接數據庫的JDBC驅動程序
url???????????? 指定連接數據庫的URL
?? <ResourceParams name = "jdbc/BookDb">
??? <parameter>
?????? <name>factory</name>
?????? <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
??? </parameter>
??? <parameter>
?????? <name>maxActive</name>
?????? <value>100</value>
??? </parameter>
??? <parameter>
?????? <name>maxIdle</name>
?????? <value>30</value>
??? </parameter>
??? <parameter>
?????? <name>maxWait</name>
?????? <value>10000</value>
??? </parameter>
??? <parameter>
?????? <name>username</name>
?????? <value>user</value>
??? </parameter>
??? <parameter>
?????? <name>password</name>
?????? <value>1234</value>
??? </parameter>?
??? <parameter>
?????? <name>driverClassName</name>
?????? <value>com.mysql.jdbc.Driver</value>
??? </parameter>
??? <parameter>
?????? <name>url</name>
?????? <value>jdbc:mysql//localhost:3306/BookDb?autoReconnect=true</value>
??? </parameter>?
</ResourceParams>
C.在web.xml中加入<resource-ref>元素:<resource-ref>元素表示在Web應用中引用JNDI資源
屬性????????????????? 描述
description??? 對所引用的資源的說明
res-ref-name??? 指定所引用資源的JNDI名字,與<Resource>元素中的name屬性對應
res-type???????????? 指定所引用資源的類名字,與<Resource>元素中的type屬性對應
res-auth???????????? 指定所引用資源的Manager,與<Resource>元素中的auth屬性對應
?
六、在Web應用中使用數據源:
javax.naming.Context提供了查找JNDI Resource的接口,可以通過三個步驟來使用數據源對象:
A.獲得對數據源的引用:
Context ctx = new InitalContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/BookDb");
??? B.獲得數據庫連接對象:
??????? Connection con = ds.getConnection();
??? C.返回數據庫連接到連接池:
??????? con.close();
?
在連接池中使用close()方法和在非連接池中使用close()方法的區別是:前者僅僅是把數據庫連接對象返回到數據庫連接池中,
是連接對象又恢復到空閑狀態,而非關閉數據庫連接,而后者將直接關閉和數據庫的連接
七、發布使用數據源的Web應用:
如果直接同JDBC訪問數據庫,可以把JDBC驅動程序拷貝到Web應用的WEB-INF/lib目錄或者Tomcat安裝目錄下的common/lib目錄下。
如果通過數據源訪問數據庫,由于數據源由Servlet容器創建并維護,所以必須把JDBC驅動程序拷貝到Tomcat安裝目錄下的common/lib目錄下,確保Servlet容器能夠訪問驅動程序。
數據庫連接池的主要操作如下:
(1)建立數據庫連接池對象(服務器啟動)。
(2)按照事先指定的參數創建初始數量的數據庫連接(即:空閑連接數)。
(3)對于一個數據庫訪問請求,直接從連接池中得到一個連接。假如數據庫連接池對象中沒有空閑的連接,且連接數沒有達到最大(即:最大活躍連接數),創建一個新的數據庫連接。
(4)存取數據庫。
(5)關閉數據庫,釋放所有數據庫連接(此時的關閉數據庫連接,并非真正關閉,而是將其放入空閑隊列中。如實際空閑連接數大于初始空閑連接數則釋放連接)。
(6)釋放數據庫連接池對象(服務器停止、維護期間,釋放數據庫連接池對象,并釋放所有連接)。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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