JNDI技术提供了一种程序运行模式,使得Java应用程序可以通过网络发现和请求远端计算设备上的服务,如数据库服务等。这里着重介绍JNDI技术如何与JDBC技术结合起来,构建强大的访问数据库的Java应用程序。究竟JNDI技术和JDBC技术的结合会有何好处呢?
1应用JNDI技术,可以实现真正的分布式处理,数据库服务器、提供数据库连接服务的组件、执行数据库操作的Java应用程序可以分布在不同地址的异质计算设备上。2将JNDI技术与JDBC技术结合可以实现数据库连接缓冲池的功能。3将JNDI技术与JDBC技术结合可以在Java应用程序中屏蔽掉很多繁琐的建立数据库连接的代码,这样有有助于系统的安全性RowSet包提供了这方面的功能JNDI技术与JDBC技术结合的原理如下:使用JDBC和JNDI技术编写一个提供数据库服务的组件,然后将它出版到某个中间层服务器中,侦听服务请求。接下来我们可以编写Java应用程序查找提供数据库服务的组件,一旦查找到它(组件)就可以利用它提供的各种方法执行特定的数据库操作。RowSet包定义的DataSource接口提供了建立数据库连接的JNDI支持。具体的方法如下:1首先创建一个Java类SampleDataSource,该类扩展了javax..sql.DataSource接口具体实现了获取数据库连接的功能,该类的代码如下://File Name SampleDataSource.java
//Author fancy
//Date 2001.3.4
//Note to create tht datasource connection
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
public class SampleDataSource implements javax.sql.DataSource
javax.naming.Referenceable java.io.Serializable
{
/* Constructors*/
public SampleDataSource()
{
// This constructor is needed by the object factory
}
/** Properties*/
public String getServerName()
{
return serverName;
}
public void setServerName(String serverName)
{
this.serverName = serverName;
}
public String getDatabaseName()
{
return databaseName;
}
public void setDatabaseName(String databaseName)
{
this.databaseName = databaseName;
}
/*
* Methods inherited from DataSource
*/
public Connection getConnection() throws SQLException
{
//vendor specific code to create a JDBC Connection goes here
try
{
Class.forName("jdbcDriver");
Connection conn=DriverManager.getConnection("jdbcURL" "user" "pass");
return conn;
}
catch(Exception fe)
{
//to do nothing
}
return null;
}
public Connection getConnection(String username String password) throws SQLException
{
//vendor specific code to create a JDBC Connection goes here
String user=username;
String pass=password;
try
{
Class.forName("jdbcDriver");
Connection conn=DriverManager.getConnection("jdbcURL" user pass);
return conn;
}
catch(Exception fe)
{
//to do nothing
}
return null;
}
public java.io.PrintWriter getLogWriter() throws SQLException
{
//vendor specific code goes here
}
public void setLogWriter(java.io.PrintWriter out) throws SQLException
{
//vendor specific code goes here
}
public void setLoginTimeout(int seconds) throws SQLException
{
//vendor specific code goes here
}
public int getLoginTimeout() throws SQLException
{
//vendor specific code goes here
}
private String serverName = null;
private String databaseName = null;
}在SampleDataSource类中定义了getConnection()方法,利用该方法可以获取java.sql.Connection接口的实例对象,除了getConnection()方法以外,SampleDataSource.java程序还定义了若干个其他相关方法。2接下来我们应该编写一个Java应用程序,将上面编写好的SampleDataSource组件出版到中间层服务器中去,假设这个应用程序名为JNDIExam.java,那么它应该含有下面的代码段例SampleDataSource sds = new SampleDataSource();
sds.setServerName(“rainbow”);
sds.setDatabaseName("fancy");
Context ctx = new InitialContext();
ctx.bind(“jdbc/EmployeeDB” sds);上面的代码中第一行创建了一个SampleDataSource对象,接下来的两行代码分别调用setServerName()方法和setDatabaseName()方法初始化SampleDataSource对象的属性,然后创建JNDI命名环境对象ctx,将SampleDataSource类的实例对象sds绑定到JNDI名jdbc/EmployeeDB中。编译运行JNDIExam.java程序,将JNDI服务发布出去。除了使用这个方法也可以使用某些GUI工具可视化出版JNDI服务。3下一步我们应该编写客户端(此处指相对的客户端,某台服务器相对于另一台服务器来说可以是服务端也可以是客户端)的Java应用程序,如JSP程序等,以便使用JNDI服务。请看下面的JSP代码段(try/catch模块已经省略了)例
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup(“jdbc/EmployeeDB”);
Connection con = ds.getConnection(jdbc/webDatabase” "sa” “");
con.setAutoCommit(false);
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("SELECT * FROM goods");
while(rs.next())
{
out.println(rs.getString(1));
}
con.commit();
con.close();
%>程序的解释请参看http://blog.csdn.net/jgsfy/archive/2005/01/04/239800.aspx