Tomcat中數據源的配置及原理
一:數據源介紹 數據源簡介
JDBC2.0提供了javax.sql.DataSource的接口,負責與數據庫創建鏈接,實際應用時不須要編寫鏈接數據庫代碼,能夠直接從數據源得到數據庫的鏈接,使得應用於數據庫的耦合下降。Dataource中事先創建了多個數據庫鏈接,這些數據庫鏈接保持在數據庫鏈接池中,當程序訪問數據庫時,只須要從鏈接池從取出空閒的鏈接,訪問數據庫結束,在將這些鏈接歸還給鏈接池。DataSource對象由容器(Tomcat)提供,不能使用建立實例的方法來生成DataSource對象,要採用JAVA的JNDI(Java Nameing and Directory Interface,java命名和目錄接口)來得到DataSource對象的引用。(另有一種說法:「其實從技術上來講,數據源鏈接方式是不須要目錄服務的,咱們一樣能夠經過序列化數據源對象直接訪問文件系統。這點是須要明確的。」感興趣的朋友能夠試試。)JNDI是一種將對象和名字綁定的技術,對象工廠負責生產出對象,這些對象都和惟一的名字相綁定。程序中能夠經過這個名字來得到對象的引用。Tomcat把DataSource做爲一種可配置的JNDI資源來處理,生成DataSource對象的工廠爲rg.apache.comm.ons.dbcp.BasicDataSourceFactory。
二:配置數據源
配置數據源其實至關簡單,能夠配置單個應用的數據源,也能夠配置整個容器的數據源。如下詳細說明如何配置單個應用的數據源。 1.準備工做
2.配置單個應用的數據源
2.1配置server.xml文件
首先打開%Tomcat _Home%\conf下 server.xml文件,在相應的<Context>中加入<Resource>元素,在<Context>(你的應用配置上下文)中加入如下代碼(以MySql爲例):
<Context path="/test" docBase="E:\JAVA\mytest\webapp" >
<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/test">
<parameter>
<name>username</name>
<value>root</value>
</parameter>
<parameter>
<name>password</name>
<value></value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost/dlog</value>
</parameter>
</ResourceParams>
</Context>
2.2< Resource >配置說明以下:
屬性
|
描述
|
name
|
指定Resource的JNDI的名字
|
auth
|
指定管理Resource的Manager,由兩個可選值:Container和Application。Container表示由容器來建立和管理Resource,Application表示由WEB應用來建立和管理Resource。若是在web application deployment descriptor中使用<resource-ref>,這個屬性是必需的,若是使用<resource-env-ref>,這個屬性是可選的。
|
type
|
指定Resource所屬的java類名
|
2.3<ResourceParams>元素的屬性以下:
屬性
|
描述
|
name
|
指定ResourceParams的JNDI的名字,必須和Resource的name保持一致
|
factory
|
指定生成DataSource對象的factory的類名
|
maxActive
|
指定數據庫鏈接池中處於活動狀態的數據庫鏈接最大數目,0表示不受限制
|
maxldle
|
指定數據庫鏈接池中處於空閒狀態的數據庫鏈接的最大數目,0表示不受限制
|
maxwait
|
指定數據庫鏈接池中的數據庫鏈接處於空閒狀態的最長時間(單位爲毫秒),超過這一事件,將會拋出異常。-1表示能夠無限期等待。
|
username
|
指定鏈接數據庫的用戶名
|
password
|
指定鏈接數據庫的密碼
|
driverClassName
|
指定鏈接數據庫的JDBC驅動程序
|
url
|
指定鏈接數據庫的URL
|
2.3引用數據源
若是在web應用中訪問了由Servlet容器管理的某個JNDI Resource,則必須在web.xml中聲明對這個JNDI Resource的引用。表示資源引用的元素爲<resource-ref>,該元素加在<wepapp></ wepapp >中。
打開你的應用配置文件web.xml,輸入如下粗體部分:
<wepapp> ……
<resource-ref>
<description>connectDB test</description>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</ wepapp >
2.4<resource-ref>元素的屬性以下:
屬性
|
描述
|
description
|
對所引用的資源的說明
|
res-ref-name
|
指定所引用資源的JNDI名字,與<Resource>元素中的name屬性保持一致
|
res-type
|
指定所引用資源的類名字,與<Resource>元素中的type屬性保持一致
|
res-auth
|
指定所引用資源的Manager,與<Resource>元素中的auth屬性保持一致
|
2.5測試數據源
首先,檢查Tomcat的%Tomcat _Home%\common\lib下有commons-collections.jar、commons-dbcp.jar、commons-pool.jar包,若是沒現有,請到此地下載:http://tomcat.apache.org/
注意以上三個包不要引入你的工程類路徑,不然可能報錯。
而後,將驅動包放入%Tomcat _Home%\common\lib下,注意包必須爲.jar後綴。Tomcat只認.jar包。 配置完成後,寫個測試,以下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<!DOCTYPE HTML PUBLIC "-//W
HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
DataSource db = (DataSource)envContext.lookup("jdbc/myoracle ");
//javablogorl爲<Resource>元素中name屬性的值
Connection conn = db.getConnection( );
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM test");
while(rs.next()){
out.print(rs.getString("admin_name")+" ");
out.print(rs.getString("admin_password")+"<br>");
}
rs.close();
stmt.close();
conn.close();
%>
</body>
</html>
若是輸出你指望的結果,表示數據源配置成功。
3.配置容器全局數據源
以上,配置的數據源爲單個應用使用的數據源,只能爲單個應用所使用,下面咱們配置全局的數據源,全部的應用均可以使用,經過引用很天然的使用全局數據源。準備工做同上。
3.1 配置server.xml文件
首先打開%Tomcat _Home%\conf下 server.xml文件,在<GlobalNamingResources>下輸入如下粗體部分:
<GlobalNamingResources> ……
<Context path="/test" docBase="E:\JAVA\mytest\webapp" >
<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/test">
<parameter>
<name>username</name>
<value>root</value>
</parameter>
<parameter>
<name>password</name>
<value></value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost/dlog</value>
</parameter>
</ResourceParams>
</Context>
</GlobalNamingResources>
3.2 引用數據源
因爲咱們配置的是容器全局數據源,所以全部的應用均可以引用這個數據源。在你的應用中創建引用,在<Context></Context>之間輸入如下粗體部分:
<Context path="/test" docBase="E:\JAVA\mytest\webapp" >
<ResourceLink name="myDB" global="jdbc/test" type="javax.sql.DataSource"/>
</Context>
3.3 配置應用文件web.xml
打開你的應用配置文件web.xml,輸入如下粗體部分:
<wepapp> ……
<resource-ref>
<description>connectDB test</description>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</ wepapp >
3.4測試
建立測試文件:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<!DOCTYPE HTML PUBLIC "-//W
HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
DataSource db = (DataSource)envContext.lookup("myDB ");//名稱與web.xml配置中的一致
//javablogorl爲<Resource>元素中name屬性的值
Connection conn = db.getConnection( );
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM test");
while(rs.next()){
out.print(rs.getString("admin_name")+" ");
out.print(rs.getString("admin_password")+"<br>");
}
rs.close();
stmt.close();
conn.close();
%>
</body>
</html>
若是輸出你指望的結果,表示數據源配置成功。
Hibernate.cfg.xml文件中 刪除全部鏈接數據庫的配置參數
添加 connection.datasource屬性
<property name="connection.datasource">java:/comp/env/jdbc/test</property>
其中jdbc/test爲數據源在應用服務器中的JNDI名