在 Tomcat 6.0 中配置 JNDI 數據源,實現應用與數據庫連接解耦,便於環境遷移。

路徑:$CATALINA_HOME/conf/context.xml
<?xml version='1.0' encoding='utf-8'?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- 數據源定義 -->
<Resource name="jdbc/mysqldb"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test"
username="root"
password="123456"
maxActive="4"
maxIdle="2"
maxWait="-1" />
<ResourceLink global="mysqldb" name="mysqldb" type="javax.sql.DataSource"/>
</Context>
參數解析:
• name:JNDI 名稱,應用查找用
• maxActive:最大活躍連接數,0=無限
• maxIdle:最大空閒連接數
• maxWait:獲取連接最大等待毫秒數,-1=無限等待
package com.shyy.jndi;
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class ConnectionPool {
private static Connection conn;
public static Connection getConn() {
try {
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysqldb");
conn = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}
作者測試無需配置也可運行,但規範建議聲明資源引用:
<resource-ref>
<description>DB Connection test</description>
<res-ref-name>jdbc/mysqldb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<%@ page import="com.shyy.jndi.ConnectionPool,java.sql.*" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<html><body>
<%
ConnectionPool cp = new ConnectionPool();
Connection conn = cp.getConn();
if (conn != null) {
out.println("數據庫連接狀態:<b>OK</b><hr/>");
PreparedStatement ps = conn.prepareStatement("SELECT * FROM USER_INFO");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
out.println("<b>id:</b>" + rs.getInt("ID") + "<br/>");
out.println("<b>姓名:</b>" + rs.getString("NAME") + "<br/>");
out.println("<b>性別:</b>" + rs.getString("SEX") + "<br/>");
out.println("<b>手機:</b>" + rs.getString("TELPHONE") + "<hr/>");
}
} else {
out.println("數據庫連接狀態:NO");
}
%>
</body></html>

mysql-connector-java.jar 必須放在 Tomcat lib 目錄java:comp/env/jdbc/mysqldb(代碼中)對應 jdbc/mysqldb(context.xml 中)按步驟操作,JNDI 配置不再是難題!