博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JNDI的学习与使用
阅读量:5312 次
发布时间:2019-06-14

本文共 2818 字,大约阅读时间需要 9 分钟。

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

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

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

JNDI配置(局部配置)

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

如果有多个数据源的需求,配置多个Resource 标签即可,根据name区分。

在未使用其他数据库连接池的情况下,会默认使用Servlet容器自带的数据源(Tomcat自带的是DBCP数据源,毕竟是Apache一家的产品,可以在Tomcat-安装目录/lib 下找到这个jar),但是需要注意的是Tomcat版本之间有些许差异:Tomcat7使用的是DBCP,Tomcat8及以上版本使用的是DBCP2,这两个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);    }}
JNDITest
JNDITest
JNDITest
/JNDITest

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

JNDI配置(全局配置)

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

 

转载于:https://www.cnblogs.com/lz2017/p/10323399.html

你可能感兴趣的文章
2019.02.15 bzoj5210: 最大连通子块和(链分治+ddp)
查看>>
redis cluster 集群资料
查看>>
Junit使用教程(一)
查看>>
Python接口测试-使用requests模块发送post请求
查看>>
混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
查看>>
jQuery总结或者锋利的jQuery笔记二
查看>>
前后端协作--服务器渲染与前后端分离
查看>>
微软职位内部推荐-Sr. SE - Office incubation
查看>>
微软职位内部推荐-SOFTWARE ENGINEER II
查看>>
GDB调试
查看>>
centos系统python2.7更新到3.5
查看>>
一个通用的单元测试框架的思考和设计09-实现篇-视图操作
查看>>
互联网移动业务服务端系统架构设计演化
查看>>
【Quartz】常用方法的使用方式(三)
查看>>
MVVM模式下关闭窗口的实现
查看>>
背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件...
查看>>
SqlServer 更改复制代理配置文件参数及两种冲突策略设置
查看>>
美妆算法---人脸审美标准
查看>>
C#区域截图——调用API截图
查看>>
c#与java中byte字节的区别及转换方法
查看>>