[JBoss] JNDI与JBossNS

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/







 

posted @ 2013-06-19 19:43  jlins  阅读(287)  评论(0编辑  收藏  举报