Tomcat 6 JNDI数据源详解

数据库连接池这个概念应该都不陌生,在Java中连接池也就是数据库的连接池,它是一种采用连接复用的思想避免多次连接造成资源的浪费机制。

最常见的连接池就是DBCP和C30P了,在tomcat中默认使用的DBCP的连接池,在Hibernate中则默认使用的是C3P0。他们的区别对于使用者来说最明显的就是,默认情况下DBCP不提供空闲连接的释放,需要手动开启。

下面介绍下Tomcat中数据连接池的配置及使用。

 

介绍

  本篇依赖一个概念——JNDI,可以参考前面的博客:JNDI资源详解

  对于JNDI,可以简单理解成Tomcat中的资源池,通过一些特有的名字与特定的资源相对应,类似一个map,可以简单的通过名字获取到该资源。

  那么本篇中JNDI数据源就是通过配置一个数据源的资源,在应用中通过该名称获取到数据库连接,进行操作。这样就省去了每次连接数据库的步骤。

连接池原理

  连接池的概念,应该都不陌生了。部分内容可以参考:几个主流的连接池

  这里简单说明下,如果单独在应用使用连接池,可能只是在应用运行时创建连接池。而tomcat配置数据源可以在tomcat容器启动时就初始化连接池,停止tomcat时才释放资源,其部署的应用可以根据JNDI的声明,在应用中共享使用该资源。

  因此一个是应用中的连接池(即一个应用中不同的业务使用该连接池,比如注册新用户与购买商品),一个可以扩大到多应用的连接池,具体使用的还要看业务需求。

 

  另外,tomcat中默认使用的DBCP连接池,其jar包位于CATALINA_HOME/lib下,tomcat-dbcp.jar。

  需要注意的是,默认情况下dbcp不会去释放空闲的连接。比如,我们在编码时,拿到一个连接执行业务操作,但是没有进行释放。此时,DBCP连接池不会放回到空闲队列中。如果再有新的连接,会分配其他的连接。当连接数目过大时,就会造成连接的阻塞。

  可以通过配置某些属性来自动回收连接,首先设置removeAbandoned="true"开启回收,然后设置removeAbandonedTimeout="300"设置连接的时间,超过该时间就会自动收回。

  具体内容可以参考:DBCP文档

Mysql案例

  按照下面几个步骤:

  1 放置mysql驱动:可以到这里下载

  2 创建数据库插入数据

  3 配置JNDI资源(context.xml以及web.xml)

  4 创建JSP验证结果

  

  1 放置驱动

  在tomcat根目录下的Lib中放置mysql驱动。

  2 创建数据库表并添加数据

  可以参考下面的SQL脚本:

/*
SQLyog v4.05
Host - 4.1.11-nt : Database - test
*********************************************************************
Server version : 4.1.11-nt
*/

create database if not exists `test`;

USE `test`;

/*Table structure for table `test`.`stu` */

drop table if exists `test`.`stu`;

CREATE TABLE `stu` (
  `id` int(11) NOT NULL default '0',
  `name` char(1) default NULL,
  `age` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*Data for the table `test`.`stu` */

insert into `test`.`stu` values (0,'x',26),(1,'z',27),(2,'w',25);

  3 配置JNDI资源

  首先在context.xml中添加<resource>

<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="root" password="123456" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/test"/>

  其中username为你的用户名,password是密码。

  maxActive指定最大的连接数,maxIdle指定最大的空闲连接数(即没有连接时,保存多少连接),maxWait指定最大的等待连接数。

  然后在web.xml中配置指定的资源名称(不是必须的)

  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>

  4 创建JSP页面,输出信息

  按照下面的代码创建,并释放连接:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    import="javax.naming.*,java.sql.*,javax.sql.*"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h2>Results</h2>
    <%
    Context initContext = new InitialContext();
    Context envContext  = (Context)initContext.lookup("java:/comp/env");
    DataSource ds = (DataSource)envContext.lookup("jdbc/TestDB");
    Connection conn = ds.getConnection();
    String sql = "select * from stu";
    PreparedStatement st = conn.prepareStatement(sql);
    ResultSet rs = st.executeQuery();
    while(rs.next()){
        out.println("name:"+rs.getString(2)+" age:"+rs.getInt(3)+"<br>");
    }
    if(rs!=null){
        try{
            rs.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
        rs = null;
    }
    if(st!=null){
        try{
            st.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    if(conn!=null){
        try{
            conn.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    %>
</body>
</html>

  最后的执行结果:

其他的配置

  其他的配置如Oracle和PostgreSQL仅仅是需要的数据库驱动和创建的JNDI名称不同:

  例如,在oracle中,context.xml中配置如下:

<Resource name="jdbc/myoracle" auth="Container"
              type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@127.0.0.1:1521:mysid"
              username="scott" password="tiger" maxActive="20" maxIdle="10"
              maxWait="-1"/> 

  在PostgreSQL中配置如下:

<Resource name="jdbc/postgres" auth="Container"
          type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
          url="jdbc:postgresql://127.0.0.1:5432/mydb"
          username="myuser" password="mypasswd" maxActive="20" maxIdle="10"
maxWait="-1"/>

  使用方式都是差不多的。

参考

【1】几种主流的连接池:http://developer.51cto.com/art/201006/207768.htm

【2】DBCP官方文档:http://commons.apache.org/proper/commons-dbcp/configuration.html

【3】Tomcat JNDI Database:http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html

本文转自博客园xingoo的博客,原文链接:Tomcat 6 JNDI数据源详解,如需转载请自行联系原博主。

时间: 2024-10-24 18:10:32

Tomcat 6 JNDI数据源详解的相关文章

Tomcat 配置技巧精华详解分析

技巧|精华|详解 1.配置系统管理(Admin Web Application) 大多数商业化的J2EE服务器都提供一个功能强大的管理界面,且大都采用易于理解的Web应用界面.Tomcat按照自己的方式,同样提供一个成熟的管理工具,并且丝毫不逊于那些商业化的竞争对手.Tomcat的Admin Web Application最初在4.1版本时出现,当时的功能包括管理context.data source.user和group等.当然也可以管理像初始化参数,user.group.role的多种数据库

Spring Boot 整合 Mybatis 实现 Druid 多数据源详解

本文提纲一.多数据源的应用场景二.运行 springboot-mybatis-mutil-datasource 工程案例三.springboot-mybatis-mutil-datasource 工程代码配置详解 一.多数据源的应用场景 目前,业界流行的数据操作框架是 Mybatis,那 Druid 是什么呢? Druid 是 Java 的数据库连接池组件.Druid 能够提供强大的监控和扩展功能.比如可以监控 SQL ,在监控业务可以查询慢查询 SQL 列表等.Druid 核心主要包括三部分:

Tomcat 多站点配置详解及实现方法_Tomcat

Tomcat 多站点配置 今天心血来潮试了一下Tomcat的多站点配置,都是通过修改server.xml完成,其他方式不做介绍 第一种: 这种是最常见的,在网上一搜就可以搜到的,在这里还是拿出来说一下,方便做个比较,直接贴代码 <Host name="localhost" appBase="www" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn

tomcat配置文件server.xml详解

转自:http://blog.csdn.net/pg_Roger/article/details/8972432 元素名 属性 解释 server port 指定一个端口,这个端口负责监听关闭tomcat 的请求 shutdown 指定向端口发送的命令字符串 service name 指定service 的名字 Connector ( 表示客户端和service 之间的连接) port 指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求 minProcessors 服务器启动时创建的处

mac系统安装apache tomcat配置方法图文详解

  tomcat无法取访问appache资源. appache只支持静态网页,但像asp,php,cgi,jsp等动态就需要tomcat来处理.对于apache tomcat 估计很多童鞋都会,那么今天就简单说下在mac上进行tomcat的安装: 1.下载Tomcat mac下载zip和tar.gz都行,我下载的是tar.gz 2.压缩之后直接拷贝到资源库中,压缩后的文件夹名称为Tomcat8,具体位置如下: 3.打开终端,输入以下命令Library/Tomcat8/bin/startup.sh

深入理解Tomcat系列之七:详解URL请求

前言 这里分析一个实际的请求是如何在Tomcat中被处理的,以及最后是怎么样找到要处理的Servlet的?当我们在浏览器中输入http://hostname:port/contextPath/servletPath,前面的hostname与port用于建立tcp连接,由于Http也是基于Tcp协议的,所以这里涉及TCP连接的三次握手.后面的contextPath与servletPath则是与服务器进行请求的信息,contextPath指明了与服务器中哪个Context容器进行交互,服务器会根据这

Tomcat安装图解教程详解

tomcat安装图解教程 1.先我们可以百度搜索tomcat7.0安装文件然后下载在电脑,之后双击它在打开安装界面我们点击Next开始安装 2.进入到apache tomcae setup界面,我们点击 i agree也就是同意安装协议 3.如下图所示按照默认 4.其它的选择我们可以保持默认设置就行,用户名密码你可以自行设置一个 5.点击Next后会出现下图,它会自动找到JRE位置,如果用户没有安装JRE,可以修改指向JDK目录(很多用户安装后无法编译JSP,就是这里没找到JRE,请务必先要安装

Tomcat 6 --- JNDI详解

JNDI(Java Naming and Directory Interface, Java命名和目录接口),说白了,就是通过配置一些xml文件,方便用户直接调用API使用某些通用的资源. 举个简单的例子,如果在tomcat中部署了很多应用,应用都需要使用同一个数据库,如果每个应用都在代码中配置数据库的连接,肯定是很麻烦的. 所以通过JNDI就可以简单的通过 InitialContext 获取到统一配置的资源,简化代码的编写. 本篇主要内容按照上面来讲解,其中样例部分主要说明一下通用javabe

Tomcat中用web.xml控制Web应用详解

web|xml|控制|详解 1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码.DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部分内容的语法的DTD(Document Type Definition,文档类型定义).所有部署描述符文件的顶层(根)元素为web-app.请注意,XML元素不像HTML,他们是大小写敏感的.因此,web-