zoukankan      html  css  js  c++  java
  • [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:jboss420GAdocsexamplesjca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 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/







  • 相关阅读:
    微服务架构总结
    微服务-网关服务
    HttpClient-RestTemplate-Feign
    RPC和REST
    Springmvc的拦截器执行顺序及各方法作用
    秒杀系统优化方案(下)吐血整理
    秒杀系统优化方案(上)吐血整理
    分布式session的管理
    缓存设计——缓存和数据库的数据一致性
    个人理解的javascript作用域链与闭包
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3144786.html
Copyright © 2011-2022 走看看