服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

分享如何写自己的type3 jdbc 驱动


  第1部分:应用程序连接数据的简单方法
  
  前言

  
  你想不想写自己的jdbc驱动,或者是否想把现在的jdbc驱动转换成type3的驱动呢?type3 的驱动主要用于无需客户端设置的internet/intrant应用程序中,并且提供灵活的系统管理工具。本文中nitin nanda 和 sunil kumar描述了jdbc驱动的架构并概略讲解了type3 jdbc驱动的三层结构。并演示了如何创建自己的type3 jdbc驱动。
  
  在java中访问数据库系统你需要一个jdbc驱动。你可以自己写type1到type4的jdbc驱动,可以是纯java的方式或者使用java结合本地接口方法的复合方式。产品化的方式趋向于利用纯java技术创建type3或type4的驱动程序。在internet应用程序中访问数据库的效率和稳定性成为了关键因素,这时type3 jdbc驱动显示出了它的优势。所以,要开发高效的、易部署的internet应用,你通常需要将现在的type1或type2类型的jdbc替换成type3类型的。
  
  整个文章分为3个部分:
  
  1.    应用程序连接数据库的简单方法。
  
  2.    使用自定义的jdbc驱动编译、部署、访问数据。
  
  3.    通过高级的日志功能、连接池、预处理数据集增强自定义的jwdriver的性能。
  
  在这三个部分中,我们首先介绍了我们自己的type3 jdbc驱动的结构和设计(第一部分),然后讲了如何实现和部署整个驱动(第二部分),最后讲解了如何在其中增加一些高级特性,比如sql日志、连接池等(第三部分)。
  
  注意:
  
  在开始之前,也许你可以先看一下nitin nanda's的"jdbc drivers in the wild",这更有利于你理解jdbc驱动。
  
  jdbc驱动的结构
  
  jdbc为通用的数据库访问提供了一种程序级的接口。在一个特定的数据库环境下使用jdbc api你需要一个jdbc驱动来完成他们直接的协调运行。jdbc被分为四种类型或者说层次。每一个类型都有一个jdbc实现,以便满足日益增加的对平台独立性、执行效率和可管理性的要求。这四种类型分别是:
  
  type1:jdbc-odbc(开方数据库连接)桥。
  
  type2:本地api,部分的java驱动。
  
  type3:网络协议,完全的java 驱动。
  
  type4:本地协议,完全的java驱动。
  
  所有的jdbc驱动都要实现下面四个jdbc类:driver、connection、statement和resultset。包含在java.sql包种drivermanager类用于管理被加载的驱动。客户端应用程序通过它获得数据库连接。jdbc的driver通过下面的方法加载:
  
  class.forname("com.jw.client.jwdriver");
  
  当这个driver被加载时它的staic部分的代码就会执行,通过drivermanager注册这个驱动。现在,只要客户端应用程序通过drivermanger.getconnection()方法,drivermanager就会转而调用driver.connect()方法。每一个jdbc驱动必须实现java.sql.driver接口。所以,jdbc驱动的driver.connect方法会首先检测当前的驱动url是否正确,然后会通过connet()方法返回一个connection对象。
  
  简单type3驱动的结构
  
  为了向你展示type3驱动的内容结构,我创建了一个自己的type3jdbc驱动。我们的type3驱动是基于网络协议、完全java实现的,它分为3个层次,同时向你展示了jdbc是如何通过中间层的网络协议进行通信的。中间层服务讲请求传输(直接或间接的)给特定的数据库本地连接接口,然后通过这个接口将请求传输到数据库服务器。中间层用java实现,数据库访问的实现通过jdbc-odbc桥。
  
  jdbc type3 的结构
  
  对于applet,客户层驱动文件位于中间层服务器,并且可以直接下载。在jdbc驱动种rmi提供网络协议服务,负责驱动的客户端和服务端的通信。jdbc-odbc桥使得jdbc请求可以传输到数据库服务器。
  
  驱动的客户层为客户端程序提供了标准的jdbc接口,包括实现了java.sql.driver接口的driver类。同时还包含了jdbc的connection、statement、result接口的实现。
  
  客户端应用程序,比如applet,可以使用type3驱动的客户层类进行开发,因为它实现了标准的jdbc接口拥有标准的jdbc功能。客户层类的driver在内部会维护与中间层提供的远程接口之间的通信。这些远程接口提供了客户端传输jdbc请求要用到的基本方法。应用程序会调用已经实现了的driver中的jdbc方法,随后这些调用会通过rmi发送到中间层。所有driver类的客户层通过中间层来管理内部的rmi通信。
  
  驱动的服务层是一个rmi服务器,它通过jdbc-odbc桥来和数据库进行通信。驱动的服务层包含4个远程接口以及它们的实现,这些远程接口分别为jdbc的driver、connection、statement和result提供了访问接口。实现这些远程接口的类会在内部维护jdbc-odbc的桥驱动的connection、statement和result对象。当客户层类调用远程接口的时候,远程接口的实现使用内部的jdbc对象与数据库通讯。
  
  现在你已经了解了type3 jdbc驱动的接口,下面让我们进一步的深入到客户层和服务器层中。
  
  jdbc类驱动
  
  为了实现type3 jdbc驱动,我们必须创建客户层和中间层。客户层类位于com.jw.client包中,中间层位于com.jw.server包中,让我们先来看看客户层。
  
  客户层类
  
  客户层包com.jw.client中包含下面几个类:
  
  com.jw.client.jwdriver类:jdbc驱动(driver)的实现类。
  
  com.jw.client.jwconnection类:jdbc连接(connection)的实现类。
  
  com.jw.client.jwstatement类:jdbc表达式(statement)的实现类。
  
  com.jw.client.jwrseultset类:jdbc结果集(resultset)的实现。
  
  如所示,它描述了客户层和中间层driver和connection类之间的关系。
  
  driver和connection类
  
  让我们仔细的看看jwdriver类的内部:
  
  jwdriver类
  
  com.jw.client.jwdriver类实现了java.sql.driver接口,它提供了通过drivermanager类注册自己并创建数据库连接的方法。这个类实现了远程driver的封装以便提供jdbc驱动接口。在应用程序中通过下面的方法调用可以加载jwdriver:
  
  class.forname("com.jw.client.jwdriver");
  
  当它通过drivermanager类加载后,上面的代码中forname方法会调用jwdriver类的static部分的代码。下面显示的代码中的static部分:
  
  static{try{// register the jwdriver with drivermanagerjwdriver driverinst = new jwdriver();drivermanager.registerdriver(driverinst);system.setsecuritymanager(new rmisecuritymanager());}...}
  
  jwdriver类同时还维护一个远程驱动的引用,com.jw.server.iremotedriver,它位于中间层服务器。远程驱动的引用为jwdriver创建了数据库的连接。所以当应用程序需要获得一个数据库连接的时候就调用drivermanager.getconnection()方法,这时drivermanager的jwdriver.connect()方法会通过远程驱动的引用获得一个数据库连接。
  
  简而言之,jwdriver.connect()方法完成如下超作:
  
      比较客户端程序传递的url如果是一个不匹配的url就返回一个null。
  
      如果不存在远程驱动引用就通过naming.lookup()方法创建一个。jwdriver.connet()方法控制远程驱动来创建数据库连接。:
  
  if(remotedriver == null){remotedriver= remotedriver)naming.lookup("rmi://"+servername+":1099"+"/remotedriver");}
  
      创建、使用如上方法创建的数据库连接,并将创建的数据库连接返回给调用它的应用程序。remotedriver.getconnetion()方法是中间层jdbc驱动的远程调用,从中间层获得的远程connection作为一个应用保存在jwconnection类对象中。jwconnection类可以通过下面的方法获得:
  
  {iremoteconnection remoteconinstance =(iremoteconnection)remotedriver.getconnection();localconinstance = new jwconnection(remoteconinstance);...return (connection)localconinstance;}
  
  下面我们一起来仔细的看看jwconnection类。
  
  jwconnection类
  
  com.jw.client.jwconnection类实现了connection接口,而且它还包含一个远程服务器iremoteconnection接口的引用。
  
  客户端程序中的jwdriver.connect方法可以得到jwconnection对象的引用并创建一个jwconnection对象。这样客户端就可以通过jwconnection对象任意的调用jdbc connection接口的方法了。jwconnection在内部调用远程服务器的connection。比如当客户端调用conn.createstatement()方法时(conn是一个jwconnection的引用),其内部会调用一个remoteconnection.createconnection()方法,并返回一个远程的statement引用;jwconnectoin的createstatement方法会创建一个jwstatement对象;最后一个jwstatement对象会返回个客户端,这个对象中包含的statement的引用:
  
  public statement createstatement() throwssqlexception{try{iremotestatement remstmt =(iremotestatement) remoteconnection.createstatement();jwstatement localstmtinstance = new jwstatement(remstmt);return (statement)localstmtinstance;}}
  
  描述了客户层和中间层中connection和statemennt类之间的关系。
  
  connection和statement之间的关系
  
  下面再让我们来看看jwstatement类
  
  jwstatement类
  
  com.jw.clent.jws

扫描关注微信公众号