Featured image of post Java基础知识:JNDI

Java基础知识:JNDI

Java基础知识补充

OK,又到了喜闻乐见的Java基础知识环节

What’s JNDI

JNDI,即Java Naming and Directory Interface,直译为 Java命名与目录接口

Java表明了这个玩意儿大概率只在Java中存在

Interface表明了这个玩意儿是一个 Interface(接口),Interface 的作用是什么?模拟一种规范

Naming and Directory这个的直译其实有些不对,Naming确实是命名,但是英文中的Directory其实更偏向于电话簿,地址簿类似的东西

JNDI这里最重要的概念是Naming and Directory,最重要的定位是Interface

可能很啰嗦,但是这就是他最原始,也是最本质的定义,如果你想知道他是什么,就是Interface,用来干什么,就是Naming and Directory

How to use JNDI

网上会有很多栗子,来解释,或者带人来感受JNDI的使用

这里也贴出来,读者可以感受感受

Non-JNDI

本栗子通俗的讲就是:使用JDBC来连接数据库和执行SQL语句,它最大的特点是通过java程序去找数据库驱动,然后来连接数据库。

java亲自去连数据库。

代码如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Connection conn=null; 
try { 
	Class.forName("com.mysql.jdbc.Driver", true, Thread.currentThread().getContextClassLoader()); 
	conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=xxx&password=xxx"); 
	...... 
	conn.close(); 
} catch(Exception e) { 
	e.printStackTrace(); 
} finally { 
	if(conn!=null) { 
		try { 
			conn.close(); 
		} catch(SQLException e) {} 
	}
}

这是传统派的做法,也是以前非Java程序员(如Delphi、VB等)常见的做法。这种做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和MySQL,可以很快开发出相应的应用程序。

没有JNDI的做法存在的问题:

1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;

2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;

3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;

4、……

程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。

With-JNDI

用了JNDI之后的做法:

首先,在在J2EE容器中配置JNDI参数,定义一个资源源(在这里是数据源)给这个数据源设置一个名称(记住,后面要考)

然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。

具体操作如下,以JBoss为例(也可以Tomcat,配置到Tomcatcontext.xml

JBossD:/jboss420GA/docs/examples/jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下,如 D:/jboss420GA/server/default/deploy。 修改 mysql-ds.xml 文件的内容,使JBOSS能根据配置通过JDBC正确访问你的MySQL数据库

没错,这一步应该是JBOSS来连接而非java程序

为什么是应该,笔者咩有实验嘞,根据众多文章的理解是这样

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
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) {} 
	} 
}

Benefits of With-JNDI

直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几,但是现在的程序可以不用关心具体JDBC参数了。

在系统部署后,如果数据库的相关参数变更,只需要重新配置 mysql-ds.xml 修改其中的JDBC参数,只要保证数据源的名称不变,那么程序源代码就无需修改。

由此可见,JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。

Re-understand the JNDI

核心点是:把资源取个名字,再根据名字来找资源

  • 如何给资源取名字?通过配置文件,通过RMI,Whatever.

  • 重点是什么?是给当前应用服务器所管理的所有资源一个唯一的标识,资源可以包括包括数据库,网页,文件,连接池等等。

JNDI提供了一种统一的方式,可以用在网络上查找和访问服务。通过指定一个资源名称,该名称对应于数据库或命名服务中的一个记录,同时返回相关服务所必须的信息。

JNDI主要有两部分组成:应用程序编程接口和服务供应商接口。

  • 应用程序编程接口提供了Java应用程序访问各种命名和目录服务的功能
  • 服务供应商接口提供了任意一种服务的供应商使用的功能。

!!!!

JNDI(Java Name Directory Interface)是为应用服务器管理资源所设置的目录样式的唯一标识(就像是电话簿一样),数据库、网页、文档等

!!!!


Ref

https://blog.csdn.net/belongtocode/article/details/106327415

https://blog.csdn.net/wn084/article/details/80729230

https://blog.csdn.net/ibigboy/article/details/84309064

https://blog.csdn.net/ibigboy/article/details/84308580

https://www.cnblogs.com/dion-90/articles/9029581.html

—TODO—

JNDI Tomcat 或者 JBOSS 配置后,跟踪程序流,查看是否是由Tomcat/JBOSS进行数据库连接

Licensed under CC BY-NC-SA 4.0
Dan❤Anan
Built with Hugo
主题 StackJimmy 设计