JNDI 技术与JDBC技术的结合既然有那么多的优点,那么我们该如何做呢?RowSet

提供了这方面的功能JNDI 技术与JDBC技术结合的原理如下:

       使用JDBCJNDI 技术,编写一个提供数据库服务的组件,然后将它出版到某个中

间层服务器中,侦听服务请求。接下来我们可以编写Java 应用程序查找提供数据库服务

的组件,一旦查找到它(组件) ,就可以利用它提供的各种方法执行特定的数据库操作。

RowSet 包定义的DataSource 接口提供了建立数据库连接的JNDI 支持。具体的方法如下

1 首先创建一个JavaSampleDataSource 该类扩展了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();

%>