JDBC2.0提供了javax.sql.DataSource介面,它負責建立與資料庫的連接,在應用程式中訪問資料庫時不必編寫連接資料庫的代碼,可以直接從數據源獲得資料庫連接 1.資料庫和連接池 在DataSource中事先建立了多個資料庫連接,這些資料庫連接保存在連接池(ConnectPool)中。 ...
JDBC2.0提供了javax.sql.DataSource介面,它負責建立與資料庫的連接,在應用程式中訪問資料庫時不必編寫連接資料庫的代碼,可以直接從數據源獲得資料庫連接
1.資料庫和連接池
在DataSource中事先建立了多個資料庫連接,這些資料庫連接保存在連接池(ConnectPool)中。java程式訪問資料庫時,只需要從連接池中取出空閑狀態的資料庫連接,當程式訪問資料庫結束,再將資料庫連接放回連接池,這樣做可以調高訪問資料庫的效率。
如果Web應用每次接收到客戶的請求,都和數控建立一個連接,數控操作結束就斷開連接,這樣會消費大量的時間和資源。因為資料庫每次配置連接都要將Connection對象載入到記憶體中,再驗證用戶名和密碼。
2.數據源和JNDI資源
由於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。
3.配置數據源
數據源的配置涉及修改server.xml和web.xml文件
(1)在server.xml中加入<Resource>元素
<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。
(2)在web.xml中加入<resource-ref>元素
如果web應用訪問了由servlet容器管理的某個JNDI Resource,必須在web.xml文件中聲明對這個JNDI Resource的引用。表示資源引用的元素為<resource-ref>,以下是聲明應用jdbc/BookDB數據源代碼
<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屬性對應
4.程式中訪問數據源
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恢復空閑狀態。