JNDI的作用

JNDI是 Java 命名与目录接口(Java Naming and Directory Interface)。

随着分布式应用的发展,远程访问对象访问成为常用的方法。虽然说通过Socket等编程手段仍然可实现远程通信,但按照模式的理论来说,仍是有其局限性的。RMI技术,RMI-IIOP技术的产生,使远程对象的查找成为了技术焦点。JNDI技术就应运而生。JNDI技术产生后,就可方便的查找远程或是本地对象

可以认为就是我给你一个字符串,你就给出对应字符串所对应的对象。

如果没有JNDI

例如要想通过JDBC访问数据库:

    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.close();  } catch(Exception e) {  e.printStackTrace();  } finally {  if(conn!=null) {  try {  conn.close();  } catch(SQLException e) {}  }  }  

没有JNDI的做法存在的问题:

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

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

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

4、......

有了JNDI之后

首先,在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;

然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。

具体操作如下(以JBoss为例):

1、配置数据源

在JBoss 的 D:\jboss420GA\docs\examples\jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下。

修改 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>  

2、在程序中引用数据源:

通过Context.lookup()方法找到数据源

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

在J2EE规范中,J2EE 中的资源并不局限于 JDBC 数据源。引用的类型有很多,其中包括资源引用(已经讨论过)、环境实体和 EJB 引用。特别是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一项关键角色: 查找其他应用程序组件

J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时 间接地 查找其他组件、资源或服务的通用机制。

在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。

在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起的粘合剂,JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺,而且经过一些计划和预先考虑,这个承诺是完全可以实现的。

JBossNS

JBossNS是JBoss的名称服务器,每个应用服务器把bean绑定到应用服务器自主选择的命名上下文中。

例如部署一个EAR文件,JBoss会将该bean绑定在与EAR文件名相关的环境中。

通过JMX-console,jboss --> service=JNDIView,单击list操作的invoke按钮,即可查看绑定在JNDI中的内容:

如果JNDI绑定的是个bean,则会显示该bean的继承层次。

在默认情况下,会话Bean将绑定JNDI为"EJB/remote"为远程接口和"EJB/local"为本地接口,当EJB部署在一个ear文件中,默认的jndi绑定将会与ear文件相关联。

缺省绑定  缺省情况下,会话 Bean 的 JNDI 绑定名称是:

  • local接口:<ejbName>/local
  • remote接口:<ejbName>/remote

当 EJB 被部署到某个 ear 中后,缺省绑定名称中会以 ear 包的名称作为前缀。比如,ear 文件是 test.ear 时,EJB 的绑定名称是:

  • local接口:test/<ejbName>/local
  • remote接口:test/<ejbName>/remote

可以在bean中通过@LocalBinding指定该类的JNDI名称:

@Stateless
@Remote(XXService.class)
@RemoteBinding(jndiBinding = "com....bean")
@Local(XXServiceLocal.class)
@LocalBinding(jndiBinding = "com....bean")
@TransactionRetry
public class XXServiceBean 。。。

http://docs.oracle.com/javase/jndi/tutorial/

[JBoss] JNDI与JBossNS相关推荐

  1. Exposing/Accessing JBoss JNDI Objects/Datasources From an External JVM

    今天要评估改造一个实时信息发送平台的工作量,原来的系统里用到了JNP,在调研时,发现了这篇不错的文章. 原文地址:http://www.engfers.com/2008/08/07/exposing_ ...

  2. jboss jndi服务

    http://www.builder.com.cn/2007/1217/684114.shtml

  3. 研究项目: JBoss架构分析

    原文转自:http://www.huihoo.org/jboss/jboss.cn.html 研究项目: JBoss架构分析 Jenny Liu School of Information Techn ...

  4. JBoss技术支持文档

    1.本节内容简介 本章主要介绍JBOSS(免费的 EJB服务器),以及教会大家如何安装Jboss,建立你第一个EJB和客户端.关于什么是EJB,以及如何开发等.这些关于EJB方面有很多书籍进行描 述, ...

  5. java jstack dump 线程 介绍 解释

    最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据.  前段时间因为系统代码问题,造成性能到了天花板,于是就dump了一份stack出来进行分析 ...

  6. spring源码分析之spring-web remoting模块概况及基本概念

    spring-web总体分为三部分:caucho.httpinvoker.jaxws,其总体构造图如下: uml结构: 先看看网上搜索到的上述实现的原理吧:Spring RMI,Hessian/Bur ...

  7. (转)性能分析之-- JAVA Thread Dump 分析综述

    原文链接:http://blog.csdn.net/rachel_luo/article/details/8920596 最近在做性能测试,需要对线程堆栈进行分析,在网上收集了一些资料,学习完后,将相 ...

  8. jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

    转载自  jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 1.Jstack  1.1   jstack能得到运行java程序的java stack和native stack ...

  9. Java 7:HashMap与ConcurrentHashMap

    从我过去有关性能的文章和HashMap案例研究中可能已经看到,Java线程安全性问题可以很轻松地使Java EE应用程序和Java EE容器崩溃. 在对Java EE性能问题进行故障排除时,我观察到的 ...

最新文章

  1. java 网络通信协议_JAVA-基础-网络通信协议
  2. selector是在文件夹drawable中进行定义的xml文件转载 https://www.cnblogs.com/fx2008/p/3157040.html...
  3. 最新wingide6破解方法(支持Linux),亲测有效,支持python3.0
  4. GoogleAppEngine是什么?
  5. 深度学习需要注意的11个方面
  6. Spark源码分析之Sort-Based Shuffle读写流程
  7. 修改pip install镜像源
  8. 解析腾讯企业邮箱到自己域名,设置mail的cname
  9. cisco交换机配置方法
  10. python爬取网站视频保存到本地
  11. 物联网设备OTA软件升级之:升级包下载过程之旅
  12. 这2个PDF转Word免费不限页数工具很多人没用过
  13. 苹果开放降级_iPhone 突然开放降级...
  14. Android 仿美团选择城市、微信通讯录、饿了么点餐列表的导航悬停分组索引列表
  15. Html 所有触发事件
  16. 三重邪骨手机版怎么登录服务器未响应,三重邪骨手机版-三重邪骨模拟器预约v1.0-k73游戏之家...
  17. tensorflow安装之 nvidia官网下载cuda速度太慢!!!!! 还有 TensorFlow下载速度太慢
  18. 机器学习的数学基础 矩阵论与概率论
  19. 2021寒假MISC打卡DAY13
  20. uni-app离线打包APK教程

热门文章

  1. 一脸懵逼的算法系列之汉诺塔
  2. php连接数据库(一)
  3. 在编程的路上遇见另一个自己
  4. C# 、.NET、ASP.NET MVC积累
  5. Android 选项菜单
  6. B树、B-树、B+树、B*树都是什么
  7. vulkan 利用GPU加速ENet
  8. Underfull hbox (badness 10000) in paragraph at lines 83--86
  9. 【Oracle】基础知识查漏补缺
  10. 序列化和反序列化(json和pickle)day18