知识大全 详细介绍在tomcat中配置数据源原理

Posted

篇首语:守望相助,一缕阳光也将照亮心扉;同心协力,一点火光也能温暖灵魂。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 详细介绍在tomcat中配置数据源原理相关的知识,希望对你有一定的参考价值。

  转摘请注明出处

  作者:baggio

  来源:

  本文地址 ;

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

  前言

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

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

  开发环境

  本文的环境 JDK TOMCAT Oracle i

  JDBC简介

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

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

  Driver接口和DriverManager类

  Connection

  Statement

  PreparedSataement

  ResultSet

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

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

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

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

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

        PrepareStatement   PrepareStatement用于执行动态的sql语句 即允许sql语句中包含参数 使用方法为    String sql = select col from tablename where col =? And col =? ;   PrepareStatement perpStmt = conn preparestatement(sql);   perpStmt setstring( col Value);      perpStmt setFloat( col Value);      ResultSet rs = perpStmt executeQuery();

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

  事务处理

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

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

  参考例子

tryconn SetautoCommit(false);stmt = conn createstatement();stmt executeUpdate( delete form table where col = );stmt eecuteUpdate( delete from table where col = );();catch(Exception e)e printStackTrace;tryconn rollback(); catch(Exception e )e printStackTrace;

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

<%@ page import= java util * ><%@ page import= java sql * ><%tryConnection 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)finallyrs close();stmt close();conn close();%>

  数据源简介

  JDBC 提供了javax sql DataSource的接口 负责与数据库建立连接 实际应用时不需要编写连接数据库代码 直接从数据源获得数据库的连接 Dataource中事先建立了多个数据库连接 这些数据库连接保持在数据库连接池中 当程序访问数据库时 只需要从连接池从取出空闲的连接 访问数据库结束 在将这些连接归还给连接池 DataSource对象由容器(Tomcat)提供 不能使用创建实例的方法来生成DataSource对象 要采用JAVA的JNDI(Java Nameing and Directory Interface java命名和目录接口)来获得DataSource对象的引用 (另有一种说法 其实从技术上来说 数据源连接方式是不需要目录服务的 我们同样可以通过序列化数据源对象直接访问文件系统 这点是需要明确的 感兴趣的朋友可以试试 )JNDI是一种将对象和名字绑定的技术 对象工厂负责生产出对象 这些对象都和唯一的名字相绑定 程序中可以通过这个名字来获得对象的引用 Tomcat把DataSource作为一种可配置的JNDI资源来处理 生成DataSource对象的工厂为m 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>mons dbcp BasicDataSourceFactory</value></parameter><parameter><name>maxActive</name><value> </value></parameter><parameter> <name>maxIdle</name> <value> </value></parameter><parameter><name>maxWait</name> <value> </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 指定数据库连接池中处于活动状态的数据库连接最大数目 表示不受限制 maxIdle 指定数据库连接池中处于空闲状态的数据库连接的最大数目 表示不受限制 maxWait 指定数据库连接池中的数据库连接处于空闲状态的最长时间(单位为毫秒) 超过这一事件 将会抛出异常 表示可以无限期等待 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 %><%@ page import= java sql * %><%@ page import= javax naming * %><%@ page import= javax sql * %><!DOCTYPE HTML PUBLIC //W C//DTD HTML Transitional//EN ><><head></head><body><%Context initContext = new InitialContext();Context envContext = (Context) initContext lookup( java:/p/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></>

  另:tomcat 的配制方法为:

cha138/Article/program/Java/ky/201311/28263

相关参考

知识大全 在 tomcat 5 中配置数据库连接池(DBCP)

在tomcat5中配置数据库连接池(DBCP)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  首

知识大全 Tomcat配置多数据源

Tomcat配置多数据源  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  测试的tomcat为ap

知识大全 Tomcat5.5的基本配置详细说明

Tomcat5.5的基本配置详细说明  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Tomcat

知识大全 开源技术之Tomcat数据源配置总结

开源技术之Tomcat数据源配置总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  成功配置环境

知识大全 Tomcat下配置MySQL数据库连接池

Tomcat下配置MySQL数据库连接池  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在$CA

知识大全 tomcat的sql server数据源的配置

  ApacheTomcat/    把jdbc包拷贝到%TOMCAT_HOME%/mon/lib下面并将jdbc包加入到系统变量classpath    serverxml的配置    connec

知识大全 tomcat连接池的配置与使用数据库mysql

    关于tomcat连接池的配置我在自己开始的时候碰到过许多的问题至少失败过六次今天终于成功了对于这个问题的产生与由来我也给大伙说说  

知识大全 Tomcat5.5数据库连接池配置

Tomcat5.5数据库连接池配置  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!猫咪正不断把自己B

知识大全 Tomcat5配置Mysql JDBC数据库连接池

Tomcat5配置MysqlJDBC数据库连接池  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 浅析Tomcat5配置Mysql JDBC数据库连接池

浅析Tomcat5配置MysqlJDBC数据库连接池  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!