JNDI 技术与JDBC技术的结合既然有那么多的优点,那么我们该如何做呢?RowSet 包
提供了这方面的功能JNDI 技术与JDBC技术结合的原理如下:
使用JDBC和JNDI 技术,编写一个提供数据库服务的组件,然后将它出版到某个中
间层服务器中,侦听服务请求。接下来我们可以编写Java 应用程序查找提供数据库服务
的组件,一旦查找到它(组件) ,就可以利用它提供的各种方法执行特定的数据库操作。
RowSet 包定义的DataSource 接口提供了建立数据库连接的JNDI 支持。具体的方法如下
1 首先创建一个Java 类SampleDataSource 该类扩展了javax..sql.DataSource 接口
具体实现了获取数据库连接的功能该类的代码请参考程序清单
程序SampleDataSource.java如下:
package example6;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class SampleDataSource implementsjavax.sql.DataSource,
javax.naming.Referenceable,java.io.Serializable {
/*Constructors */
publicSampleDataSource() {
//This constructor is needed by the object factory
}
/**Properties */
publicString getServerName() {
returnserverName;
} public void setServerName(StringserverName) {
this.serverName= serverName;
}
publicString getDatabaseName() {
returndatabaseName;
}
publicvoid setDatabaseName(String databaseName) {
this.databaseName= databaseName;
}
/*
* Methods inherited from DataSource
*/
publicConnection getConnection() throws SQLException {
//vendor specific code to create a JDBCConnection goes here
try{
Class.forName("jdbcDriver");
Connectionconn = DriverManager.getConnection("jdbcURL", "user",
"pass");
returnconn;
}catch (Exception fe) {
//to do nothing
}
returnnull;
}
publicConnection getConnection(String username, String password)
throwsSQLException {
//vendor specific code to create a JDBCConnection goes here
Stringuser = username;
Stringpass = password;
try{
Class.forName("jdbcDriver");
Connectionconn = DriverManager
.getConnection("jdbcURL",user, pass);
returnconn;
}catch (Exception fe) {
//to do nothing
}
returnnull;
}
publicjava.io.PrintWriter getLogWriter() throws SQLException {
//vendor specific code goes here
return null;
}
publicvoid setLogWriter(java.io.PrintWriter out) throws SQLException {
//vendor specific code goes here
}
publicvoid setLoginTimeout(int seconds) throws SQLException {
//vendor specific code goes here
}
publicint getLoginTimeout() throws SQLException {
return1;
//vendor specific code goes here
}
privateString serverName = null;
privateString databaseName = null;
}
在SampleDataSource.java类中定义了getConnection ()方法利用该方法可以获取java.sql.Connection 接口的实例对象。
(2) 接下来,我们应该编写一个Java 应用程序,将上面编写好的SampleDataSource
组件出版到中间层服务器中去。假设这个应用程序名为JNDIExam.java,那么它应该含有
下面的代码段。
例
SampleDataSource sds = newSampleDataSource();
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 模块已经省略了), 关于这一段JSP 代码的解释,读者可以参考6.4节的相关解释。
例:
<%
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();
%>