習慣了以硬編碼的形式在程序中創建數據庫鏈接,用完就在finally語句塊中close一下就結束了。對於重視數據庫鏈接數的應用來講,這樣子作會耗費大量的時間和數據庫資源,並且硬編碼的形式也不甚靈活。
在Tomcat這個Java Web容器下經過配置DataSource(數據源)對象能夠解決上面所述的問題。JDBC中的javx.sql.DataSource接口負責創建於數據庫的鏈接,程序中直接從數據源中獲取數據庫鏈接。DataSource對象由Servlet容器Tomcat進行管理,其實獲取數據庫鏈接是從鏈接池中選取空閒鏈接。它基於Java中的JNDI(Java 命名與目錄接口)來實現。
配置數據源context.xml:
在Java Web應用的META-INF目錄下新建一個context.xml配置文件,其中的<Resource>元素用於定義JNDI資源,內容以下:sql
- <Context reloadable="true" >
- <Resource
- name="jdbc/ DBname "
- auth="Container"
- type="javax.sql.DataSource"
- maxActive="100" maxIdle="30" maxWait="10000"
- username="root" password="123"
- driverClassName="com.mysql.jdbc.Driver"
- url="jdbc:mysql://localhost:3306/ DBname?autoReconnect=true"
- />
- </Context>
<Resource>元素的屬性說明:
Name:指定Resource資源的JNDI名稱;
auth:可選填Container或Application,指定Resource的管理者;
type:指定Resource資源的Java類名;
maxActive:設置數據庫鏈接池中活動狀態鏈接的最大數目,爲0則不受限制;
maxIdle:設置數據庫鏈接池中空閒狀態鏈接的最大數目,爲0則不受限制;
maxWait:設置數據庫鏈接池中空閒狀態鏈接的最長等待時間,超時則拋出異常,爲-1則可無限等待;
username:指定數據庫的用戶名;
password:指定鏈接數據庫的密碼;
driverClassName:指定數據庫的JDBC驅動器的Driver實現類名字(這裏爲MySQL數據庫鏈接);
url:鏈接數據庫的url。
注:可在<CATALINA_HOME>/conf/server.xml 文件中的對應<Host>元素中如上配置<Resource>子元素以供Tomcat容器內的多個Web應用使用。
配置JNDI資源引用web.xml:
Java Web應用中要使用JNDI資源,必須在web.xml中配置對該JNDI資源的引用<resource-ref>元素。內容以下:
- <web-app>
- <resource-ref>
- <description>DB Connection</description>
- <res-ref-name>jdbc/DBname </res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- </resource-ref>
- </web-app>
<resource-ref>元素的子元素說明:
description:對所引用JNDI資源的描述;
res-ref-name:引用的JNDI資源的名稱,與上面<Resource>元素中的name屬性一致;
res-type:引用的JNDI資源的類名稱,與上面<Resource>元素中的type屬性一致;
res-auth:引用資源的管理者,上面<Resource>元素中的auth屬性一致;
Web應用中使用數據源:
使用DataSource鏈接數據庫,再也不用如下方式來創建到數據庫的鏈接了。
- Connection conn = null;
- Class.forName("com.mysql.jdbc.Driver");
- String dbUrl = "jdbc:mysql://localhost:3306/DBname";
- String dbUser = "root";
- String dbPwd = "123";
- conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
而是使用相對簡單些的JNDI資源訪問方式lookup方法,以下:
- Context sourceCtx = new InitialContext();
- DataSource ds =
- (DataSource) sourceCtx.lookup("java:comp/env/jdbc/ DBname ");
- conn = ds.getConnection();
注:使用DataSource方式鏈接數據庫,當使用完數據庫操做以後調用各類資源對象的close方法時,由Tomcat容器調回這些鏈接到鏈接池中進行管理,而不是直接與數據庫斷開鏈接。