JAVA菜鸟成长记——JNDI

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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


20160115112456699.png

之前我们如果想要访问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 的承诺,而且经过一些计划和预先考虑,这个承诺是完全可以实现的。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
Java API 应用服务中间件
Java一分钟之-JNDI:Java命名和目录接口
【6月更文挑战第3天】JNDI,Java Naming and Directory Interface,是Java的API,用于访问命名和目录服务。本文聚焦JNDI常见问题和易错点:1) 初始化Context时需正确配置环境属性;2) 查找资源时确保名称与服务器配置一致;3) 别忘了导入JNDI库和妥善处理异常;4) 使用后记得关闭资源。理解JNDI并避免这些问题能提升应用的可维护性和灵活性。
221 2
|
网络协议 Java 数据库连接
了解JNDI:Java中的命名和目录服务接口
了解JNDI:Java中的命名和目录服务接口
459 1
|
存储 Java 数据库连接
RMI AND CORBA简介——java菜鸟成长记
RMI AND CORBA简介——java菜鸟成长记
197 0
RMI AND CORBA简介——java菜鸟成长记
|
XML Java 开发工具
java入门学习总结——【java菜鸟成长记】
java入门学习总结——【java菜鸟成长记】
152 0
java入门学习总结——【java菜鸟成长记】
|
Java 编译器 C++
编码 GBK 的不可映射字符——【java菜鸟成长记】
编码 GBK 的不可映射字符——【java菜鸟成长记】
216 0
编码 GBK 的不可映射字符——【java菜鸟成长记】
|
弹性计算 运维 前端开发
一位java菜鸟对阿里云ecs使用的体验
我是一名刚学习java的大学生,在武汉华科的生信专业学习,在做毕设项目《电子病历》中需要将java项目部署到linux服务器上供web前端和微信小程序调用,但是自己对linux的操作不是很熟悉,于是就去搜相关教程,逐渐了解到云服务的概念和好处,在与一些学长交流之后觉得阿里云飞天计划对大学生有很大的优惠和帮助,于是就开始了第一次的上云操作。
一位java菜鸟对阿里云ecs使用的体验
|
XML 消息中间件 开发框架
J2EE的常用十三规范——java菜鸟成长记
J2EE的常用十三规范——java菜鸟成长记
125 0
|
安全 Java 容器
Java集合从菜鸟到大牛演变
1、集合接口 java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。声明了适用于JAVA集合(只包括Set和List)的通用方法。Set 和List 都继承了Conllection,Map没有.
116 0
Java集合从菜鸟到大牛演变
|
设计模式 缓存 分布式计算
JAVA 从菜鸟成长为大牛的必经之路
在程序界流行着一种默认的说法叫“黄金5年”,也就是一个程序员从入职的时候算起,前五年的选择直接影响着整个职业生涯中的职业发展方向和薪资走向,如何走好这5年,彻底从一个刚入行的菜鸟蜕变成可以以不变应万变的职业大牛,这是一个涉及到自身专业知识储备和选择的大难题,那么,这五年里,一个Java程序员如何做才能完成从入行到大牛的晋升之路呢? 参加工作0-1年之间,Java程序员必须要做得事儿
176 0
|
Java Spring 算法
【面小易-面经08】菜鸟网络Java研发工程师面试经验(社招)
7月9日 19:00-21:30 阿里云开发者社区首场“Offer 5000”直播开启!15位团队技术大牛在线招人,更有《阿里云技术面试红宝书》助你拿下Offer!马上投递简历:https://developer.aliyun.com/special/offerday01
8562 0