jndi(是什么)和ejb容器的关系

时间:2022-04-25 13:02:35
如下: 转载了几篇关于ejb jndi的文章!转载: http://blog.csdn.net/zhaosg198312/article/details/3979435 JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。JNDI的扩展:JNDI在满足了数据源配置的要求的基础上,还进一步扩充了作用:所有与系统外部的资源的引用,都可以通过JNDI定义和引用。所以,在J2EE规范中,J2EE 中的资源并不局限于 JDBC 数据源。引用的类型有很多,其中包括资源引用(已经讨论过)、环境实体和 EJB 引用。特别是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一项关键角色:查找其他应用程序组件。……2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起的粘合剂,JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺,而且经过一些计划和预先考虑,这个承诺是完全可以实现的。可以简单的把JNDI理解为一种将对象和名字绑定的技术,JBoss容器负责生产出对象,这些对象都有唯一的名字绑定,外部程序可以通过名字来获得对象的引用。所以换句话说,JNDI是Sun公司提供的一种标准的Java命名系统接口。





JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识。
那么,JNDI到底起什么作用?

要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个问题来探讨。

没有JNDI的做法:
程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 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) {}
}
}

这是传统的做法,也是以前非Java程序员(如Delphi、VB等)常见的做法。这种做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和MySQL,可以很快开发出相应的应用程序。

没有JNDI的做法存在的问题:
1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;
2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;
3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;
4、……

解决办法:
程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。

由此,就有了JNDI。

用了JNDI之后的做法:
首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。
具体操作如下(以JBoss为例):
1、配置数据源
在JBoss的 D:/jboss420GA/docs/examples/jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下,如 D:/jboss420GA/server/default/deploy。
修改 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避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。

JNDI的扩展:
JNDI在满足了数据源配置的要求的基础上,还进一步扩充了作用:所有与系统外部的资源的引用,都可以通过JNDI定义和引用。

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

EJB 的 JNDI 引用非常类似于 JDBC 资源的引用。在服务趋于转换的环境中,这是一种很有效的方法。可以对应用程序架构中所得到的所有组件进行这类配置管理,从 EJB 组件到 JMS 队列和主题,再到简单配置字符串或其他对象,这可以降低随时间的推移服务变更所产生的维护成本,同时还可以简化部署,减少集成工作。 外部资源”。


总结:
J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。

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





转载: http://blog.csdn.net/gaoying_blogs/article/details/41515743

   EJB是Enterprice Java Beans的简称,即企业Java组件,是一个用于分布式业务应用标准服务端组件模型(这里强调是服务端组件模型,后面我们将会说一下为什么是服务端而不是客户端),是一组用java语言编写的包含字段和方法的代码体,而这些代码的核心任务就是实现纯粹的业务逻辑。


    采用Enterprice java Beans架构编写的应用是可伸的、事务性的、多用户安全的,可以一次编写这些应用,然后部署在任何支持Enterprice Java Beans规范的服务器平台,如JBoss、Weblogic等。


    容器知多少?EJB容器呢?

    EJB要在EJB容器中运行,运行时环境由容器建立,当完成EJB的开发后,需要将EJB组件部署到EJB容器中,只有正确部署后,EJB容器才能向客户提供业务服务。在这里想说一下容器,我们可以这么理解容器,容器只是一种概念,容器可以管理对象的生命周期,对象与对象之间的依赖关系。可以使用配置文件(通常是xml)然后定义好对象的名称、如何产生等,在启动容器之后,所有的对象都可以直接被取用(如果不用容器就需要编写一段相应的代码来产生对象或建立与对象之间的依赖关系等)。也就是原来不用容器前,都是需要自行编写程序以管理对象;应用了容器之后都会自动帮忙做好,就节省了再编写程序管理对象的环节。常用的容器有WebLogic、Tomcat等


    在EJB中,JBoss是一个开源的J2EE应用服务器,可以在该容器下部署和运行EJB组件。每个J2EE应用服务器都包含EJB容器和Web容器,所以既可以运行EJB,也可以运行Web应用(而Tomcat目前只是Web容器,它不能运行EJB应用)早期的JBoss版本只包含EJB容器,而不包含Servlet容器,因此需要把JBoss与Tomcat集成,二者协同工作,才能构成完整的JEE应用服务器。新版本的JBoss同时提供了Servlet容器和EJB容器,因此既能运行JavaWeb应用,又能运行EJB组件。


   EJB的分类

    EJB定义了三种企业Bean,分别是Session Bean(会话Bean)、Entity Bean(实体Bean)、MessageDriven Bean(消息驱动Bean),下面我们就来一一认识一下这三种Bean.


    1、首先Session Bean

    Session Bean实现会话中的业务逻辑。它分为有状态Bean和无状态Bean,每当客户端发出EJB调用请求时,容器就会选择一个Session Bean来为客户端服务,Session Bean可以直接访问数据库,但更多的时候,它是通过Entity Bean实现数据访问。


    2、其次Entity Bean

    Entity Bean实现一个业务实体。Entity Bean代表真实物体的数据,在EJB3.0中(后面我们会专门拿出一篇文章来介绍EJB3.0),Entity Bean仅作为普通的Java对象来使用,它负责跟数据库表进行对象与关系映射(O/R Mapping)


    3、最后MessageDriven Bean
    MessageDriven Bean作为JMS(Java Message Service)Java消息服务的API的监听者,异步处理其中的消息。MessageDriven Bean是用来专门处理基础消息请求的组件,能够轻松的与其他EJB交互。它特别适合用于当一个业务执行的时间很长,而执行结果无需实时向用户反馈的这样一种场合。


    介绍完基本的EJB方面的知识,下面我想说一下JNDI。其实上网查找了好多关于EJB方面的资料,很多资料很顺便的介绍JNDI,弄的我也是云里雾里,所以很有必要把JNDI好好扒一扒,限于篇幅的原因,下篇文章,我们就来好好扒一扒何为JNDI,敬请期待!有什么困惑有什么不足的地方,非常欢迎您在下方留言,和我沟通,谢谢!


转载: http://blog.csdn.net/gaoying_blogs/article/details/41516525

   上篇文章我们宏观的介绍了一下何为EJB,在上篇文章的结尾我为大家埋下了一个伏笔,就是何为JDNI呢?在很多关于EJB的资料中介绍了JNDI,但是弄得我也是云里雾里的,所以我们借着今天这篇文章,就来好好扒一扒什么是JNDI。


    JNDI知多少?

    EJB对象由容器(JBoss)提供,因此不能在程序中使用创建实例的方法来生成EJB对象,而需要采用Java的JNDI(Java Naming and Directory Interface),即Java的命名和目录接口来获得EJB对象的引用。可以简单的把JNDI理解为一种将对象和名字绑定的技术,JBoss容器负责生产出对象,这些对象都有唯一的名字绑定,外部程序可以通过名字来获得对象的引用。所以换句话说,JNDI是Sun公司提供的一种标准的Java命名系统接口。


     jndi(是什么)和ejb容器的关系

    在结构上,JNDI由两部分组成:即API和SPI(Service Provider Intergace,服务提供商接口)。JNDI提供统一的客户端API,应用程序通过客户API访问命名和目录服务(目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性);服务提供商接口SPI用于供厂商创建命名和目录服务的JNDI实现。


    JNDI的架构和JDBC的架构非常类似,所以网上有一系列关于JNDI和JDBC区别的文章,有兴趣的可以自己去查阅。


    对于EJB开发者来说,我们只需要知道使用客户API如何访问命名和目录服务即可,而不需要知道SPI的使用,因为我们不需要使用SPI开发JNDI实现产品。就好比我们通过JDBC访问数据库,我们只需要知道使用JDBC API如何访问数据库,而不需要知道数据库的JDBC驱动如何实现,只知道我们要实现的就可以了,而不需要了解内部的处理调用流程、原理。


    J2EE规范要求所有的J2EE容器都要提供JNDI规范的实现,JNDI在J2EE中的角色就是“交互机”,就是J2EE组件在运行时间间接的查找其他组件、资源或服务的通用机制,也就是说JNDI在J2EE应用程序中提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。这样就暗合了上段中我们所提到的,对于EJB开发者而言只需要知道使用客户API如何访问命名和目录服务即可,而不需要知道SPI的使用。


    好了,JNDI的介绍就这么多,如果您有更好的想法欢迎您在下方留言,谢谢!