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