用户操作
[即时聊天] [发私信] [加为好友]
罗巴乔ID:baggio785
985609次访问,排名30,好友1人,关注者12人。
baggio785的文章
原创 442 篇
翻译 1 篇
转载 209 篇
评论 973 篇
baggio785的公告
育婴博客

最近评论
KiTong:ONE. DataBase

Please use MySQL to Create DataBase like the language below

/*TabelName:inoutlist, Record the pass in and out of the storage*/
CREATE TABLE `inoutlist` (
orz_ORZ_orz:学习
xlsoft1983:InstallShield 2009 & InstallAnywhere 2008
—— 双重惊喜,火热放送!
为庆祝最新版InstallShield 2009上市,答谢广大新老用户的支持与厚爱,从即日起,上海世全软件(XLsoft)举办InstallShield 2009优惠活动!数量有限,售完为止!
销售热线:021-62128912/010-6……
wangluoxiaochong:感谢您的文章,解决了我的问题。
wuxiaolong039:我的邮箱是wuxiaolong_19@yahoo.com.cn
谢谢你的分享
文章分类
收藏
相册
JAVA站点
BEA dev2dev 在线
IBM DeveloperWorks
Java examples
Java World
JAVA在线API(J2SE v1.4.2)
Java学习源代码检索中心
JAVA家
Java开发者
JAVA开源大全
JAVA相关免费资源集锦
Java研究组织-JR
Java视线论坛
JAVA阵线联盟
Matrix 与JAVA共舞
O'Reilly CodeZoo
Sun Developer Network
SUN技术社区
中国JSP技术网站
爪哇流氓
Struts
Apache Struts Project
数据库
数据库专研
友情链接
baggio785在donews的blog(RSS)
Booca.com
srx的BLOG
全面的BLOG
大巨的Blog
天空之城
摄影天地会
暴暴狼的blog
李现辉的blog
生活网络信息中心
竹笋炒肉
育婴博客网
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 详细介绍在tomcat中配置数据源以及数据源的原理收藏

新一篇: javadoc-Java注释详细介绍 | 旧一篇: 教你如何知道MSN的好友是否阻止了你

转摘请注明出处

作者:baggio785

来源:http://blog.csdn.net/baggio785

本文地址:http://blog.csdn.net/baggio785/archive/2006/04/24/674822.aspx 

日期:2006-4-24

关键词:DataSource(数据源),Tomcat,连接池

 前言

本文根据实例详细介绍了如何在tomcat中配置数据源。网上此类文章很多,但是基本都是雷同的,而且对一些特殊问题以及原理并未详细阐述,所以想根据自己的实际经验,并结合例子写一篇详细的文章。

本文是偶的一些拙见,有不正确的地方请大家多多评论指正。

开发环境

 本文的环境:JDK1.4.2,TOMCAT5.0.28,Oracle9i

JDBC简介

 提到数据源,那就不能不说JDBC。JDBC是Java Database Connectivity的缩写。在java.sql包中提供了JDBC API,定义了访问数据库的接口和类。但是JDBC API不能直接访问数据库,必须依赖于数据库厂商提供的JDBC驱动程序,即JDBC DRIVER。

Java.sql中常用的接口和类如下:

       Driver接口和DriverManager类

       Connection

       Statement

      PreparedSataement

      ResultSet

1     Driver接口和DriverManager类
       DriverManager类用来建立和数据库的连接以及管理JDBC驱动程序,常用方法如下:

方法 描述
registerDriver(Driver driver) 在DriverManager中注册JDBC驱动程序
getConnection(String url,String user,String pwd) 建立和数据库的连接,返回Connection对象
setLoginTimeOut(int seconds) 设定等待数据库连接的最长时间
setLogWriter(PrintWriter out) 设定输入数据库日至的PrintWriter对象

 

2     Connection
       Connection代表和数据库的连接,其常用方法如下:

方法 描述
getMetaData() 返回数据库的MetaData数据。MetaData数据包含了数据库的相关信息,例如当前数据库连接的用户名、使用的JDBC驱动程序、数据库允许的最大连接数、数据库的版本等等。
createStatement() 创建并返回Statement对象
PrepareStatement(String sql) 创建并返回prepareStatement对象

3     Statement
       Statement用来执行静态sql语句。例如,对于insert、update、delete语句,调用executeUpdate(String sql)方法,而select语句可以调用executeQuery(String sql)方法,executeQuery(String sql)方法返回ResultSet对象。

4     PrepareStatement
   PrepareStatement用于执行动态的sql语句,即允许sql语句中包含参数。使用方法为:
   String sql = “select col1 from tablename where col2=? And col3=?”;
   PrepareStatement perpStmt = conn.preparestatement(sql);
   perpStmt.setstring(1,col2Value);
      perpStmt.setFloat(2,col3Value);
      ResultSet rs = perpStmt.executeQuery();

5     ResultSet
ResultSet用来表示select语句查询得到的记录集,一个StateMent对象在同一时刻只能打开一个ResultSet对象。通过ResultSet的getXXX()方法来得到字段值。ResultSet提供了getString()、getFloat()、getInt()等方法。可以通过字段的序号或者字段的名字来制定获取某个字段的值。例如:在上例中getString(0),getString(col1)都可以获得字段col1的值。

事务处理

在实际应用中,我们会遇到同时提交多个sql语句,这些sql语句要么全部成功,要么全部失败,如果其中一条提交失败,则必须撤销整个事务。为此,Connection类提供了3个控制事务的方法:

方法 描述
setAutoCommit(boolen autoCommit) 设置是否自动提交事务,默认为自动提交。
commit() 提交事务
rollback() 撤销事务

参考例子:

try{


conn.SetautoCommit(false);


stmt = conn.createstatement();
stmt.executeUpdate(“delete form table1 where col1=1”);
stmt.eecuteUpdate(“delete from table2 where col2=1”);


conn.comm.it();


}catch(Exception e){


e.printStackTrace;


try{

conn.rollback();


} catch(Exception e1){


e1.printStackTrace;


}


}

通过一个JSP例子来访问oracle数据库:

<%@ page import="java.util.*">


<%@ page import="java.sql.*">


<%


try{


Connection conn = null;


Statement stmt = null;


ResultSet rs = null;


//加载oracle驱动程序


Class.forName("oracle.jdbc.driver.OracleDriver.");


//注册oracle驱动程序


DriverManager.regidterDriver(new 
oracle.jdbc.driver.OracleDriver());


//建立数据库连接


conn=DriverManager.getConnection("jdbc:oracle:thin:@your 
db ip:your db port:sid",dbuser,dbpassword);


stmt = conn.createStatement();


rs = stmt.executeQuery("select * from 
tablename");


while(rs.next){

out.print(rs.getstring("colname"));


}


}catch(Exception e){


}


finally{


rs.close();


stmt.close();


conn.close();


}

%>

数据源简介

JDBC2.0提供了javax.sql.DataSource的接口,负责与数据库建立连接,实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。Dataource中事先建立了多个数据库连接,这些数据库连接保持在数据库连接池中,当程序访问数据库时,只需要从连接池从取出空闲的连接,访问数据库结束,在将这些连接归还给连接池。DataSource对象由容器(Tomcat)提供,不能使用创建实例的方法来生成DataSource对象,要采用JAVA的JNDI(Java Nameing and Directory Interface,java命名和目录接口)来获得DataSource对象的引用。(另有一种说法:“其实从技术上来说,数据源连接方式是不需要目录服务的,我们同样可以通过序列化数据源对象直接访问文件系统。这点是需要明确的。”感兴趣的朋友可以试试。)JNDI是一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和唯一的名字相绑定。程序中可以通过这个名字来获得对象的引用。Tomcat把DataSource作为一种可配置的JNDI资源来处理,生成DataSource对象的工厂为org.apache.comm.ons.dbcp.BasicDataSourceFactory。

配置数据源

配置数据源其实相当简单:

首先在server.xml中加入<Resource>元素,打开server.xml,在<Context>中加入以下代码(以oracle为例):

<Resource name="jdbc/ JNDI名字" auth="Container" type="javax.sql.DataSource"/>

<ResourceParams name="jdbc/JNDI名字">

<parameter>

<name>factory</name>
 
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>

</parameter>

<parameter>

<name>maxActive</name>

<value>100</value>

</parameter>

<parameter>
 
<name>maxIdle</name>
 
<value>30</value>

</parameter>

<parameter>

<name>maxWait</name>
 
<value>10000</value>

</parameter>

<parameter>
 
<name>username</name>

<value>用户名</value>

</parameter>

<parameter>

<name>password</name>

<value>密码</value>

</parameter>

<parameter>

<name>driverClassName</name>

<value>oracle.jdbc.driver.OracleDriver</value>

</parameter>

<parameter>

<name>url</name>
 
<value>jdbc:oracle:thin:@ip:端口:sid </value>

</parameter>

</ResourceParams>

<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类名

<ResourceParams>元素的属性如下:

属性 描述
name 指定ResourceParams的JNDI的名字,必须和Resource的name保持一致
factory 指定生成DataSource对象的factory的类名
maxActive 指定数据库连接池中处于活动状态的数据库连接最大数目,0表示不受限制
maxIdle 指定数据库连接池中处于空闲状态的数据库连接的最大数目,0表示不受限制
maxWait 指定数据库连接池中的数据库连接处于空闲状态的最长时间(单位为毫秒),超过这一事件,将会抛出异常。-1表示可以无限期等待。
username 指定连接数据库的用户名
password 指定连接数据库的密码
driverClassName 指定连接数据库的JDBC驱动程序
url 指定连接数据库的URL

其他文章说以上配置就OK了,对于web.xml的配置可有可无,其实不是这样子的。如果在web应用中访问了由Servlet容器管理的某个JNDI Resource,则必须在web.xml中声明对这个JNDI Resource的引用。表示资源引用的元素为<resource-ref>,该元素加在<wepapp></ wepapp >中。

<resource-ref>

<descryiption>DB Connection</descryiption>

<res-ref-name>jdbc/JNDI名字 </res-ref-name>

<res-type>javax.sql.DataSource </res- type>

<res-auth>Container </res-auth>

</resource-ref>

<resource-ref>元素的属性如下:

属性 描述
description 对所引用的资源的说明
res-ref-name 指定所引用资源的JNDI名字,与<Resource>元素中的name属性保持一致
res-type 指定所引用资源的类名字,与<Resource>元素中的type属性保持一致
res-auth 指定所引用资源的Manager,与<Resource>元素中的auth属性保持一致

到这里,数据源就已经配置成功了。但是我在测试的时候除了一点小麻烦,主要原因是对DataSource的概念没搞清楚。我是这么测试的,写一个测试类,然后在eclipse中进行junit测试,捕获的异常为:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial。

同样的代码在JSP文件中正常运行,后来翻了一些资料,终于找到了问题的所在了。原来DataSource是由容器(TOMCAT)提供的,所以我的测试会抛出异常。为了再次验证想法是否正确,在jsp文件中import刚才抛出异常的类,在进行连接数据库,结果一切正常。

下面的例子是实际应用中使用DataSource,在jsp文件中连接oracle。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ page import="java.sql.*"%>

<%@ page import="javax.naming.*"%>

<%@ page import="javax.sql.*"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD 
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/javablogorl");


//javablogorl为<Resource>元素中name属性的值

Connection conn = db.getConnection( );

Statement stmt = conn.createStatement();


ResultSet rs = stmt.executeQuery("SELECT * FROM blog_systemadmin");

while(rs.next()){

out.print(rs.getString("admin_name")+" ");

out.print(rs.getString("admin_password")+"<br>");

}

rs.close();

stmt.close();

conn.close();
%>

</body>

</html>

另:tomcat5.5的配制方法为:

<Resource name="jdbc/JNDI名字" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="用户名" password="密码" driverClassName="oracle.jdbc.driver.OracleDriver"
               url="jdbc:oracle:thin:@ip:端口:sid"/>

发表于 @ 2006年04月24日 12:35:00|评论(loading...)|编辑

新一篇: javadoc-Java注释详细介绍 | 旧一篇: 教你如何知道MSN的好友是否阻止了你

评论

#baggio785 发表于2006-04-25 09:32:00  IP: 60.191.55.*
5.5的没试过,因为本文的环境是5.0.28

看过文章,5.5的和5.0是不一样,但是原理都一样的啊
#fly 发表于2006-04-25 08:35:00  IP: 218.22.42.*
楼上的那种配置数据源的方式在tomcat5.5以上的版本中好象是行不通的吧?
#spirit.moon 发表于2006-04-25 19:40:00  IP: 219.236.141.*
对 5.5 中的数据源属性全部写在 Resource 元素的属性里面
#kingzi 发表于2006-05-07 16:09:00  IP: 221.15.183.*
你好读了你的这编,我在机器上坐一遍,jsp页面出现异常,
Name pusjndi is not bound in this Context
不知怎么解决,盼指导:kongfanyu7241@sohu.com
另外配置数据源的Resource name等到底放在server.xml文件那个位置??我的TOMCAT版本是5.0,谢谢。
#baggio785 发表于2006-05-07 19:18:00  IP: 60.176.188.*
在<Context>和</Context>之间

类似于

<Context path="/yourprojerct" reloadable="true" docBase="G:\yourprojerct" workDir="G:\yourprojerct\work">
<Resource name="jdbc/ JNDI名字" auth="Container" type="javax.sql.DataSource"/>
………
</Context>
#yifeng885 发表于2006-05-15 11:38:00  IP: 218.66.59.*
大哥,我配JNDI配了两天老是有错误,看了上面的方法,我试了一下,发生org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
是什么原因啊?能不能说一下server.xml的具体位置啊,谢谢
我的环境跟你的一样!
#baggio785 发表于2006-05-15 11:58:00  IP: 60.191.55.*
yifeng885,我的配置是通过测试的,试试完全按照文章的配置能通过么?看你的错误提示,应该是连接字符串的问题啊,你是oracle数据库么?
或者把配置文件以及程序贴出来大家探讨一下?

server.xml就是tomcat的server.xml呀,在tomcat的conf目录下
#yifeng885 发表于2006-05-15 13:29:00  IP: 218.66.59.*
环境:JDK1.4.2,TOMCAT5.0.28,Oracle9i
我数据库名叫oracledb;JNDI名叫:jdbc/oracldb
-----------------------
server.xml内容:这里面好像没有<Context>;
<?xml version='1.0' encoding='utf-8'?>
<Server>
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<GlobalNamingResources>
<Environment name="simpleValue" type="java.lang.Integer" value="30"/>
<Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" type="org.apache.catalina.UserDatabase"/>
<Resource name="jdbc/oracledb" type="javax.sql.DataSource"/>
<ResourceParams name="UserDatabase">
<parameter>
<name>factory</name>
<value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
</parameter>
<parameter>
<name>pathname</name>
<value>conf/tomcat-users.xml</value>
</parameter>
</ResourceParams>
<ResourceParams name="jdbc/oracledb">
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@localhost:1521:or
#佘成龙 发表于2006-05-24 15:05:00  IP: 58.20.200.*
在TOMCAT5。5中,这样配置好像不行,我和同事试了一天,还是出问题,可以得到DATASOURCE的引用,但在JSP中使用时老是报错,也是这个
发生org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
我的邮箱,38058386@qq.com,请指教,对了,我的数据库为ORACLE9I ,是9。011的
QQ:38058386
请指教
#佘成龙 发表于2006-05-24 15:07:00  IP: 58.20.200.*
在TOMCAT5。5中,这样配置好像不行,我和同事试了一天,还是出问题,可以得到DATASOURCE的引用,但在JSP中使用时老是报错,也是这个
发生org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
我的邮箱,38058386@qq.com,请指教,对了,我的数据库为ORACLE9I ,是9。011的
QQ:38058386
请指教
#baggio785 发表于2006-05-24 16:52:00  IP: 60.191.55.*
佘成龙,你好

本文的环境是Tomcat5.0,5.5的方法在文章末尾提到了,请试试

tomcat5.5的配制方法为:

<Resource name="jdbc/JNDI名字" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="用户名" password="密码" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@ip:端口:sid"/>
#yeyinyue 发表于2006-06-09 17:01:00  IP: 222.221.198.*
5.5下web.xml也需要配置,不然会抛异常。
参看tomcat提供的文档便可以找到的啊。
#loopyfly 发表于2006-06-28 10:28:00  IP: 124.42.16.*
根据这篇文章配了一下,不过数据源用的是derby,测试成功。 原文“如果在web应用中访问了由Servlet容器管理的某个JNDI Resource,则必须在web.xml中声明对这个JNDI Resource的引用。表示资源引用的元素为<resource-ref>,该元素加在<wepapp></ wepapp >中。
”中<wepapp></wepapp> 应该是<web-app> ...</web-app>。 除此笔误外无其他问题。 谢谢楼主
#天使的眼神 发表于2006-07-04 15:43:00  IP: 10.161.7.*
寫的比較詳細的,不錯。只是中間有一些筆誤的地方。
#Dinstone 发表于2006-07-13 11:45:00  IP: 211.101.8.*
配置数据源其实相当简单:
1.首先在server.xml中相应的<Context>中加入<Resource>元素,打开server.xml,在<Context>(你的项目配置上下文)中加入以下代码(以oracle为例):
<Context path="/Exercise001" reloadable="true" docBase="D:\eclipse\workspace\Exercise001" workDir="D:\eclipse\workspace\Exercise001\work\org\apache\jsp" >
<!-- my dataConnectionPool seting here start-->
<Resource name="jdbc/myoracle" scope="Shareable" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/myoracle">
<parameter>
<name>factory</name> <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>5000</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>4</value>
</parameter>
<parameter>
<name>password</name>
<value>train</value>
</parameter>
<parameter>
<name>url</name> <value>jdbc:oracle:thin:@database-cn:1521:train007</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>maxIdle</
#winter 发表于2006-07-20 15:24:00  IP: 61.152.162.*
这个东西还需要拿出来讲?
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © baggio785