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为例:

 <Context docBase="D:/data/webdemo" path="/webdemo" debug="0"  reloadable="true">
<Resource name="jdbc/mydb"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="root"
driverClassName="org.gjt.mm.mysql.Driver"
url="jdbc:mysql://localhost:3306/mydb"/>
</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文件)文件之中完成配置。

   <resource-ref>
<res-ref-name>jdbc/mydb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</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类。

 package com.shawn.mvcdemo.dbc;

 import java.sql.*;
import javax.sql.*;
import javax.naming.*; public class DatabaseConnection{
private static final String DSNAME = "java:comp/env/jdbc/mldn";//java:comp/JNDI名称 private Connection conn = null; public DatabaseConnection() throws Exception{
Context ctx = new InitialContext();        //初始化名称查找上下文
DataSource ds = (DataSource)ctx.lookup(DSNAME); //通过名称查找DataSource对象
this.conn = ds.getConnection();          //通过DataSource取得一个数据库连接
} public Connection getConnection(){
return this.conn;
} public void close() throws Exception{
if(this.conn != null){
try{
this.conn.close();            //释放数据库连接
} catch(Exception e){
throw e;
}
}
} public static void main(String args[]){
try{
System.out.println(new DatabaseConnection().getConnection());
} catch(Exception e){
e.printStackTrace();
}
}
}

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

总结:

  要使用数据库连接池

  1、配置server.xml;

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

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

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

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

    Tomcat数据源的原理,配置及使用 知识点: 1.数据源的作用及操作原理; 2.Tomcat中数据源的配置; 3.数据源的查找及使用 传统JDBC使用过程存在以下四个步骤: 1.加载驱动程序 2.进 ...

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

    一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar

  3. Tomcat下使用C3P0配置JNDI数据源(在项目的META-INF目录下创建context.xml的文件)

    一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar 下载完成之后得到一个压缩包

  4. JNDI学习总结——Tomcat下使用C3P0配置JNDI数据源

    一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar

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

    一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar 下载完成之后得到一个压缩包. 二.使用C3P0配 ...

  6. JDBC 学习复习9 配置Tomcat数据源

    在实际开发中,我们有时候还会使用服务器提供给我们的数据库连接池,比如我们希望Tomcat服务器在启动的时候可以帮我们创建一个数据库连接池,那么我们在应用程序中就不需要手动去创建数据库连接池,直接使用T ...

  7. java web(二) Tomcat数据源

    一.数据源的产生 1.JDBC操作原理 (1) 加载数据库驱动程序(数据库驱动程序可通过classpath配置): Class.forName(); (2)通过DriverManager类取得数据库连 ...

  8. tomcat简介及原理解说

    Tomcat简介 作者:杨晓(http://blog.sina.com.cn/u/1237288325) 目录: ----Tomcat背景 ----Tomcat目录 ----Tomcat类加载 --- ...

  9. Tomcat数据源

    Tomcat数据源原理,配置,使用 在程序中,使用数据源是可以提升操作性能的,这种性能 的提升依靠运行的操作原理. 传统的JDBC操作: 1. 加载数据库驱动,通过CLASSPATH配置 2. 通过D ...

随机推荐

  1. 【算法笔记】B1041 考试座位号

    1041 考试座位号 (15 分) 每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生 ...

  2. OJ 21651::Cow Hurdles(佛罗一德的变式)

    Description Farmer John wants the cows to prepare for the county jumping competition, so Bessie and ...

  3. 118th LeetCode Weekly Contest Pancake Sorting

    Given an array A, we can perform a pancake flip: We choose some positive integer k <= A.length, t ...

  4. [转] Spring Boot配置多个DataSource

    [From]  https://www.liaoxuefeng.com/article/001484212576147b1f07dc0ab9147a1a97662a0bd270c20000 Sprin ...

  5. PIE SDK图层树伙伴控件示例

    1.  功能简介 TocControl控件的主要作用是显示当前加载的图层有哪些.采用什么样的符号等,目的是使用户对当前加载的数据和结构有一个总体的把握.与之相关联的伙伴控件有MapControl,Pa ...

  6. python发送信息到邮箱

    import smtplib from email.mime.text import MIMEText 设置服务器所需信息 163邮箱服务器地址 mail_host = 'smtp.163.com' ...

  7. MySQL误删root用户导致无法登陆解决方法

    测试环境   删除前 mysql> select user,host,password from mysql.user; +------+-----------+---------------- ...

  8. 枚举类型与字符串ConvertEnumToString

    枚举类型与字符串添加字典互转ConvertEnumToString using UnityEngine; using System.Collections; using UnityEngine.UI; ...

  9. HexChat访问Docker频道

    1.使用HexChat登录Freenode.net 2.在Freenode下输入并回车: /msg NickServ REGISTER yourpassword youremail@example.c ...

  10. PHP 设置 socket连接

    摘要: 作者博文地址:https://www.cnblogs.com/liu-shuai/ nginx和fastcgi的通信方式有两种,一种是TCP的方式,一种是unix socket方式. sock ...