- 浏览: 302356 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (187)
- JAVA (66)
- JS (2)
- AJAX (9)
- Servlet (5)
- eclipse (4)
- html (2)
- PL/SQL (9)
- SOAP (1)
- other (14)
- JavaScript (8)
- Struts2 (6)
- Spring (10)
- Hibernate (5)
- JSP (1)
- Linux (3)
- WebService (2)
- 数据结构 (1)
- DB (5)
- English (1)
- maven (4)
- Code standard (2)
- SQL (1)
- 软件架构 (1)
- Tomcat (2)
- windows (1)
- HSQL (0)
- Open source framework (0)
- Web (6)
- Compass (0)
- Flex (1)
- OSGI (1)
- python (3)
- groovy (2)
- JPA (2)
- svn (1)
- jetty (1)
最新评论
-
zjfshowtime:
it doesn't work !why
Tomcat 和 Jetty 下 JNDI 配置 DBCP 连接池 -
coco5012:
Useful
sql server日期时间函数 datetime -
烟花弥散:
弱弱的问一句,您的第一个举例中else 后面可以跟判断条件吗? ...
Java高手论道:你还在用if else吗? -
coco5012:
Not very simple
使用assembly plugin实现自定义打包 -
mqlfly2008:
[color=red][size=medium][size=x ...
Java高手论道:你还在用if else吗?
前言
本文根据实例详细介绍了如何在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"/>
来源:http://blog.csdn.net/baggio785
发表评论
-
The Principles of Good Programming
2012-03-23 17:23 728转载:http://www.jdon.com/jivejd ... -
如何查看端口被是否被占用
2012-03-19 10:52 0在windows命令行窗口下执行: C:\>nets ... -
broadleaf备忘录
2012-03-11 19:59 0开发环境URL: http://www.broadle ... -
电子书下载资源推荐
2012-03-01 22:04 6689电子书下载资源推荐 落葉飛舞 » 技巧工具 ... -
多看系统使用技巧
2012-03-01 13:30 3551多看系统使用技巧: ... -
外汇专业词汇
2010-09-05 11:39 4018揸:买入(源自粤语)沽 ... -
主动地去工作
2010-08-29 22:19 1228在现实世界里,有些受 ... -
如何提高自己的自信心
2010-08-28 19:52 1510最主要的就是每天早晨 ... -
同事能力比你强怎么办
2010-08-26 20:56 33441. 自然就好,不要说因 ... -
如何和新同事相处
2010-08-26 20:37 13621.多注意同事的眼神,从眼神中去寻找每个同事的性格、处世方式, ... -
日语自我介绍
2010-08-14 22:56 1197はじめして、私は陳剛と申します。今年は二十九歳です。出身 ... -
DOS下的subst命令
2010-05-31 14:35 1262subst :路径替换 ,将路径与驱动器号关联,就是把一个目 ... -
Jxplorer说明文档
2010-05-25 13:02 1337JXplorer is an open source Java ... -
An Introduction to LDAP
2010-05-25 12:44 928An Introduction to LDAP Mic ... -
MVC1和MVC2区别(转载)
2010-05-21 16:17 1560MVC1,MVC2简析(转载 ...
相关推荐
在本文中,我们将详细介绍在 Tomcat 中配置数据源的原理。数据源是指Java应用程序连接数据库的接口,通过配置数据源,我们可以在 Java 应用程序中访问数据库。 首先, let's talk about JDBC。JDBC 是 Java ...
基于JNDI,在Tomcat5.5中配置数据源
用于在tomcat中配置java数据源用于在tomcat中配置java数据源用于在tomcat中配置java数据源用于在tomcat中配置java数据源用于在tomcat中配置java数据源。
tomcat配置jdbc数据源,虽然现在基本已经不用tomcat自带的数据源啦,需要的大家看看
Tomcat jndi 配置数据源过程 Tomcat jndi 配置数据源过程 Tomcat jndi 配置数据源过程 Tomcat jndi 配置数据源过程
在Tomcat配置数据源有多种方法,这里主要详细介绍通过JNDI来配置数据源.在实际项目中经常用到.
在Tomcat配置JNDI数据源的三种方式
TomCat5.5数据源配置
本文根据实例详细介绍了如何在tomcat 中配置数据源。网上此类文章很多,但是基本都是 雷同的,而且对一些特殊问题以及原理并未详细阐述,所以想根据自己的实际经验,并结合 例子写一篇详细的文章。
tomcat上配置的JNDI数据源的几种方式
在tomcat中配置数据源连接池的配置方法,及jar包文件。
详细介绍了在Tomcat中配置数据源JNDI的三种方法,其中第一种方法最好用,附带一部分源代码
tomcat 配置工程 数据源
本文档说明tomcat 5.5数据源配置
在TomcatWeb服务器上配置数据源, 在TomcatWeb服务器上配置数据源,
tomcat配置数据源所需jar包,把jar放到tomcat文件夹下的lib里面
怎样在tomcat5中配置mysql数据源
NULL 博文链接:https://czq5783095.iteye.com/blog/1458651
自己总结的三种使用方式,对比来看选择最适合你的方式
图解Tomcat5.5数据源的配置