zoukankan      html  css  js  c++  java
  • JNDI 配置:JBoss + MySQL

    一、JNDI 名词解释

        JNDI 是Java 命名和目录接口(Java Naming and Directory Interface,JNDI)的简称.从一开始就一直是 Java 2 平台企业版(JEE)的核心技术之一。在JMS,JMail,JDBC,EJB等技术中,就大量应用的这种技术。

    命名服务:它提供了为给定的数据集创建一个标准名字的能力。它允许把名称同Java对象或资源关联起来,而不必指出对象或资源的物理ID。基本的名字操作包含在Context接口中。

    目录服务:目录服务是一种特殊类型的数据库,与SQL Server、Access、Oracle等关系数据库管理系统相反,构造目录服务的目的是为了处理基于行为的事务,并且使用一种关系信息模型。基本的目录服务操作包含在DirContext接口中。

    JNDI 的架构与实现
     
    JNDI 的服务提供者

        一个服务提供者就是一组Java类的集合,它支持开发者同目录服务进行通信,其方式类似于JDBC驱动程序与数据库之间的通信方式。能够用于JNDI的服务提供者必须实现Context接口或Context的扩展接口Directory- Context。

        在使用JNDI时,读者只需要了解JNDI,而服务提供者才关注实际的网络协议、编码/解码值等细节。

        当下载SDK软件开发包时,同时就下载了Sun公司的一些现有的服务提供者。这些服务提供者包括LDAP、NIS、COS(CORBA对象服务)、RMI注册及文件系统的提供者。如:hashtableObj.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.ldapCtx- Fatory")就是表示使用Sun LDAP服务提供者。当然如果要使用IBM服务提供者时就可以用com.ibm.jndi.LDAPCtxFatory来代替com.sun.jndi.ldap.ldapCtxFatory。

    JNDI 的包

    JNDI 包含5个包

        ·    javax.naming:主要用于命名操作,它包含了命名服务的类和接口,该包定义了Context接口和InitialContext类;

        ·    javax.naming.directory:主要用于目录操作,它定义了DirContext接口和InitialDir- Context类;

        ·    javax.naming.event:在命名目录服务器中请求事件通知;

        ·    javax.naming.ldap:提供LDAP支持;

        ·    javax.naming.spi:允许动态插入不同实现,为不同命名目录服务供应商的开发人员提供开发和实现的途径,以便应用程序通过JNDI可以访问相关服务。

    常用的 JNDI 操作

    常用的JNDI操作如下:

     void bind(String sName,Object object),绑定:把名称同对象关联的过程。
    
     void rebind(String sName,Object object),重新绑定:用来把对象同一个已经存在的名称重新绑定。一般使用rebind()而不使用bind(),因为当有重名的时候rebind()不会出现异常,而bind()会报异常。
    
     void unbind(String sName),释放:用来把对象从目录中释放出来。
    
     void lookup(String sName,Object object),查找:返回目录总的一个对象。
    
     void rename(String sOldName,String sNewName),重命名:用来修改对象名称绑定的名称。
    
     NamingEnumeration listBindings(String sName),清单:返回绑定在特定上下文中指定属性名对象的清单列表,它返回名字、类和对象本身,它用于那些需要对

    具体使用情况如下:

    //得到初始目录环境的一个引用
    
    Context cntxt = new InitialContext();
    
    //返回绑定在特定上下文中指定属性名对象的清单列表
    
    NamingEnumeration namEnumList = ctxt.listBinding("cntxtName");
    
    //循环列出所有名字、类和对象
    
    while ( namEnumList.hasMore() )  {
    
        Binding bnd = (Binding) namEnumList.next();
    
        String sObjName = bnd.getName();
    
        String sClassName = bnd.getClassName();
    
        //得到对象
    
        SomeObject objLocal = (SomeObject) bnd.getObject();
    
    }

    NamingEnumeration list(String sName)与listBindings(String sName)相似,只是它只返回一系列名字/类映射,它主要是用于上下文浏览应用。

     二、JNDI 配置

     配置 JNDI 资源

    复制 JBoss 文档的数据库引用的数据源定义模板到 JBoss 服务器。 $DOC_HOME/docs/examples/jca/mysql-ds.xml ---> $Server_HOME/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/demo</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>

    配置 JNDI 资源引用

    为了让 JNDI 解析 java:comp/env/jdbc/mydatasource 引用,必须把 <resource-ref> 标签插入 web.xml 文件(Web 应用程序的部署描述符)

    <resource-ref>: 资源引用,一般声明管理资源,如数据库驱动程序、JavaMail 会话、自定义类工厂等。
    <resource-env-ref>: 资源环境引用,在Servlet 2.4里用来简化设置不需认证信息的资源环境,一般声明与资源相关的被管理对象,如环境参数、resource-ref变量。

    <resource-ref>
       <res-ref-name>jdbc/mydatasource</res-ref-name>
       <jndi-name>java:MySqlDS</jndi-name>  // 指向真实的 JNDI name
       <res-type>javax.sql.DataSource</res-type>
       <res-auth>Container</res-auth>
    </resource-ref>

    <resource-ref> 入口告诉 servlet 容器,部署人员要在 组件命名上下文(component naming context) 中设置一个叫做 jdbc/mydatasource的资源。组件命名上下文由前缀 java:comp/env/ 表示,所以完全限定的本地资源名称是: java:comp/env/jdbc/mydatasource.

    使用 JNDI 得到数据源

    Connection conn=null;
    try {
      Context ctx=new InitialContext();
      Object datasourceRef=ctx.lookup("java:comp/env/jdbc/mydatasource");
      DataSource ds=(Datasource)datasourceRef;
      Connection c=ds.getConnection();
      /* use the connection */
      c.close();
    } 
    catch(Exception e) {
      e.printStackTrace();
    } 
    finally {
      if(conn!=null) {
        try {
          conn.close();
        } catch(SQLException e) { }
      }
    }

    外部资源链接:

    JNDI 在 J2EE 中的角色

    详解JNDI的lookup资源引用java:/comp/env  

    tomcat下jndi的三种配置方式

    Apache Tomcat 5.5 Servlet/JSP 容器

    resource-ref和resource-env-ref

  • 相关阅读:
    Oracle分析函数row_number()等的使用实例
    Oracle行列转换case when then方法案例
    Oracle日期函数
    Oracle转换函数
    Oracle数值函数
    Oracle字符函数length substr concat实例
    Oracle列转行函数LISTAGG()
    Oracle 条件判断函数decode和case when then案例
    Oracle NVL空值处理函数
    【学亮开讲】Oracle内外连接查询20181119
  • 原文地址:https://www.cnblogs.com/tannerBG/p/3950865.html
Copyright © 2011-2022 走看看