首页 > 编程语言 >JNDI(Java Naming and Directory Interface–Java命名和目录接口)

JNDI(Java Naming and Directory Interface–Java命名和目录接口)

时间:2023-04-02 20:11:07浏览次数:51  
标签:Java jndiProps JNDI DataSource Interface new naming

JNDI(Java Naming and Directory Interface,Java命名和目录接口)为应用程序提供了一种通过网络访问远程服务的方式。本节我们学习如何通过JNDI API注册和访问JDBC数据源对象。读者如果需要了解更多JNDI相关细节,则可参考JNDI规范文档。

JNDI API的命名服务可以把一个逻辑名称和一个具体的对象绑定。使用JNDI API,应用程序可以通过与DataSource对象绑定的逻辑名称来获取DataSource对象,这种方式在很大程度上提高了应用的可移植性,因为当DataSource对象的属性(例如端口号、服务器地址等)被修改时,不会影响JDBC客户端代码。实际上,当修改DataSource的配置,使它连接到其他数据库时,应用程序是没有任何感知的。

接下来我们就以一个实际的案例介绍如何使用JNDI API提供一个命名服务,然后使用JNDI API查找该命名服务,代码如下:

@Before
  public void before() throws IOException {
    DataSourceFactory dsf = new UnpooledDataSourceFactory();
    Properties properties = new Properties();
    InputStream configStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("database.properties");
    properties.load(configStream);
    dsf.setProperties(properties);
    DataSource dataSource = dsf.getDataSource();
    try {
      Properties jndiProps = new Properties();
      jndiProps.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
      jndiProps.put(Context.URL_PKG_PREFIXES, "org.apache.naming");
      Context ctx = new InitialContext(jndiProps);
      ctx.bind("java:TestDC", dataSource);
    } catch (NamingException e) {
      e.printStackTrace();
    }
  }

  @Test
  public void jdniTest() {
    try {
      Properties jndiProps = new Properties();
      jndiProps.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
      jndiProps.put(Context.URL_PKG_PREFIXES, "org.apache.naming");
      Context ctx = new InitialContext(jndiProps);
      DataSource dataSource = (DataSource) ctx.lookup("java:TestDC");
      Connection conn = dataSource.getConnection();
      Assert.assertNotNull(conn);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

如上面的代码所示,在MyBatis源码中提供了javax.sql.DataSource接口的实现,分别为UnpooledDataSource和PooledDataSource类。UnpooledDataSource未实现连接池功能,而PooledDataSource则采用装饰器模式对UnpooledDataSource功能进行了增强,增加了连接池管理功能。

上面的代码中,我们使用UnpooledDataSourceFactory创建了一个UnpooledDataSource实例,其中database.properties文件为数据源相关配置(读者可参考mybatis-chapter02项目中的database.properties文件内容),然后创建一个javax.naming.InitialContext实例,调用该实例的bind()方法创建命名服务,命名服务创建完成后就可以通过javax.naming.InitialContext实例的lookup()方法来查找服务了。

需要注意的是,JDK中只提供了JNDI规范,具体的实现由不同的厂商来完成。这里我们使用的是Apache Tomcat中提供的JNDI实现,因此需要在项目中添加相关依赖,例如:

<dependency>
      <groupId>tomcat</groupId>
      <artifactId>naming-java</artifactId>
      <version>5.0.28</version>
    </dependency>

    <dependency>
      <groupId>tomcat</groupId>
      <artifactId>naming-common</artifactId>
      <version>5.0.28</version>
    </dependency>

    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.1</version>
    </dependency>

在实际的Java EE项目中,JNDI命名服务的创建通常由应用服务器来完成。在应用程序中,我们只需要查找命名服务并使用即可。例如,在Apache Tomcat服务器中,我们可以通过如下代码配置JNDI数据源:

在这里插入图片描述
JNDI规范文档:https://docs.oracle.com/cd/E17802_01/products/products/jndi/javadoc/

注意:摘要于《mybatis3源码深度解析》

标签:Java,jndiProps,JNDI,DataSource,Interface,new,naming
From: https://www.cnblogs.com/daitao-blog/p/17281163.html

相关文章

  • java使用模块后,用maven打包时,需要保护的maven插件
    <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version><configuration><release>11</release><......
  • java流
    流运算map和flatMapmap函数接收一个函数作为参数,将该函数应用于流中的每个元素,并返回一个新的流。例如,我们可以通过map函数将流中的每个元素都加上1:List<Integer>numbers=Arrays.asList(1,2,3,4);List<Integer>incrementedNumbers=numbers.stream()......
  • java -- static, 内部类, 权限, 参数传递
    static关键字static是静态修饰符,一般修饰成员。被static修饰的成员属于类,不属于单个这个类的某个对象。static修饰的成员被多个对象共享。static修饰的成员属于类,但是会影响每一个对象。被static修饰的成员又叫类成员,不叫对象的成员。static特点被static修饰的成员变量属于类,不......
  • 有关哈希表简单的散列函数实现-Java实现
    其实现不难,所以直接贴代码:1packagedataSrtuct;23importjava.util.ArrayList;4importjava.util.LinkedList;56publicclassHashTab{7publicstaticvoidmain(String[]args){8hashTablehashT=newhashTable(10);9......
  • leetcode 394.字符串解码 Java
    394.字符串解码给定一个经过编码的字符串,返回它解码后的字符串。编码规则为:k[encoded_string],表示其中方括号内部的encoded_string正好重复k次。注意k保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外......
  • Java SPI机制简介
    在JDBC4.0版本之前,使用DriverManager获取Connection对象之前都需要通过代码显式地加载驱动实现类,例如:JDBC4.0之后的版本对此做了改进,我们不再需要显式地加载驱动实现类。这得益于Java中的SPI机制,本节我们就来简单地了解SPI机制。SPI(ServiceProviderInterface)是JDK内置的一......
  • java数组的创建和使用
    声明数组必须先声明后使用,数组的声明有两种方法:1.C语言风格声明:dataTypearrayRefVar[];2.Java风格声明:dataType[]arrayRefVar;一般推荐使用第二种Java风格的声明方式。创建数组声明的数组并不具备物理空间,需要使用new操作符来创建数组,为其分配内存空间:dataType[......
  • mybatis OGNL表达式,xml查询中使用java的变量值
    1、参考struts2ongl访问静态变量与访问枚举Ognl表达式基本原理和使用方法2、java类packageorg.jeecg.mgt.cms.constant;publicclassEAd{publicstaticfinalIntegershow1=1;publicstaticfinalclassAA{publicstaticfinalIntegershow2......
  • leetcode 739.每日的温度 Java
    739.每日的温度给定一个整数数组temperatures,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。示例1:输入:temperatures=[73,74,75,71,69,72,76,73]输出:[1,1,4,2,1,......
  • nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http
    一、问题背景利用springboot上传大文件二、报错截图如下2023-04-0216:04:18,681ERROR[http-nio-63050-exec-6][GlobalExceptionHandler.java:58]-系统异常:Maximumuploadsizeexceeded;nestedexceptionisjava.lang.IllegalStateException:org.apache.tomcat.util.h......