經(jīng)過(guò)3個(gè)多小時(shí)的努力,配置JNDI數(shù)據(jù)源(主要是通過(guò)DBCP連接池)終于搞定~
還是Tomcat官方的說(shuō)明好,不過(guò)全是英文的,大概還看得懂.
百度上那么花花綠綠的太多了,一個(gè)也沒(méi)成功?。?br />
本例使用的數(shù)據(jù)庫(kù)為Ms SQL Server 2000,對(duì)于其它數(shù)據(jù)庫(kù)只是修改一下相應(yīng)的參數(shù)即可,
服務(wù)器是Tomcat5.5, 與之間的版本配置連接池最簡(jiǎn)便
自己總結(jié)了一下,希望起到一個(gè)拋磚引玉的作用
總結(jié):
第一步:
將驅(qū)動(dòng)程序(jar包)放到tomcat安裝目錄下的common\lib文件夾下
第二步:
在Tomcat的webapps目錄隨便創(chuàng)建一個(gè)工程目錄,例如myjdbc。在myjdbc目錄下創(chuàng)建META-INF目錄,在此目錄下創(chuàng)建一個(gè)context.xml文件,里面的內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/test"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="sa" password=""
driverClassName="net.sourceforge.jtds.jdbc.Driver"
url="jdbc:jtds:sqlserver://localhost/pubs"/>
</Context>
附注如下:
Tomcat標(biāo)準(zhǔn)數(shù)據(jù)源資源工廠配置項(xiàng)如下:
* driverClassName - 所使用的JDBC驅(qū)動(dòng)類(lèi)全稱(chēng)。
* maxActive - 同一時(shí)刻可以自數(shù)據(jù)庫(kù)連接池中被分配的最大活動(dòng)實(shí)例數(shù)。
* maxIdle - 同一時(shí)刻數(shù)據(jù)庫(kù)連接池中處于非活動(dòng)狀態(tài)的最大連接數(shù)。
* maxWait - 當(dāng)連接池中沒(méi)有可用連接時(shí),連接池在拋出異常前將等待的最大時(shí)間,單位毫秒。
* password - 傳給JDBC驅(qū)動(dòng)的數(shù)據(jù)庫(kù)密碼。
* url - 傳給JDBC驅(qū)動(dòng)的連接URL。
* user - 傳給JDBC驅(qū)動(dòng)的數(shù)據(jù)庫(kù)用戶(hù)名。
* validationQuery - 一個(gè)SQL查詢(xún)語(yǔ)句,用于在連接被返回給應(yīng)用前的連接池驗(yàn)證。
* 如果指定了該屬性,則必為至少返回一行記錄的SQL SELECT語(yǔ)句。
jdbc/test是數(shù)據(jù)源的名稱(chēng)(隨意寫(xiě),要和web.xml文件中 <res-ref-name>jdbc/test</res-ref-name> 一樣即可),
其他的參數(shù)按照自己的實(shí)際情況進(jìn)行修改,例如數(shù)據(jù)庫(kù)的名稱(chēng)、賬號(hào)、密碼。
第三步:
在myjdbc目錄下創(chuàng)建WEB-INF目錄,創(chuàng)建web.xml文件,內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">

<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>

說(shuō)明:
<resource-ref>
<descrtiption>引用資源說(shuō)明</descrtiption>
<res-ref-name>引用資源的JNDI名</res-ref-name>
<res-type>引用資源的類(lèi)名</res-type>
<res-auth>管理者(Container)</res-auth><!--Container-容器管理 Application-Web應(yīng)用管理-->
</resource-ref>
第四步:
寫(xiě)個(gè)jsp,試一下吧!

<%
@ page contentType="text/html;charset=utf-8"%>

<%
@ page import="java.sql.*,javax.sql.*,javax.naming.*,com.DBConnection" %>

<%
try
{
//初始化查找命名空間
Context ctx = new InitialContext();
//InitialContext ctx = new InitialContext();亦可
//找到DataSource,對(duì)名稱(chēng)進(jìn)行定位java:comp/env是必須加的,后面跟你的DataSource名
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/test");
//取出連接
Connection conn = ds.getConnection();
System.out.println("connection pool connected !!");
} catch (NamingException e) {
System.out.println(e.getMessage());
} catch (SQLException e) {
e.printStackTrace();
}finally
{
//注意不是關(guān)閉,是放回連接池.
conn.close();
}

}
%>

或?qū)憘€(gè)JSP用標(biāo)簽庫(kù)測(cè)試一下:

<%
@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<%
@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>

<%
@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<sql:query var="rs" dataSource="jdbc/test">
select * from authors
</sql:query>

<html>
<head>
<title>DB Test</title>
</head>
<body>
<c:forEach var="row" items="${rs.rows}">
${row.city}<br/>
</c:forEach>
</body>
</html>


我成功了!Good Luck!
以下是配置JNDI的其他方法,個(gè)人不建議使用,因?yàn)樾薷姆?wù)器的
server.xml和web.xml,如果有一點(diǎn)錯(cuò)誤,你的容器就會(huì)崩潰~
注:連接數(shù)據(jù)源的方法還有很多,在這里我簡(jiǎn)要說(shuō)之:
比如說(shuō)第二步還可以這么做:
在/tomcat/conf/Catalina/localhost(或其它主機(jī)名)/中添加以
虛擬目錄名稱(chēng)(你的工程名)命名的XML文件來(lái)配置context.
比如我的主機(jī)下有個(gè)目錄dbpool其地址為tomcat/webapps/test我可以這樣來(lái)配置這個(gè)上下文:
在tomcat/conf/Catalina/localhost/目錄下創(chuàng)建test.xml文件,內(nèi)容和上面一樣.
還可以:
在/tomcat/conf/server.xml中<host></host>標(biāo)簽之間添加
<Context path="/test" docBase="test"
debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="javauser" password="javadude" driverClassName="net.sourceforge.jtds.jdbc.Driver"
url="jdbc:jtds:sqlserver://localhost/pubs"/>
</Context>
其中path是你的工程路徑(相對(duì)或絕對(duì)亦可),其中docBase="test"說(shuō)明,此主機(jī)已經(jīng)指向到webapps目錄下了,回頭
來(lái)看test這個(gè)上下文,它實(shí)際目錄是位于webapps的目錄下的,所以
在Context中我們可以將docBase直接設(shè)置為test了。如果它在webapps/dbpool/test下,則設(shè)置為dbpool/test就可以了。
附:JNDI——Java Naming and Directory Interface是一套提供naming和 directory功能的 API,
Java應(yīng)用程式開(kāi)發(fā)者透過(guò)使用 JNDI,在naming和 directory方面的應(yīng)用上就有了共通的準(zhǔn)則.