聊一聊什么是JNDI数据源

2023年 7月 25日 49.4k 0

大家好,我是G探险者。
我们平时开发项目,连接数据库那块,会采用连接池的方式连进行连接数据库,比如常见的durid,dbcp,c3p0等。那你有没有听过还有一个JNDI数据源呢,反正我以前是很少听说过。可能就是因为自己的孤陋寡闻。那我们今天就聊一聊JNDI数据源是怎么回事。

1. 什么是JNDI

JNDI(Java Naming and Directory Interface,Java命名和目录接口)是Java平台上的一种标准服务,它允许Java应用程序通过名称查找资源。

这块是不是有点耳熟,

image.png

我们的微服务里面的注册中心,调用方通过服务名从注册中心寻址服务方的地址。

它基本上是一个获取对象实例的接口,如数据源(如javax.sql.DataSource)、JMS资源(如javax.jms.ConnectionFactory)或任何类型的Java对象。

我来用注册中心里面的概念对比一下,这样方便理解。

image.png

在微服务概念里面,存在服务的调用方(也就是消费者),服务提供方(也就是服务生产者),调用方通过一个服务名从注册中心寻找服务提供方提前在注册中心注册号的服务地址。这里强调的是通过名称找地址。

而在JNDI的规范里面,他针对的是j2ee容器(也就是web容器,比如tomcat,weblogic等这些应用服务器),还有应用,以及服务资源(比如像数据库连接池,或者邮件服务,或者二JMS资源等)这三者之间的调用关系,应用服务器我们可以当做是注册中心,应用我们可以当做是服务调用方,服务资源我们可以当做是服务提供方,应用原本是可以直接通过配置这些服务资源的参数调用的,

但是JNDI这个规范解耦了这个直接调用的关系,把原本需要在应用层面来配置服务资源的一些参数配置,比如应用要连接数据库,它需要配置数据库的连接地址,用户名,密码,等等其他参数, 解耦后,这些连接服务资源所需要的一些参数配置放到了应用服务器那里来维护,而应用直需要配置一个资源名称,通过这个名称从应用服务器里面找资源的连接。

1.1 JNDI架构

我们先来看下JNDI的架构。

image.png

我们的应用程序可以使用JNDI API对命名服务执行操作,然后在其中发生的事情取决于所插入的服务提供者(SPI)。要声明您想在应用程序中使用的SPI之一,您必须指定一个类,该类是特定SPI的一部分。
JDK包含开箱即用的四个服务提供者:LDAP、DNS、RMI和CORBA。但是,您可以为自定义服务创建自己的服务提供者。

以上是我对JNDI的一些理解,下面是以数据库连接池为例子,来通过代码示例,来让大家有个更好的理解。

2. JNDI数据源

JNDI数据源(Data Source)是一种通过JNDI技术配置和查找数据库连接池的方法。数据源是一个对象,通常表示为javax.sql.DataSource接口,它封装了应用程序与数据库之间的连接细节。当应用程序需要与数据库进行交互时,它可以从数据源中获取一个数据库连接(通常是一个java.sql.Connection对象)。

在Java EE应用服务器(如Tomcat、WildFly、GlassFish等)中,可以通过在服务器的配置文件中定义数据源,指定数据库连接池的详细信息,如数据库URL、用户名、密码、驱动程序类等。这样,应用程序不需要直接处理数据库连接细节,而是通过JNDI查找数据源并从中获取数据库连接。

使用JNDI数据源的优点包括:

  • 解耦:应用程序与数据库连接配置之间的耦合度降低,使得应用程序更易于维护和部署。
  • 集中管理:数据库连接池配置在应用服务器中统一管理,方便监控和调整。
  • 资源共享:多个应用程序可以共享同一个数据源,减少了资源的浪费。

总之,JNDI数据源是一种在Java EE环境中管理和查找数据库连接池的方法,它提供了一种灵活、可维护和可扩展的方式来处理应用程序与数据库之间的连接。

3. JNDI如何连接数据库

JNDI允许应用程序以一种独立于具体实现的方式访问各种命名和目录服务。使用JNDI连接数据库可以帮助开发人员简化代码,并提高应用程序的可移植性和可伸缩性。

要连接数据库,需要完成以下步骤:

  • 配置数据库连接池:在应用程序的服务器(即web容器)上配置一个数据库连接池,以便应用程序可以在需要时从池中获取连接,而不是每次都重新创建连接。具体的配置方法会因应用服务器不同而有所不同。

  • 配置JNDI上下文:将数据库连接池配置为一个JNDI资源,以便应用程序可以通过JNDI查找和访问它。在一般的Java EE容器中,这通常可以在应用程序的web.xml文件或application.xml文件中完成配置。

  • 从JNDI查找和获取连接:在应用程序中,通过JNDI查找和获取配置的数据库连接池资源。以下是一个示例代码:

  • InitialContext ctx = new InitialContext();
    DataSource dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/myDataSource");
    Connection conn = dataSource.getConnection();
    

    在这个示例中,我们首先通过InitialContext查找JNDI上下文,然后通过JNDI名称"java:comp/env/jdbc/myDataSource"获取DataSource实例,并最终通过DataSource获取数据库连接。

    请注意,JNDI名称的具体格式和命名规则会因应用服务器不同而有所不同。应用程序开发人员需要查看应用服务器的文档来了解详细的配置和使用方法.

    4. 在springboot项目里面如何配置

    在Spring Boot项目中,可以使用Spring Boot的自动配置机制来简化JNDI配置。下面是一个基本的JNDI配置示例

    4.1 在Tomcat里部署:

  • 在application.properties文件中配置JNDI资源:
  • spring.datasource.jndi-name=java:/comp/env/jdbc/myDataSource
    
  • 在Tomcat的context.xml文件中添加一个资源定义,指向实际的数据源配置:
  • 
    
    

    在这个示例中,我们将JNDI名称java:/comp/env/jdbc/myDataSource映射到一个名为jdbc/myDataSource的Tomcat资源。注意,JNDI名称的前缀java:/comp/env/是Tomcat特有的,用于指定资源所在的命名空间。

  • 在Spring Boot应用程序中,可以通过@Autowired注解自动装配数据源:
  • @Autowired
    private DataSource dataSource;
    
    

    在这个示例中,我们通过Spring Boot的依赖注入机制,将Tomcat配置的JNDI数据源注入到Spring Boot应用程序中的dataSource变量中。

    请注意,这个示例仅仅是一个基本的JNDI配置示例。实际的JNDI配置方法可能因应用服务器和数据库不同而有所不同。开发人员需要查看应用服务器和数据库的文档来了解详细的配置和使用方法。

    4.2 在weblogic里部署:

  • 将数据源配置添加到WebLogic的domain.xml文件中。例如,添加以下XML代码段:
  • 
        
        
        
    
    
    
    
    

    在这个示例中,我们创建了一个名为myDataSourcePool的连接池,然后将其配置为一个JNDI数据源jdbc/myDataSource。

  • 在Spring Boot应用程序中,可以通过以下方式访问JNDI数据源:
  • @Bean(name = "dataSource")
    public DataSource dataSource() throws NamingException {
        Context ctx = new InitialContext();
        return (DataSource) ctx.lookup("jdbc/myDataSource");
    }
    
    

    在这个示例中,我们通过@Bean注解创建了一个名为dataSource的数据源实例。然后,我们使用InitialContext对象查找JNDI数据源并将其返回。

  • 在Spring Boot应用程序中,可以通过@Autowired注解自动装配数据源:
  • @Autowired
    private DataSource dataSource;
    
    

    在这个示例中,我们通过Spring Boot的依赖注入机制,将WebLogic配置的JNDI数据源注入到Spring Boot应用程序中的dataSource变量中。

    请注意,这个示例仅仅是一个基本的JNDI配置示例。实际的JNDI配置方法可能因应用服务器和数据库不同而有所不同。开发人员需要查看应用服务器和数据库的文档来了解详细的配置和使用方法。

    后记

    本文参阅:
    sergiomartinrubio.com/articles/jn…
    blog.csdn.net/gybshen/art…

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论