在DataSource中事先建立了多個數據庫連接,這些數據庫連接保存在連接池(ConnectPool)中。java程序訪問數據庫時,只需要從連接池中取出空閒狀態的數據庫連接,當程序訪問數據庫結束,再將數據庫連接放回連接池,這樣做可以調高訪問數據庫的效率。
如果Web應用每次接收到客戶的請求,都和數控建立一個連接,數控操作結束就斷開連接,這樣會消費大量的時間和資源。因為數據庫每次配置連接都要將Connection對象加載到內存中,再驗證用戶名和密碼。
由於DataSource對象是由Tomcat提供的,因此不能夠在程序中創建一個DataSource對象,而要采用JNDI技術來獲得DataSource對象的引用。
可以簡單的把JNDI理解為一種將對象和名字綁定的技術,對象工廠負責生產出對象,這些對象都和唯一的名字綁定,外部程序可以通過名字來獲得某個對象的引用。在javax.naming包中提供了Context接口,該接口提供了將對象和名字綁定,以及通過名字檢索對象的方法。
Context接口方法
方 法 描 述 bind(String name,Object obj) 將對象與一個名字綁定 lookup(String name) 返回與指定的名字綁定的對象Tomcat把DataSource作為一種可配置的JNDI資源來處理。生成DataSource對象的工廠org.apache.commons.dbcp.BasicDataSourceFactory。
<Resource>元素用來定義JNDI Resource。例如:
<Context path="/bookstore" docBase="bookstore" debug="0" reloadable="true">
<Resource name="jdbc/BookDB" auth="Container" type="javax.sql.DataSource"/>
<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>dbuser</value>
</parameter>
<parameter>
<name>password</name>
<value>123456</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>
</Context>
<Resource>屬性說明:
name:指定Resource的JNDI名字。
auth:指定管理Resource的Manager.它有兩個值可選:Container和Application。Container表示由容器來創建和管理Resource,Application表示由Web應用來創建和管理Resource
type:指定Resource所屬的JAVA類名。
在<ResourceParam>元素中指定了配置BookDB數據源的參數,<ResourceParam>元素的參數說明如下:
factory:指定生成DataResource的factory類名。
maxActive:指定數據庫連接池中處於活動狀態的數據庫連接的最大數目,取值為0,表示不受限制。
maxIdle:指定數據庫連接池中處於空閒狀態的數據庫連接的最大數目,取值為0,表示不受限制。
maxWait:指定數據庫連接池中的數據庫連接處於空閒狀態的最長時間(單位:毫秒),超過這一時間,將超時異常。取值為-1,表示可以無限等待。
username:指定連接數據庫用戶名
password:指定連接數據庫密碼
driverClassName:指定連接數據庫的JDBC驅動
url:指定連接數據庫的URL。
<webapp>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/BookDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</webapp>
resource-ref屬性說明:
description:指定所引用的資源的說明
res-ref-name:指定所引用資源的JNDI名字,與<Resource>元素中name屬性對應
res_type:指定所引用資源的類名,與<Resource>元素中的type屬性對應
res-auth:指定管理所引用資源的Manager,與<Resource>元素中的auth屬性對應
javax.naming.Context提供了查找JNDI Resource的接口,例如:可以通過以下代碼獲得jdbc/BookDB數據源的應用:
Context ctx = new InitialContext();
DataSource ds =(DataSource)ctx.lookup("java:comp/env/jdbc/BookDB");
得到DataSource對象的引用後,就可以通過DataSource的getConnection()方法獲得數據庫的連接對象:
Connection con = ds.getConnection();
當程序結束數據庫訪問後,應該調用Connection的close()方法,及時將Connection返回數據庫連接池,使Connection恢復空閒狀態。