Chinaunix首页 | 论坛 | 博客
  • 博客访问: 240223
  • 博文数量: 22
  • 博客积分: 512
  • 博客等级: 下士
  • 技术积分: 242
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 09:48
文章分类

全部博文(22)

文章存档

2013年(1)

2012年(21)

我的朋友

分类: 系统运维

2012-03-29 06:24:00

经过3个多小时的努力,配置JNDI数据源(主要是通过DBCP连接池)终于搞定~
还是Tomcat官方的说明好,不过全是英文的,大概还看得懂.
百度上那么花花绿绿的太多了,一个也没成功!...
本例使用的数据库为Ms SQL Server 2000,对于其它数据库只是修改一下相应的参数即可,
服务器是Tomcat5.5, 与之间的版本配置连接池最简便
自己总结了一下,希望起到一个抛砖引玉的作用

总结:
第一步:

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

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

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
标准数据源资源工厂配置项如下:
* driverClassName -
所使用的JDBC驱动类全称。
* maxActive -
同一时刻可以自数据库连接池中被分配的最大活动实例数。
* maxIdle -
同一时刻数据库连接池中处于非活动状态的最大连接数。
* maxWait -
当连接池中没有可用连接时,连接池在抛出异常前将等待的最大时间,单位毫秒。
* password -
传给JDBC驱动的数据库密码。
* url -
传给JDBC驱动的连接URL
* user -
传给JDBC驱动的数据库用户名。
* validationQuery -
一个SQL查询语句,用于在连接被返回给应用前的连接池验证。
*
如果指定了该属性,则必为至少返回一行记录的SQL SELECT语句。


jdbc/test是数据源的名称(随意写,要和web.xml文件中 jdbc/test 一样即可)
其他的参数按照自己的实际情况进行修改,例如数据库的名称、账号、密码。

第三步:

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

xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="" 
xmlns:xsi
="" 
xsi:schemaLocation
=" /web-app_2_4.xsd" 
version
="2.4"> 

    
<resource-ref> 
        
<description>DB Connectiondescription> 
        
<res-ref-name>jdbc/testres-ref-name> 
        
<res-type>javax.sql.DataSourceres-type> 
        
<res-auth>Containerres-auth> 
    
resource-ref> 
web-app> 

 

说明:

引用资源说明
引用资源的JNDI
引用资源的类名
管理者(Container

第四步:

写个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,对名称进行定位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
  {
   //
注意不是关闭,是放回连接池.
   conn.close();
  }

}
%>


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

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="" prefix="sql" %>
<%@ taglib uri="" prefix="c" %>

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

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

 

我成功了!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标签之间添加
   
 

<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是你的工程路径(相对或绝对亦可),其中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方面的应用上就有了共通的准则.

阅读(2663) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

十七岁的回忆2012-03-30 00:35:31

3个多小时的努力