Tomcat 数据源的原理、配置、使用

1、数据源的作用及操作原理

  在程序代码中使用数据源是可以提升操作性能的,这种性能的提升依靠于运行的原理。 

  传统JDBC操作步骤
    1、加载数据库驱动程序,数据库驱动程序通过CLASSPATH配置;
    2、通过DriverManager类取得数据库连接对象;
    3、通过Connection实例化PreparedStatement对象,编写SQL命令操作数据库;
    4、数据库属于资源操作,操作完成后进行数据库的关闭以释放资源。如图所示:

    对于不同的用户只有操作不同,但是对于1、2、4三个步骤很明显是一个重复的操作。

    如果开发中直接使用JDBC操作的话,那么就会产生这种性能的问题,那么怎么做最合适呢?

    如果假设数据库不关闭,以后如果有新的用户使用的时候直接取一个已经有的连接的话。

    就好比,学校为学生提供雨伞,一旦下雨将为学生准备雨伞,这个时候学生不用再重新去找雨伞,之后再重新去买雨伞。

    假设有100把伞,如果现在不下雨,肯定不能把所有的伞都摆上,所以一般平常如果没人用的时候至少摆上10把。当然,最大的时候只能提供100把伞。

    还需要一个等待的时间。

    最小维持的数据库连接数,最大允许打开的连接数。

    Tomcat 4.1 版本之后就开始支持这种操作了,这种操作就称为数据库连接池,存放的是所有的数据库连接。

2、在Tomcat中使用数据库连接池

   在web容器中,数据库的连接池都是通过数据源(javax.sql.DataSource)访问的,即:可以通过 javax.sql.DataSource 类取得Connection对象,但是如果要想得到一个DataSource对象需要使用JNDI进行查找。

    JNDI(Java Naming and Directory Interface)属于命名及目录查找接口,主要的功能是用于进行查找的,查找对象。
但是,现在的数据库的连接池是需要在Tomcat上完成配置的。

    要修改server.xml文件才可以起作用。

    如下,以连接mysql为例:

 1 <Context docBase="D:/data/webdemo" path="/webdemo" debug="0"  reloadable="true">
 2       <Resource name="jdbc/mydb"
 3                 auth="Container"
 4                 type="javax.sql.DataSource"
 5                 maxActive="100"
 6                 maxIdle="30"
 7                 maxWait="10000"
 8                 username="root"
 9                 password="root"
10                 driverClassName="org.gjt.mm.mysql.Driver"
11                 url="jdbc:mysql://localhost:3306/mydb"/>
12 </Context>

    此配置有几个参数:
      ·name:表示数据源名称,也是JNDI要查找的名称
      ·auth:表示由谁负责资源连接,Container:容器管理,application:程序管理,一般设置为 Container
      ·type:表示对象,数据源上每一个绑定的都是DataSource
      ·maxActive:表示最大激活连接数,这里取值为100,表示同时最多有100个数据库连接,一般把maxActive设置成可能的并发量
      ·maxIdle:表示最大的空闲连接数,这里取值为30,表示即使没有数据库连接时依然可以保持30空闲的连接,而不被清除,随时处于待命状态
      ·maxWait:表示最大等待秒钟数,这里取值10000,表示10秒后超时,如果取值-1,则表示无限等待,直到超时为止,如果超时将接到异常
      ·username:数据库用户名
      ·password:数据库登录密码
      ·driverClassName:数据库驱动名称
      .url:数据库url

    但是现在使用的Tomcat版本是6.0以上的版本,所以想让一个数据源起作用的话,还必须在web.xml(注意:此web.xml是web项目的web.xml文件,而不是tomcat服务器的web.xml文件)文件之中完成配置。

1   <resource-ref>
2     <res-ref-name>jdbc/mydb</res-ref-name>
3     <res-type>javax.sql.DataSource</res-type>
4     <res-auth>Container</res-auth>
5   </resource-ref>

3、查找数据源

    数据源的操作使用的是JNDI方式进行查找的,所以如果要想使用数据源取得数据库连接的话,则必须按照如下的步骤进行
      初始化名称查找上下文:Context ctx = new InitialContext();
      通过名称查找DataSource对象:DataSource ds = (DataSource)ctx.lookup(JNDI名称);
      通过DataSource取得一个数据库连接:Connection conn = ds.getConnection()。

    此时调用数据库会出现一个Exception:
    javax.servlet.ServletException: javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
    实际上对于这种资源操作,本身是需要一个环境属性的支持的: java:comp/env,但是Tomcat服务器本身是免费的,没有对这种属性提供支持,如果要想访问Tomcat中的名称服务的话,则肯定要在前面加上此属性,即,现在的名称是: java:comp/env/jdbc/mydb;即用Tomcat的话JNDI名称就是:java:comp/env/JNDI名称 。

    以后程序中只认名字,而具体是哪个数据库将由配置决定。
    当然,如果现在使用的是DAO开发的,DatabaseConnection.java类。

 1 package com.shawn.mvcdemo.dbc;
 2
 3 import java.sql.*;
 4 import javax.sql.*;
 5 import javax.naming.*;
 6
 7 public class DatabaseConnection{
 8     private static final String DSNAME = "java:comp/env/jdbc/mldn";//java:comp/JNDI名称
 9
10     private Connection conn = null;
11
12     public DatabaseConnection() throws Exception{
13         Context ctx = new InitialContext();        //初始化名称查找上下文
14         DataSource ds = (DataSource)ctx.lookup(DSNAME); //通过名称查找DataSource对象
15         this.conn = ds.getConnection();          //通过DataSource取得一个数据库连接
16     }
17
18     public Connection getConnection(){
19         return this.conn;
20     }
21
22     public void close() throws Exception{
23         if(this.conn != null){
24             try{
25                 this.conn.close();            //释放数据库连接
26             } catch(Exception e){
27                 throw e;
28             }
29         }
30     }
31
32     public static void main(String args[]){
33         try{
34             System.out.println(new DatabaseConnection().getConnection());
35         } catch(Exception e){
36             e.printStackTrace();
37         }
38     }
39 }

  可是有一点也必须注意的是,现在的数据库连接池实在Tomcat上配置的,所以此程序只能在web下运行,而不能使用application程序运行。

总结:

  要使用数据库连接池

  1、配置server.xml;

  2、配置web项目中的(比如:webdemo项目)web.xml文件,添加 resource-ref 配置;

  3、修改程序中获取Connection的方式。

时间: 2024-10-25 21:57:57

Tomcat 数据源的原理、配置、使用的相关文章

Tomcat数据源的原理,配置及使用(JNDI)

Tomcat数据源的原理,配置及使用 知识点: 1.数据源的作用及操作原理; 2.Tomcat中数据源的配置; 3.数据源的查找及使用 传统JDBC使用过程存在以下四个步骤: 1.加载驱动程序 2.进行数据库连接 3.数据库操作 4.数据库关闭 对于不同的用户只有操作不同,但是1,2,3三个步骤是一个重复的操作 如果开始种直接使用JDBC操作的化,那么会产生一种性能的问题 那么假设数据库不关闭,一户如果有新的用户使用的时候直接取一个已经有的连接就可以了 这就是数据库连接池,数据库连接池里存放的是

JNDI学习总结(二)——Tomcat下使用C3P0配置JNDI数据源

一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar 下载完成之后得到一个压缩包. 二.使用C3P0配置JNDI数据源 Tomcat6.x中配置JNDI数据源时默认使用的是Tomcat6.x自带的DBCP连接池,Tomcat6.x使用DBCP连接池配置JNDI数据源如下: 1 <Resource 2 name="oracleDataSource" 3 auth="Conta

单Tomcat的多实例配置原理及应用

转自 http://www.cher7.com/?id=12919 我们常有在JAVAWeb应用部署或依赖Tomcat应用中遇到单机多实例的需求,解决方案一般有: 1.复制Tomcat到不同目录,更改Server.xml等配置文件: 2.部署不同应用实例到webapps目录下或直接将多项目部署到同一Tomcat实例中. 以此解决多项目部署问题,不能说以上两种解决方案不对,只是这种解决思路有以下几个问题: 复制多Tomcat难于维护.两三个实例还好说,如果配置十个以上的实例,那对于统一启动.Tom

java web进阶篇(四) Tomcat数据源

动态web开发的最大特点是可以进行数据库的操作,传统的jdbc操作由于步骤重复性造成程序性能下降. 先来回顾JDBC的操作原理 1.加载数据库驱动程序,数据库驱动程序通过classpath配置. 2.通过DirverManager类取得数据库连接对象. 3.通过Connection实例化PreparedStatement对象,编写sql语句命令操作数据库. 4.数据库属于资源操作,操作完成后要关闭数据库以释放资源. 其实以上操作,1.2.4步骤是重复的,保留3,实际上就是数据源产生的原因. 数据

tomcat简介及原理解说

Tomcat简介 作者:杨晓(http://blog.sina.com.cn/u/1237288325) 目录: ----Tomcat背景 ----Tomcat目录 ----Tomcat类加载 ----server.xml配置简介 ----web.xml配置简介 ----管理 ----tomcat原理解说 ----Tomcat Server的组成部分 ----Tomcat Server的结构图 ----配置文件$CATALINA_HOME/conf/server.xml的说明 ---Contex

java web(二) Tomcat数据源

一.数据源的产生 1.JDBC操作原理 (1) 加载数据库驱动程序(数据库驱动程序可通过classpath配置): Class.forName(); (2)通过DriverManager类取得数据库连接对象: Connection conNn = DriverManager.getConnection(); (3)通过Connection实例化PreparedStatement对象,编写SQL命令操作数据库: PreparedStatement ps = conn.prepareStatemen

tomcat dbcp 基于jndi配置时出现java.sql.SQLException: Already closed

最近观察生产环境发现一个现象,一段时间不操作,再重新操作时,数据库连接第一次会出现:java.sql.SQLException: Already closed.,如下: 数据源是用tomcat dbcp 基于jndi配置管理的,查了下,如下: 原因: You're probably running into the fact that MYSQL closes connections  which have been open "too long". Probably if you m

Tomcat数据源总结

一.数据源的由来 JDBC操作主要由以下几步组成: (1)Class.forName(); (2)Connection con  = DriverManager.getConnection(); (3)PreparedStatement stat = con.prepareStatement(sql); (4)stat.executeQuery(); (5)con.close(); 很显然,(1)(2)(5)步是每次JDBC操作都要执行的,重复执行是非常耗时的,因此为了解决重复操作的问题,引入了

tomcat组成及原理[转]

Tomcat安装好后打开目录;可以看到如下结构: bin :存放服务器脚本; conf :存放配置文件; lib :存放需要的JAR文件; wabapps :存放需要发布的Web应用程序及其部署文件; work :存放jsp 文件编绎生成的class文件; logs :存放日志文件; 在conf目录下可以看到 Catalina 目录,context.xml, web.xml, server.xml 等(一些不是很重要的就不列出来了). server.xml被称为Tomcat的主配置文件或全局配置