JNDI初认识

时间:2022-09-29 15:18:20

JNDI即Java命名和目录接口,英文全称为Java Naming and Directory Interface,从字面上似乎十分晦涩,下面从理论和实际项目应用方面来阐述。

1、命名:在我们实际生活或工作中,命名类似如你的身份证号和工号可以"理解"成一种命名服务,即一个值到另一个值的映射,从身份证或工号就可以得知你人本身。

2、目录服务:从计算机角度理解为在互联网上有着各种各样的资源和主机,但是这些内容都是散落在互联网中,为了访问这些散落的资源并获得相应的服务,就需要用到目录服务。

在实际项目开发过程中,对于数据源配置方面,JNDI的应用就是一个很好的例子。

对于一个简单的系统,我们一般会将数据库的连接url、用户名、密码、数据源(c3p0,dbcp等)配置在本系统中,对于SSH项目,通常会这些写在配置文件(properties、xml等)中,在系统初始化的时候,进行读取加载。

存在的问题:

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

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

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

即耦合性太高。

使用JNDI的案例:

在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称,然后在程序中,通过数据源名称引用数据源从而访问后台数据库。

如果项目中使用到spring,可以定义一个spring-res.xml,用于定义使用的jndi名称。

如:

<!-- JNDI数据源 -->
<jee:jndi-lookup id="dataSource" jndi-name="jndi/Java"
proxy-interface="javax.sql.DataSource" lookup-on-startup="false" />

即配置数据源名称为jndi/Java,

如果使用Tomcat作为web容器,则在context.xml中配置:

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" maxActive="20"
maxIdel="10" maxWait="1000" name="jndi/shds" type="javax.sql.DataSource"
url="jdbc:mysql://localhost:3306/java?user=xxx&amp;password=123#pwd&amp;useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true&amp;generateSimpleParameterMetadata=true&amp;" />

如果使用JBOSS作为web容器,则在mysql-ds.xml修改

在程序中引用数据源:

Context ctx=new InitialContext();

Object datasourceRef=ctx.lookup("jndi/Java"); //引用数据源,实际项目中,可以获取spring-res.xml配置文件中jndi-name来获取实际数据源名称。

DataSource ds=(Datasource)datasourceRef;

conn=ds.getConnection();

在系统部署后,如果数据源参数发生改变,只要jndi名称不改,那么我们只要在一个地方修改配置即可,不需要修改源代码,从而是程序员真正关心代码逻辑的实现,

也达到解耦的目的。

JNDI的扩展:JNDI在满足了数据源配置的要求的基础上,还进一步扩充了作用:所有与系统外部的资源的引用,都可以通过JNDI定义和引用。