聊一聊什么是JNDI数据源

news2024/11/25 11:32:57

 

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

1. 什么是JNDI

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

这块是不是有点耳熟?

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

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

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

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

而在JNDI的规范里面,他针对的是j2ee容器(也就是web容器,比如tomcat,weblogic等这些应用服务器),还有应用,以及服务资源(比如像数据库连接池,或者邮件服务,或者二JMS资源等)这三者之间的调用关系,应用服务器我们可以当做是注册中心,应用我们可以当做是服务调用方,服务资源我们可以当做是服务提供方,应用原本是可以直接通过配置这些服务资源的参数调用的,但是JNDI这个规范解耦了这个直接调用的关系,把原本需要在应用层面来配置服务资源的一些参数配置,比如应用要连接数据库,它需要配置数据库的连接地址,用户名,密码,等等其他参数, 解耦后,这些连接服务资源所需要的一些参数配置放到了应用服务器那里来维护,而应用直需要配置一个资源名称,通过这个名称从应用服务器里面找资源的连接。

以上是我对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连接数据库可以帮助开发人员简化代码,并提高应用程序的可移植性和可伸缩性。

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

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

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

  3. 从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里部署:

  1. 在application.properties文件中配置JNDI资源:
spring.datasource.jndi-name=java:/comp/env/jdbc/myDataSource
  1. 在Tomcat的context.xml文件中添加一个资源定义,指向实际的数据源配置:
<Resource name="jdbc/myDataSource" auth="Container" type="javax.sql.DataSource"
            maxTotal="100" maxIdle="30" maxWaitMillis="10000"
            username="dbuser" password="dbpass" driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/mydatabase"/>

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

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

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

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

4.2 在weblogic里部署:

  1. 将数据源配置添加到WebLogic的domain.xml文件中。例如,添加以下XML代码段:
<jdbc-connection-pool name="myDataSourcePool" res-type="javax.sql.DataSource"
                      datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"
                      capacity="10" initial-capacity="2" max-wait-time-in-millis="30000"
                      connection-creation-retry-frequency-in-seconds="30"
                      connection-reserve-timeout-in-seconds="120"
                      test-connections-on-reserve="true">
    <property name="URL" value="jdbc:mysql://localhost:3306/mydatabase"/>
    <property name="User" value="dbuser"/>
    <property name="Password" value="dbpass"/>
</jdbc-connection-pool>

<jdbc-data-source name="myDataSource" jndi-name="jdbc/myDataSource"
                  pool-name="myDataSourcePool" />

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

  1. 在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数据源并将其返回。

  1. 在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…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/786162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

梅尔频谱(Mel spectrum)简介及Python实现

梅尔频谱&#xff08;Mel spectrum&#xff09;简介及Python实现 1. 梅尔频谱&#xff08;Mel spectrum&#xff09;简介2. Python可视化测试3.频谱可视化3.1 Mel 频谱可视化3.2 STFT spectrum 参考文献资料 1. 梅尔频谱&#xff08;Mel spectrum&#xff09;简介 在信号处理上…

wordpress框架自定义添加page分页功能

先来看效果图&#xff1a; 一、在主题目录下的functions.php文件里&#xff0c;添加如下分页函数&#xff1a; /** * 数字分页函数 * 说明&#xff1a;因为wordpress默认仅仅提供简单分页&#xff0c;所以要实现数字分页&#xff0c;需要自定义函数 * Param bool $isHome 是…

工业静电监控系统的功能介绍

工业静电监控系统是一种用于监测和控制工业生产过程中静电现象的技术系统。静电是指由于物体间的电荷不平衡而产生的电场现象&#xff0c;它在工业生产中可能导致电击、火花、电磁干扰等质量问题。 工业静电监控系统主要通过使用静电传感器和控制设备来实现对静电场的监测和控…

Java反序列化(0):URLDNS的反序列化调试分析

URLDNS链子是Java反序列化分析的第0课&#xff0c;网上也有很多优质的分析文章。 笔者作为Java安全初学者&#xff0c;也从0到1调试了一遍&#xff0c;现在给出调试笔记。 一. Java反序列化前置知识 Java原生链序列化&#xff1a;利用Java.io.ObjectInputStream对象输出流的w…

中医药行业如何进行数字化转型?看天津同仁堂谈“有道有术有零代码”

张伯礼院士曾指出&#xff0c;中药制造的现代化水平&#xff0c;还停留在10%左右的阶段。中医药行业&#xff0c;老字号企业&#xff0c;该如何通过数字化焕发新活力&#xff1f; 天津同仁堂通过与伙伴云合作&#xff0c;零代码构建数字化系统&#xff0c;让技术与思维共同成长…

【Linux】Tcp协议的通讯流程,浅谈三次握手四次挥手

文章目录 Tcp协议的通讯流程一、协议定制与网络版计算器的实现二、json的使用总结 Tcp协议的通讯流程 上一篇文章我们讲解了如何实现Tcp服务器&#xff0c;Tcp的接口也用了&#xff0c;下面我们就看一下Tcp协议的通讯流程&#xff1a; 在服务端&#xff0c;我们首先要创建一个…

Django on_delete参数在sql级别操作中不生效问题

class AA(models.Model):name models.CharField(max_length128)class Meta:db_table aaclass BB(models.Model):name models.CharField(max_length128)aa models.ForeignKey(AA, nullTrue, on_deletemodels.CASCADE)class Meta:db_table bb 如上当使用ORM删除aa表中的数据…

数字孪生:未来科技的新前沿

数字孪生作为一项新兴的研究方向&#xff0c;正逐渐成为科技界的焦点。它是将现实世界中的实体、系统或过程通过数字化手段进行建模、仿真和分析&#xff0c;形成与实体相对应的数字化副本。数字孪生的发展为我们带来了无限的想象空间&#xff0c;以及解决现实问题的新途径。 在…

opencv-18 什么是色彩空间?

1.什么是色彩空间类型&#xff1f; 色彩空间类型&#xff0c;也称为颜色空间类型或色彩模型&#xff0c;是一种表示图像中颜色的方式。在计算机图形学和数字图像处理中&#xff0c;有许多种色彩空间类型&#xff0c;每种类型有不同的表达方式和特点。 常见的色彩空间类型包括&a…

Vector - CAPL - 诊断模块函数(回调函数信息)

目录 CanTpCopyDataReceived CAPL 调用返回的错误代码及其含义 CanTpGetReceiverAddress CanTpGetRecentAddressExtension CanTpGetSenderAddress 代码示例 CanTpProvideTxData 代码示例 CanTpSetRxBufferSize 代码示例 CanTpCopyDataReceived 功能&#xff1a;通过回…

​《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(16)-Charles其他骚操作之大结局​

1.简介 今天就说一些Charles的其他操作、以及抓包跨域的问题和常见的问题如何解决。到此Charles这一系列的文章也要和大家说再见了&#xff0c;其他什么小程序、Android7.0等等的问题可以查看宏哥的Fiddler系列文章&#xff0c;只不过是将Fiddler换成Charles而已。 2.模拟403…

vue中使用Base64转码(Tinymce富文本保留HTML标签)

在vue项目中&#xff0c;我们经常使用到富文本编辑器&#xff0c;例如博主的项目&#xff08;见上图&#xff09;&#xff0c;这里需要把富文本内的HTML结构&#xff0c;发放到Android端做混合应用的开发&#xff0c;因此HTML结构必不可少的&#xff01; 但是浏览器在向服务器…

【MySQL基础】

目录 一、概述 1.什么是数据库 2.数据库能干什么 2.1 企业应用 2.2 金融行业 2.3 电子商务 2.4 社交媒体 2.5物联网 3.为什么要用数据库&#xff0c;优势、特性&#xff1f; 3.1 可靠性和稳定性 3.2 数据管理能力 3.3 数据共享和集成 3.4 数据安全性和隐私保护 3…

新零售转型战略:打造数字化时代持续性盈利的商业模式

新零售达成什么样子&#xff0c;能够创造更大得客户价值&#xff0c;从企业得角度来看&#xff0c;他一定要提升企业得获利能力。新零售应该怎么做&#xff1f;以客户需求为本&#xff0c;找出需求&#xff0c;重新创造场景. 从而提升用户体验加强粘性&#xff0c;而蚓链数字化…

抖音seo账号矩阵系统源码如何开发布局?

目录 一、 抖音SEO账号矩阵系统源码的开发布局步骤如下&#xff1a; 二。 开发部署源码 三、 开发部署功能设计 1. 短视频AI智能创作 2. 托管式账号管理: 3. 数据分析 4. 智能营销获客 四。 抖音seo源码开发部署交付技术文档包含 五。 开发代码展示&#xff1a; 一、 抖…

Layui下拉多选框

标题xmSelect插件&#xff1a; xmSelect文档 下载Layui第三方插件 下拉多选框效果&#xff1a; 实现方法(例子)&#xff1a; 将xmSelect插件的xm-select.js文件引入到layui中&#xff1a; <script src"public/js/xm-select/xm-select.js"></script> …

借助 Mybatis 的动态 SQL 解决传参不确定问题

在上一篇的&#xff1a;Mybatis 操作数据库的基本 CRUD 以及查询操作详析_糊糊涂涂的博客-CSDN博客中介绍了Mybatis使用固定SQL语句操作数据&#xff0c;本篇介绍 Mybatis 一个强大的特性&#xff1a;动态SQL。 动态 SQL 解决什么问题&#xff1f; 那当我们要执行的业务逻辑有…

carla与g29联合调试(一)

前言&#xff1a; 之前做的carla与g29的联合调试&#xff0c;现在记录一下carla控制g29的实现流程。 一、总体通讯流程 主要实现为carla中车辆的方向盘转动带着g29跟着一起转动&#xff0c;使用ros通讯来实现这个过程。 二、具体实现流程 2.1首先确定g29的力反馈和转动 使…

基于LoRA微调部署Stable Diffusion【免费试用阿里云】

文章目录 Stable Diffusion介绍环境及资源准备过程注交互式建模&#xff08;PAI-DSW&#xff09;的试用在创建的工作空间中创建实例安装 Diffusers Stable Diffusion介绍 Stable Diffusion 是一种文本到图像的潜在扩散模型&#xff0c;由 Runway 和慕尼黑大学合作构建&#xf…

学习day52

1.关于 error Component name "School" should always be multi-word vue/multi-word-component-names 这里是因为脚手架的规范原因&#xff0c; 解决办法&#xff1a; 我是在vue.comfig.js文件中加入了一条配置&#xff0c;即 lintOnSave:false 整个文件的完整…