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-安装目录\conf\server.xml 文件中有一个GlobalNamingResources 标签,在它下面配置 Resource 标签, 具体的配置项和在context.xml 中配置类似,这种全局配置应该使用的并不过吧...
JNDI的学习与使用的更多相关文章
- JNDI和JDBC的区别-个人理解
网上关于JNDI和JDBC的定义有很多,但是都很官方不容易理解,下面是我最近查阅资料得出的心得体会.希望对你在理解上有一点点的帮助,说的不对的请指正哦. JDBC: 看到最多的就是 Java Data ...
- JSP/Servlet开发——第五章 使用分层实现业务处理
1.JNDI(Java Naming and Directory Interface)Java命名和目录接口: ●JNDI:是一个有关应用序设计的 API 为开发人员提供了查找和访问各种命名和目录服务 ...
- Java安全之Fastjson反序列化漏洞分析
Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...
- Java学习笔记之JNDI(六)
JNDI 是什么 JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的 ...
- J2EE学习从菜鸟变大鸟之四 JNDI(Java Naming and Directory Interface)
掌握 J2EE 是件不是很轻松的事哈,但是很有意思,抽象抽象哈哈,因为它包含的技术和缩略语在不断地增长.Java 命名和目录接口(Java Naming and Directory Interface ...
- 软件架构设计学习总结(15):远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
总结这些概念都是易混淆,最基本概念定义复习和深入理解,同时也是架构师必备课程 RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请 ...
- 036.[转] JNDI 学习
使用外置服务器(如tomcat)时,如果一个服务器启动多个项目,可以使用JNDI配置数据源,这样每个项目都可以获取到Tomcat 配置的 JNDI的数据源. 在学习 jsp 的时候,作用域对象 pag ...
- 学习JNDI
既然datasource对象有tomcat提供,那么我们如何在应用程序中获得它呢,tomcat把这个对象放在JNDI服务中, 并用一个名字把它关联起来,我们在应用程序中,只需通过JNDI搜索这个名字, ...
- JNDI学习总结(一)——JNDI数据源的配置
一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数据库驱动类");) ②连接数据库(Connec ...
随机推荐
- 解决:编辑一条彩信,附件选择添加音频,返回到编辑界面选择play,不能播放,没有声音
[操作步骤]:编辑一条彩信,附件选择添加音频(外部音频),返回到编辑界面选择play,菜单键选择view slideshow [测试结果]:不能播放,没有声音 [预期结果]:可以播放 根据以往的经验( ...
- ACCESS删除datagridview和数据库中的一条数据,同时更新显示的方法源码
//删除,行删除 private void 删除_Click(object sender, EventArgs e) { int dgrcount = dataGridView1.SelectedRo ...
- SecureCRT来上传和下载文件
引用:https://www.cnblogs.com/zhengyihan1216/p/6260667.html Linux--用SecureCRT来上传和下载文件 SecureCRT下的文件传输协议 ...
- Stack Overflow 2016年度 20个最佳Python问题(一)
Stack Overflow 2016年度 20个最佳Python问题(一) https://zhuanlan.zhihu.com/p/25020763
- liunx系统和其它的基本命令
1.su 更换用户 2.sudo 管理员权限 3.PATH 4.sudo shutdown -h now 现在关机 sudo shutdown -r now 现在重启 5.kill ...
- Unity插件-NGUI使用教程
Unity插件-NGUI使用教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 NGUI 一款强大的次 ...
- explain结果字段说明
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优 ...
- HPU 第三次积分赛:阶乘之和(水题)
阶乘之和 描述 对于整数pp,给出以下定义 p=x_{1}!+x_{2}!+x_{3}!+...+x_{q}!(x_{i}<x_{j}for\ all\ i<j )p=x1!+x2!+ ...
- HPU :字符串的统计
字符串的统计 时间限制: 2 Sec 内存限制: 128 MB提交: 15 解决: 1 题目描述 给定n个字符串,我想知道第i个字符串已经出现多少次? 输入 第一行输入一个整数t,代表t(t < ...
- poj2387 最短路
题意:给出一堆双向路,求从N点到1点的最短路径,最裸的最短路径,建完边之后直接跑dij或者spfa就行 dij: #include<stdio.h> #include<string. ...