JAVA菜鸟成长记——JNDI

2024-08-26 16:08
文章标签 java 成长 菜鸟 jndi

本文主要是介绍JAVA菜鸟成长记——JNDI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   

   JNDI简介


   JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统


接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API


映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。这些官方的话


想我这样的java菜鸟是理解不了的,那么下面我就给大家简单的明了的说一下;


   如果我们想弄明白JNDI是什么,我们必须明白两个关键词:“命名服务”“目录服务”;下面就刘结合生活费


中的例子和给大家介绍一下两个关键词:


   关于命名服务,其实我们很多时候都在用它,但是并不知道它是它,比较典型的是域名服务器DNS(Domain 


Naming Service),大对人对DNS还是比较了解的,它是将域名映射到IP地址的服务.比如百度的域名www.baidu.com所


映射的IP地址是http://202.108.22.5/,你在浏览器中输入两个内容是到的同一个页面.用命名服务器的原因是因为我


们记忆baidu这几个有意义的字母要比记202.108.22.5更容易记忆,但如果站到计算机的角度上,它更喜欢处理这些数


字。

   从我们生活中找的话还有很多类似的例子,比如说你的身份证号和你的名字可以"理解"成一种命名服务,你的学


号和姓名也可以"解释"为一种命名服务。


可以看出命名服务的特点:一个值和另一个值的映射,将我们人类更容易认识的值同计算机更容易认识的值进行一一映


射。


   从我们日常生活中去理解目录服务的概念可以从电话簿说起,电话簿本身就是一个比较典型的目录服务,如果你


要找到某个人的电话号码,你需要从电话簿里找到这个人的名称,然后再看其电话号码。


   理解了命名服务和目录服务再回过头来看JDNI,它是一个为Java应用程序提供命名服务的应用程序接口,为我们


提供了查找和访问各种命名和目录服务的通用统一的接口.通过JNDI统一接口我们可以来访问各种不同类型的服务.如


下图所示,我们可以通过JNDI API来访问刚才谈到的DNS



   之前我们如果想要访问MySql数据库或者是SQL数据库的时候,我们需要将一个对MySQL驱动程序类的引用进行了


编码,并通过使用适当的JDBC URL连接到数据库;像下面的代码;

Connection conn=null;  
try {  
Class.forName("com.mysql.jdbc.Driver",  
true, Thread.currentThread().getContextClassLoader());  
conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");  
/* 使用conn并进行SQL操作 */ 
......  
conn.close();  
}   
catch(Exception e) {  
e.printStackTrace();  
}   
finally {  
if(conn!=null) {  
try {  
conn.close();  
} catch(SQLException e) {}  
}  
} 

   这是传统的做法,也是之前我们常用的做法,这种做法一般在小规模的开发过程中不会产生问题。但是这样做还是


会存在比较多的问题;

   1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;

   2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;

   3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;


   对于程序员开发中面临的这些问题,我们应该如何来解决?


   作为开发的程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC url格式是什么?


访问数控的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对JDBC的引用,没有服务器名称,没


有用户名和口令,甚至没有对数据库池和连接管理,而这些问题都较为J2EE的容器来配置和管理,因此,就有了我们


的JNDI.


   当我们有了JNDI以后,我们首先在j2ee的容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这


个数据源引用参数,给这个数据源设置一个名称,然后在程序中,通过数据源名称引用数据源从而访问后台数据库。


   1、配置数据源


   在JBoss的 D:/jboss420GA/docs/examples/jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其


中的 mysql-ds.xml 文件Copy到你使用的服务器下,如 D:/jboss420GA/server/default/deploy。


修改 mysql-ds.xml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,如下:


修改 mysql-ds.xml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,如下:
<?xml version="1.0" encoding="UTF-8"?> 
<datasources> 
<local-tx-datasource> 
<jndi-name>MySqlDS</jndi-name> 
<connection-url>jdbc:mysql://localhost:3306/lw</connection-url> 
<driver-class>com.mysql.jdbc.Driver</driver-class> 
<user-name>root</user-name> 
<password>rootpassword</password> 
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> 
<metadata> 
<type-mapping>mySQL</type-mapping> 
</metadata> 
</local-tx-datasource> 
</datasources> 

   这里,定义了一个名为MySqlDS的数据源,其参数包括JDBC的URL,驱动类名,用户名及密码等。


  2、在程序中引用数据源

Connection conn=null;  
try {  
Context ctx=new InitialContext();  
Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用数据源  
DataSource ds=(Datasource)datasourceRef;  
conn=ds.getConnection();  
/* 使用conn进行数据库SQL操作 */ 
......  
c.close();  
}   
catch(Exception e) {  
e.printStackTrace();  
}   
finally {  
if(conn!=null) {  
try {  
conn.close();  
} catch(SQLException e) { }  
}  
}
   

   直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几,但是现在的程序可以不用关心具体JDBC参数


了。在系统部署后,如果数据库的相关参数变更,只需要重新配置 mysql-ds.xml 修改其中的JDBC参数,只要保证数


据源的名称不变,那么程序源代码就无需修改。

由此可见,JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。


   小结

   J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是“交换机” —— 


J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充


当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展


(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接


层,这样组件就可以发现所需要的资源,而不用了解这些间接性。在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起


的粘合剂,JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺,而


且经过一些计划和预先考虑,这个承诺是完全可以实现的。


这篇关于JAVA菜鸟成长记——JNDI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109042

相关文章

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

SpringBoot整合easy-es的详细过程

《SpringBoot整合easy-es的详细过程》本文介绍了EasyES,一个基于Elasticsearch的ORM框架,旨在简化开发流程并提高效率,EasyES支持SpringBoot框架,并提供... 目录一、easy-es简介二、实现基于Spring Boot框架的应用程序代码1.添加相关依赖2.添

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在