zoukankan      html  css  js  c++  java
  • JNDI的学习与使用

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

    我们一般是在数据源这块使用JNDI,有些服务器(例如Tomcat)中自带数据库连接池,我们可以通过JNDI服务去这个连接池中找到对应的数据源Connection。所以我的一个比较狭隘的理解是:服务器在初始化Connection之后,就会放在默认的连接池中,因为可能会有多个数据源,所以就需要有一个名称去对应,而JNDI正是去做这项工作。

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

    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区分。

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

    测试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的名称写法,是有要求的

    JNDI配置(全局配置)

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

  • 相关阅读:
    Oracle——内置函数介绍(日期函数)
    Oracle——内置函数介绍(数学函数)
    Oracle——内置函数介绍(字符串函数)
    css9——复合选择器(后代选择器,子选择器,并集选择器,链接伪类选择器,:focus伪类选择器)
    ASP.NET Core 如何使用Mvc相关技术建立Controller、Tag Helper (上)
    ASP.NET Core 包管理工具(4)
    ASP.NET Core3.x (3)
    ASP.NET Core3.x 基础—注册服务(2)
    ASP.NET Core3.x 基础(1)
    C#基础之接口(6)
  • 原文地址:https://www.cnblogs.com/lz2017/p/10323399.html
Copyright © 2011-2022 走看看