JNDI是什么
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。目录服务是命名服务的一种自然扩展。两者之间的关键差别是目录服务中对象不但可以有名称还可以有属性(例如,用户有email地址),而命名服务中对象没有属性。
为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。现在JNDI已经成为J2EE的标准之一,所有的J2EE容器都必须提供一个JNDI的服务。
这是百度百科给出的解释。。这话说的太官方,有点看不懂的感觉。。那么JNDI到底是干什么用的呢?我的初步理解就是它是把名字和对象绑到一起的技术,外部资源通过名字就可以获得对象的引用。
举例说明:
上篇博客所提到的JDBC访问数据库,JDBC入门,这个博客中链接数据库时所用到的驱动、数据源、用户名、密码等都是“写死的”,如果上面的东西改变,则DB_URL、驱动程序包、类名等都得改变。总之,就是耦合性很强。
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//加载驱动
String DB_URL = "jdbc:sqlserver://localhost:1433;databaseName=student"//数据源
String USER = "sa";//用户名
String PASS = "123456";//密码
用JNDI来解决的话,首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。
javax.naming包中提供context接口,有两个方法:
void bind( String name , Object object )
将名称绑定到对象。所有中间上下文和目标上下文(由该名称最终原子组件以外的其他所有组件指定)都必须已经存在。
object lookup( String name )
检索指定的对象。如果 name为空,则返回此上下文的一个新实例(该实例表示与此上下文相同的命名上下文,但其环境可以独立地进行修改,而且可以并发访问)。
Tomcat配置JNDI数据源:
context.xml文件中的配置:
<Context>
<Resource name="jdbc/test" auth="Container"
type="javax.sql.DataSource"
username="sa"
password="123456"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;databaseName=student"
maxActive="100"
maxIdle="30"
maxWait="10000"/>
</Context>
然后在连接数据库的时候:
Connection conn = null;
String jndi = "jdbc/test";
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.<strong>lookup</strong>(<strong>jndi</strong>);//引用数据源
if(ds != null){
try {
conn = ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
return conn;
}
这样就可以在xml文件中配置数据源,解除了程序和数据库之间的耦合。
当然JNDI并不仅仅局限于数据库的配置,所有与系统外部的资源的引用,都可以通过JNDI定义和引用。例如环境实体、EJB引用等。