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

<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 数据源的原理、配置、使用介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Tomcat 7-dbcp配置数据库连接池详解

    Tomcat 7-dbcp配置数据库连接池详解 原理 关于连接池,大家都晓得用来限定对数据库的连接.基本的原理是预先在缓冲池中放入一定的空闲连接,当程序需要和数据库来交互时,不是直接新建数据库连接而是在连接池中直接取,使用完成后再放回到连接池中.为什么要这样牺牲一个缓冲来存放这些原本就会使用的连接呢?在上面讲了一个好处就是可以限定连接数,这样不会造成N多的数据库连接最后宕机:额外有了这样一个连接池,也可以来监听这些连接和便于管理. 配置 1.拷贝相关的jar 要知道连接池不是用来直接操作数据库的

  • 基于Tomcat 数据源的原理、配置、使用介绍

    1.数据源的作用及操作原理 在程序代码中使用数据源是可以提升操作性能的,这种性能的提升依靠于运行的原理. 传统JDBC操作步骤 1.加载数据库驱动程序,数据库驱动程序通过CLASSPATH配置: 2.通过DriverManager类取得数据库连接对象: 3.通过Connection实例化PreparedStatement对象,编写SQL命令操作数据库: 4.数据库属于资源操作,操作完成后进行数据库的关闭以释放资源.如图所示: 对于不同的用户只有操作不同,但是对于1.2.4三个步骤很明显是一个重复

  • MySQL半同步复制原理配置与介绍详解

    环境介绍: Ubuntu Server 16.04.2+MySQL 5.7.17 Community Server (GPL) MySQL安装 通过APT的方式安装,官方指导文档地址: https://dev.mysql.com/downloads/repo/apt/ 1.下载mysql-apt-config_0.8.3-1_all.deb 2.安装deb A Quick Guide to Using the MySQL APT Repository: https://dev.mysql.com

  • 基于Tomcat安全配置与性能优化详解

    Tomcat 是 Apache软件基金会下的一个免费.开源的WEB应用服务器,它可以运行在 Linux 和 Windows 等多个平台上,由于其性能稳定.扩展性好.免费等特点深受广大用户喜爱.目前,很多互联网应用和企业应用都部署在 Tomcat 服务器上,比如我们公司,哈. 之前我们 tomcat 都采用的是默认的配置,因此在安全方面还是有所隐患的.上周对测试环境的所有服务器的tomcat都做了安全优化,其间也粗略做了一些性能优化,这里就简单记录分享下! 一.版本安全 升级当前的tomcat版本

  • 基于tomcat映射路径配置方法分享

    tomcat请求头配置 在使用postman测试的时候(携带参数)我们经常会发现浏览器一个错误:request header is too large,意思是请求头字段太长了.在这里需要配置下tomcat请求头长度. tomcat-service.xml <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443&q

  • 基于redis.properties文件的配置及说明介绍

    在使用到redis连接池时,需要进行一些redis相关配置,redis.properties文件是由编程者自己在项目classpath路径(如eclipse的src)下建立的,并非从redis安装包中获取的. 1.redis.properties文件的建立 在eclipse中找到相应的项目,选择File-->New-->File,选中项目中的src目录,填入文件名称redis.properties,然后Finish就可以了. 2.redis.properties文件的配置与说明 redis.t

  • 使用Spring Boot快速构建基于SQLite数据源的应用

    为了提供一个单包易部署的服务器应用,考虑使用Spring Boot,因为其集成了Apache Tomcat,易于运行,免去绝大部分了服务器配置的步骤. 项目初始化 首先从mvn archetype:generate中选择 com.github.mkspcd:simple-webapp(或其他webapp模版) 模版生成项目结构. 更多关于maven请移步Maven - Users Centre 在pom.xml中添加parent来获取Spring Boot所需的最小依赖. <project xm

  • 基于tomcat的连接数与线程池详解

    前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xml 中写到过:Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据:然后分配线程让Engine(也就是Servlet容器)来处理这个请求,并把产生的Request和Response对象传给Engine.当Engine处理完请求后,也会通过Conn

  • 基于tomcat配置文件server.xml详解

    1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置极其简单,只需修改$CATALINA_HOME/conf/server.xml文件为如下内容即可.其中大部分都采用了默认设置,只是在engine容器中添加了两个Host容器. <?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SH

  • 基于servlet的执行原理与生命周期(全面解析)

    一.先从servlet容器说起:大家最为熟悉的servlet容器就是Tomcat ,Servlet 容器是如何管理 Servlet? 先看一下tomcat的容器模型: 从上图可以看出 Tomcat 的容器分为四个等级,真正管理Servlet 的容器是Context 容器,一个 Context 对应一个 Web 工程 Tomcat 的容器等级中,Context 容器是直接管理 Servlet 在容器中的包装类Wrapper(StandardWrapper)的容器,所以 Context 容器如何运行

  • springboot 基于Tomcat容器的自启动流程分析

    Springboot 内置了Tomcat的容器,我们今天来说一下Springboot的自启动流程. 一.Spring通过注解导入Bean大体可分为四种方式,我们主要来说以下Import的两种实现方法: 1.通过实现ImportSerlector接口,实现Bean加载: public class TestServiceImpl { public void testImpl() { System.out.println("我是通过importSelector导入进来的service");

随机推荐