JNDI的学习与使用

JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得咱们能够用名称访问对象。这是比较专业的解释。html

咱们通常是在数据源这块使用JNDI,有些服务器(例如Tomcat)中自带数据库链接池,咱们能够经过JNDI服务去这个链接池中找到对应的数据源Connection。因此个人一个比较狭隘的理解是:服务器在初始化Connection以后,就会放在默认的链接池中,由于可能会有多个数据源,因此就须要有一个名称去对应,而JNDI正是去作这项工做。java

须要理解的是JNDI与JDBC相似,都是制定了一套标准,而不是具体的实现。sql

JNDI配置(局部配置)

局部配置只针对当前项目有效。在项目的META-INF 下创建context.xml (这是固定名称) 。在这个XML中配置数据库链接的四大参数,链接池的配置(不指定具体配置也会有默认值),JNDI的名称等属性数据库

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!--
    - name:表示之后要查找的名称。经过此名称能够找到DataSource,此名称任意更换,可是程序中最终要查找的就是此名称,为了避免与其余的名称混淆,因此使用jdbc/oracle,如今配置的是一个jdbc的关于oracle的命名服务。
    - auth:由容器进行受权及管理,指的用户名和密码是否能够在容器上生效
    - type:此名称所表明的类型,如今为javax.sql.DataSource
    - maxActive:表示一个数据库在此服务器上所能打开的最大链接数 Tomcat8.0及以上版本使用maxTotal
    - maxIdle:表示一个数据库在此服务器上维持的最大空闲链接
    - maxWait:最大等待时间。10000毫秒 设置为-1表示无限等待 Tomcat8.0及以上版本使用DBCP2 部署这些服务器须要使用maxWaitMillis
    - username:数据库链接的用户名
    - password:数据库链接的密码
    - driverClassName:数据库链接的驱动程序
    - url:数据库链接的地址
    - initialSize:初始化链接数
-->
    <Resource name="jndi/oracle"
              auth="Container"
              type="javax.sql.DataSource"
              driverClassName="oracle.jdbc.driver.OracleDriver"
              url="jdbc:oracle:thin:@localhost:1521:Orcl"
              username="scott"
              password="tiger"
              maxActive="20"
              maxIdle="5"
              maxWait="10000"
              initialSize="10"/>
</Context>

若是有多个数据源的需求,配置多个Resource 标签便可,根据name区分。apache

在未使用其余数据库链接池的状况下,会默认使用Servlet容器自带的数据源(Tomcat自带的是DBCP数据源,毕竟是Apache一家的产品,能够在Tomcat-安装目录/lib 下找到这个jar),可是须要注意的是Tomcat版本之间有些许差别:Tomcat7使用的是DBCP,Tomcat8及以上版本使用的是DBCP2,这两个DBCP的一些链接池配置项名称有些许不一样,须要使用对应的名称,不然该项的自定义配置不会生效,而是使用默认配置。DBCP所有的配置能够看这里: DBCP官方文档tomcat

测试JNDI是否生效

这里使用Servlet只是为了方便测试(由于JDNI须要依赖Servlet容器,而且容器须要开启),最主要的操做就是经过JNDI得到Connection服务器

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class JNDITest extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Context ctx;
        DataSource ds = null;
        try {
            ctx = new InitialContext();
            //java:comp/env/ 是固定写法 后面的名字是在context.xml中配置的
            ds = (DataSource) ctx.lookup("java:comp/env/jndi/oracle");
            Connection conn = null;
            try {
                conn = ds.getConnection();
                System.out.println(conn.getClass());
                System.out.println(conn.isClosed());
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
 <servlet>
    <servlet-name>JNDITest</servlet-name>
    <servlet-class>JNDITest</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>JNDITest</servlet-name>
    <url-pattern>/JNDITest</url-pattern>
</servlet-mapping>

Servlet的配置没什么可说的,主要在乎的使用 javax.naming.Context 并根据JNDI名lookup一个DataSource,还有就是注意这个JNDI的名称写法,是有要求的oracle

JNDI配置(全局配置)

全局配置是配置在Tomcat的配置上的,全部部署在这台Tocmat上的项目,在未使用其余数据库链接池的状况下,会默认使用这个配置。在tomcat-安装目录\conf\server.xml 文件中有一个GlobalNamingResources 标签,在它下面配置 Resource 标签, 具体的配置项和在context.xml 中配置相似,这种全局配置应该使用的并不过吧...app

相关文章
相关标签/搜索