zoukankan      html  css  js  c++  java
  • 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的方式。

  • 相关阅读:
    c#自动更新+安装程序的制作
    VS2013项目受源代码管理向源代码管理注册此项目时出错
    WinDbg配置和使用基础
    InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序)
    PowerDesigner 如何生成数据库更新脚本
    用户故事(User Story)
    Troubleshooting Record and Playback issues in Coded UI Test
    Coded UI
    compare two oracle database schemas
    How to: Use Schema Compare to Compare Different Database Definitions
  • 原文地址:https://www.cnblogs.com/ShawnYang/p/7451459.html
Copyright © 2011-2022 走看看