欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Tomcat学习笔记 - 【使用JNDI数据源】 博客分类: Nginx/Tomcat/Jetty tomcatjndidbcp连接池 

程序员文章站 2024-03-22 08:36:28
...

        还记得3年前写的第一个Java操作JDBC的程序,关于连接参数的配置全都硬编码写在Java代码里面。Tomcat学习笔记 - 【使用JNDI数据源】
            
    
    博客分类: Nginx/Tomcat/Jetty tomcatjndidbcp连接池 然后开始尝试着使用数据库连接池,比如DBCP、C3P0之类的,并且把连接池的设置参数写在属性文件里面,如mysql.properties,然后累死累活的从属性文件中把连接池参数解析出来,只为了修改参数的之后不再重新编译Java源文件。在使用Spring框架之后,终于从属性文件的解析中解脱出来,感觉对数据库连接池使用的学习应该到此结束。Tomcat学习笔记 - 【使用JNDI数据源】
            
    
    博客分类: Nginx/Tomcat/Jetty tomcatjndidbcp连接池 

        在生产环境下,为了使对数据库连接池参数的修改生效,不得不重启Tomcat,这真是个噩梦。Tomcat学习笔记 - 【使用JNDI数据源】
            
    
    博客分类: Nginx/Tomcat/Jetty tomcatjndidbcp连接池 然而,在学习了Tomcat对JNDI数据源的支持后,这不在是一个问题了。

 

【一】. context.xml与JNDI数据源:

    <1>. 我们可以将JNDI数据源的配置放在Tomcat的/conf/context.xml文件中完成,Tomcat能够自动检测到context.xml文件内容的修改,并重新加载。Tomcat学习笔记 - 【使用JNDI数据源】
            
    
    博客分类: Nginx/Tomcat/Jetty tomcatjndidbcp连接池 关于JNDI:全称为Java命名与目录接口(Java Naming and Directory Interface)。 允许我们通过对象的“名称”来访问一个对象。Tomcat学习笔记 - 【使用JNDI数据源】
            
    
    博客分类: Nginx/Tomcat/Jetty tomcatjndidbcp连接池 

     <2>. Tomcat容器支持JNDI规范,默认使用tomcat-dbcp.jar依赖,context.xml文件的配置如下所示: 

  <?xml version='1.0' encoding='utf-8'?>
  <Context>
      <Resource name = "excelsoft-jndi-test" 
        auth = "Container" 
        type = "javax.sql.DataSource"
        driverClassName = "org.postgresql.Driver"
        url = "jdbc:postgresql://127.0.0.1:5432/jndi-test"
        username = "postgres" 
        password = "postgres" 
        maxActive = "200" 
        maxIdle = "30" 
        maxWait = "5000" 
      />
  </Context>

   [说明]

    1. 定义Resource的名称为excelsoft-jndi-test,可以定义多个<Resource>节点来连接多个数据库。Tomcat学习笔记 - 【使用JNDI数据源】
            
    
    博客分类: Nginx/Tomcat/Jetty tomcatjndidbcp连接池 

    2. driverClassName:指定jdbc驱动类,这里使用的是PostgreSQL数据库,需要将PostgreSQL的JDBC驱 动添加到Tomcat的/lib目录下面,本例中使用postgresql-9.3-1100.jdbc4.jar驱动程序。

    3. 连接池参数设置:Tomcat学习笔记 - 【使用JNDI数据源】
            
    
    博客分类: Nginx/Tomcat/Jetty tomcatjndidbcp连接池 

      maxActive:最大活动连接数,最多能创建的物理连接数。

      maxIdle:最大空闲连接数,多余的空闲连接将被回收。

      maxWait:最大等待时间,单位为ms。

 

【二】.web应用中的配置:

 在web应用的web.xml中添加如下内容Tomcat学习笔记 - 【使用JNDI数据源】
            
    
    博客分类: Nginx/Tomcat/Jetty tomcatjndidbcp连接池 

  <resource-ref>
      <description>jndi data source test</description>
      <res-ref-name>excelsoft-jndi-test</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>

 

【三】.使用JNDI数据源获取连接:可简单编写如下所示的工具类,仅供参考Tomcat学习笔记 - 【使用JNDI数据源】
            
    
    博客分类: Nginx/Tomcat/Jetty tomcatjndidbcp连接池 

/*
 * Copyright (c) 2014, Nick Xu, All rights reserved.
 */
package com.excelsoft.util;

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

/**
 * 功能简述: 一句话简述编写目的、主要功能等信息.
 * @author Nick Xu
 * @version 1.0
 */
public class DBConn {
    
    private static DataSource dataSource;
    
    static {
        try {
            Context context = new InitialContext();
            dataSource = (DataSource)context.lookup("java:comp/env/excelsoft-jndi-test");
        }
        catch (NamingException e) {
            // Exception handler
            e.printStackTrace();
        }
    }
    
    public static Connection getConn() {
        try {
            Connection conn = dataSource.getConnection();
            return conn;
        }
        catch (SQLException e) {
            // Exception handler
            e.printStackTrace();
        }
        return null;
    }
    
    public static void closeConn(Connection conn) {
        try {
            if(null != conn) {
                conn.close();
            }
        }
        catch (SQLException e) {
            // Exception handler
            e.printStackTrace();
        }
    }
}

   [说明]Tomcat学习笔记 - 【使用JNDI数据源】
            
    
    博客分类: Nginx/Tomcat/Jetty tomcatjndidbcp连接池 

    1. 定义上下文对象:

      Context context = new InitialContext();

    2. 获取JNDI数据源:

      DataSource dataSource = (DataSource)context.lookup("java:comp/env/excelsoft-jndi-test");

    3. 从数据源中获取逻辑连接:

      Connection conn = dataSource.getConnection();

    4. 关闭连接:归还给数据库连接池

      conn.close();

 

==================================

项目源码,参见附件!Tomcat学习笔记 - 【使用JNDI数据源】
            
    
    博客分类: Nginx/Tomcat/Jetty tomcatjndidbcp连接池 OK,暂告一段落!