经过3个多小时的努力,配置JNDI数据源(主要是通过DBCP连接池)终于搞定~

还是Tomcat官方的说明好,不过全是英文的,大概还看得懂.

百度上那么花花绿绿的太多了,一个也没成功!...

本例使用的数据库为Ms SQL Server 2000,对于其它数据库只是修改一下相应的参数即可,

服务器是Tomcat5.5, 与之间的版本配置连接池最简便

自己总结了一下,希望起到一个抛砖引玉的作用

总结:

第一步:

将驱动程序(jar包)放到tomcat安装目录下的common\lib文件夹下

第二步:

在Tomcat的webapps目录随便创建一个工程目录,例如myjdbc。在myjdbc目录下创建META-INF目录,在此目录下创建一个context.xml文件,里面的内容如下: 


Tomcat配置JNDI数据源_tomcat<?xml version="1.0" encoding="UTF-8"?> 

Tomcat配置JNDI数据源_tomcat<Context>

Tomcat配置JNDI数据源_tomcat <Resource name="jdbc/test" 

Tomcat配置JNDI数据源_tomcat  auth="Container" 

Tomcat配置JNDI数据源_tomcat  type="javax.sql.DataSource"

Tomcat配置JNDI数据源_tomcat         maxActive="100" 

Tomcat配置JNDI数据源_tomcat  maxIdle="30" 

Tomcat配置JNDI数据源_tomcat  maxWait="10000"

Tomcat配置JNDI数据源_tomcat         username="sa" password="" 

Tomcat配置JNDI数据源_tomcat  driverClassName="net.sourceforge.jtds.jdbc.Driver"

Tomcat配置JNDI数据源_tomcat         url="jdbc:jtds:sqlserver://localhost/pubs"/>

Tomcat配置JNDI数据源_tomcat </Context>


 

附注如下:

Tomcat标准数据源资源工厂配置项如下:

* driverClassName - 所使用的JDBC驱动类全称。

* maxActive - 同一时刻可以自数据库连接池中被分配的最大活动实例数。

* maxIdle - 同一时刻数据库连接池中处于非活动状态的最大连接数。

* maxWait - 当连接池中没有可用连接时,连接池在抛出异常前将等待的最大时间,单位毫秒。

* password - 传给JDBC驱动的数据库密码。

* url - 传给JDBC驱动的连接URL。

* user - 传给JDBC驱动的数据库用户名。

* validationQuery - 一个SQL查询语句,用于在连接被返回给应用前的连接池验证。

* 如果指定了该属性,则必为至少返回一行记录的SQL SELECT语句。

jdbc/test是数据源的名称(随意写,要和web.xml文件中 <res-ref-name>jdbc/test</res-ref-name> 一样即可),

其他的参数按照自己的实际情况进行修改,例如数据库的名称、账号、密码。

第三步:

在myjdbc目录下创建WEB-INF目录,创建web.xml文件,内容如下: 


Tomcat配置JNDI数据源_tomcat<?xml version="1.0" encoding="UTF-8"?> 

Tomcat配置JNDI数据源_tomcat<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 

Tomcat配置JNDI数据源_tomcatxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

Tomcat配置JNDI数据源_tomcatxsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 

Tomcat配置JNDI数据源_tomcatversion="2.4"> 

Tomcat配置JNDI数据源_tomcat

Tomcat配置JNDI数据源_tomcat    <resource-ref> 

Tomcat配置JNDI数据源_tomcat        <description>DB Connection</description> 

Tomcat配置JNDI数据源_tomcat        <res-ref-name>jdbc/test</res-ref-name> 

Tomcat配置JNDI数据源_tomcat        <res-type>javax.sql.DataSource</res-type> 

Tomcat配置JNDI数据源_tomcat        <res-auth>Container</res-auth> 

Tomcat配置JNDI数据源_tomcat    </resource-ref> 

Tomcat配置JNDI数据源_tomcat</web-app> 

Tomcat配置JNDI数据源_tomcat


 

说明:

<resource-ref>

<descrtiption>引用资源说明</descrtiption>

<res-ref-name>引用资源的JNDI名</res-ref-name>

<res-type>引用资源的类名</res-type>

<res-auth>管理者(Container)</res-auth><!--Container-容器管理 Application-Web应用管理-->

</resource-ref>

第四步:

写个jsp,试一下吧!


Tomcat配置JNDI数据源_xml_27<%@ page contentType="text/html;charset=utf-8"%>

Tomcat配置JNDI数据源_xml_27<%@ page import="java.sql.*,javax.sql.*,javax.naming.*,com.DBConnection" %>

Tomcat配置JNDI数据源_xml_27<%

Tomcat配置JNDI数据源_Java_30  try

Tomcat配置JNDI数据源_Java_30  {

Tomcat配置JNDI数据源_Java_30   //初始化查找命名空间

Tomcat配置JNDI数据源_Java_30   Context ctx = new InitialContext(); 

Tomcat配置JNDI数据源_Java_30   //InitialContext ctx = new InitialContext();亦可 

Tomcat配置JNDI数据源_Java_30   //找到DataSource,对名称进行定位java:comp/env是必须加的,后面跟你的DataSource名

Tomcat配置JNDI数据源_Java_30   DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/test");

Tomcat配置JNDI数据源_Java_30   //取出连接

Tomcat配置JNDI数据源_Java_30   Connection conn = ds.getConnection();

Tomcat配置JNDI数据源_Java_30System.out.println("connection pool connected !!");   

Tomcat配置JNDI数据源_Java_30  } catch (NamingException e) {

Tomcat配置JNDI数据源_Java_30   System.out.println(e.getMessage());

Tomcat配置JNDI数据源_Java_30  } catch (SQLException e) {

Tomcat配置JNDI数据源_Java_30   e.printStackTrace();

Tomcat配置JNDI数据源_Java_30  }finally

Tomcat配置JNDI数据源_Java_30  {

Tomcat配置JNDI数据源_Java_30   //注意不是关闭,是放回连接池.

Tomcat配置JNDI数据源_Java_30   conn.close();

Tomcat配置JNDI数据源_Java_30  }

Tomcat配置JNDI数据源_Java_30

Tomcat配置JNDI数据源_sql_50}

Tomcat配置JNDI数据源_tomcat%>

Tomcat配置JNDI数据源_tomcat


或写个JSP用标签库测试一下:


Tomcat配置JNDI数据源_xml_27<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

Tomcat配置JNDI数据源_xml_27<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>

Tomcat配置JNDI数据源_xml_27<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

Tomcat配置JNDI数据源_tomcat

Tomcat配置JNDI数据源_tomcat<sql:query var="rs" dataSource="jdbc/test">

Tomcat配置JNDI数据源_tomcatselect * from authors

Tomcat配置JNDI数据源_tomcat</sql:query>

Tomcat配置JNDI数据源_tomcat

Tomcat配置JNDI数据源_tomcat<html>

Tomcat配置JNDI数据源_tomcat  <head>

Tomcat配置JNDI数据源_tomcat    <title>DB Test</title>

Tomcat配置JNDI数据源_tomcat  </head>

Tomcat配置JNDI数据源_tomcat  <body>

Tomcat配置JNDI数据源_tomcat<c:forEach var="row" items="${rs.rows}">

Tomcat配置JNDI数据源_tomcat    ${row.city}<br/>

Tomcat配置JNDI数据源_tomcat</c:forEach>

Tomcat配置JNDI数据源_tomcat  </body>

Tomcat配置JNDI数据源_tomcat</html>

Tomcat配置JNDI数据源_tomcat

Tomcat配置JNDI数据源_tomcat


 

我成功了!Good Luck!

以下是配置JNDI的其他方法,个人不建议使用,因为修改服务器的

server.xml和web.xml,如果有一点错误,你的容器就会崩溃~

注:连接数据源的方法还有很多,在这里我简要说之:

比如说第二步还可以这么做:

在/tomcat/conf/Catalina/localhost(或其它主机名)/中添加以

虚拟目录名称(你的工程名)命名的XML文件来配置context.

比如我的主机下有个目录dbpool其地址为tomcat/webapps/test我可以这样来配置这个上下文:

在tomcat/conf/Catalina/localhost/目录下创建test.xml文件,内容和上面一样.

还可以:

在/tomcat/conf/server.xml中<host></host>标签之间添加

   

 


Tomcat配置JNDI数据源_tomcat<Context path="/test" docBase="test"

Tomcat配置JNDI数据源_tomcat        debug="5" reloadable="true" crossContext="true">

Tomcat配置JNDI数据源_tomcat  <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"

Tomcat配置JNDI数据源_tomcat               maxActive="100" maxIdle="30" maxWait="10000"

Tomcat配置JNDI数据源_tomcat               username="javauser" password="javadude" driverClassName="net.sourceforge.jtds.jdbc.Driver"

Tomcat配置JNDI数据源_tomcat               url="jdbc:jtds:sqlserver://localhost/pubs"/>

Tomcat配置JNDI数据源_tomcat</Context>


 

其中path是你的工程路径(相对或绝对亦可),其中docBase="test"说明,此主机已经指向到webapps目录下了,回头

来看test这个上下文,它实际目录是位于webapps的目录下的,所以

在Context中我们可以将docBase直接设置为test了。如果它在webapps/dbpool/test下,则设置为dbpool/test就可以了。

附:JNDI——Java Naming and Directory Interface是一套提供naming和 directory功能的 API,

Java应用程式开发者透过使用 JNDI,在naming和 directory方面的应用上就有了共通的准则