版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、多数据库中间件数据访问驱动程序的设计与实现答辩人:黄永吉导师:齐德昱教授专业:计算机软件与理论课题背景全球进入以网络为中心的计算时代,企业间信息共享集成、电子商务、电子政务等应用层出不穷。信息需求不仅只局限于某一个部门内数据库的相互访问,而更多的是需要对涉及到不同部门之间异构数据库的数据共享。各职能领域如政府、银行、电信等虽都已建有各自的数据库系统,但都属于结构松散、关系封闭、隶属独立的局域数据库系统。多数据库应用是以多个不同的局域数据库(即异源数据)为操作对象的数据库应用,它是对异源数据的集成、上推、复用。随着各种局域数据库系统的逐步完善,以及计算机网络的发展,多数据库应用将成为数据库领域的
2、新焦点。 课题来源本课题是广东省重大软件专项“兼容标准SQL及数据库面向对象编程接口的多数据库中间件的模型的研究”中的一个子课题。专项课题提出研发一种新型意义的面向多数据库应用的垂直中间件,通过数据主可编程的“上推”方式,按集成化的统一关系数据库视图进行异源独立分布数据的存取和复用,把关系数据库管理系统(RDBMS)的概念拓广到异源数据,使对异源独立分布数据的存取复用像访问单一关系数据库一样有相应的语言环境支持和走向模型化,即实现建立“DBMS Over DBMS”,完全屏蔽异源数据带来的访问障碍。专项课题的总体构想是通过可编程的中间件架构来实现异源数据的单一化体系结构,并针对多数据库数据的规
3、范化复用,将多数据库中间件模型设计成基于数据上推规则和中间件,即采用“上推机集成机驱动程序”的体系结构。 多数据库中间件模型的体系结构 数据源层 数据源(各种SQL Server、XML文档、其他)上推规则上推机(中间件)局部代理SQL转换器更新描述表上推语言解释器MDB上推语言程序更新监听器数据源(各种SQL Server、XML文档、其他)上推规则上推机(中间件)局部代理SQL转换器更新描述表上推语言解释器MDB上推语言程序更新监听器广域网SQL更新语句SQL更新语句数据库用户层集成机(中间件) SCUTDOD-Server 应用程序兼容SQL/ODBC/JDBC/.应用程序兼容SQL/O
4、DBC/JDBC/.更新监听器SQL语句表SQL执行器SQL语法分析器命令行监听器TCP/IP监听器管道监听器(JDBC/ODBC/)驱动程序(中间件)驱动程序管理器JDBC/ODBC APIJDBC/ODBC APISQL更新语句MDB-APIMDBBuffer下推条件表课题目标本研究课题就是多数据库中间件模型体系结构中的数据访问驱动程序,它为上层客户应用程序提供多数据库中间件模型的数据访问接口,使上层应用程序只需按数据主提供的外延数据模式,使用传统的编程方法(如SQL、JDBC、ODBC等)存取访问异源数据,从而实现应用程序按普通数据库的访问方式来访问广域数据库。 驱动程序的发展概况目前数
5、据访问驱动程序主要有四大种类: JDBC Driver 、ODBC Driver、OLEDB DataProvider 、.NET DataProvider等。专门生产驱动程序的工业界厂商如OpenLink和DataDirect等,它们的产品涵盖了四大种类的驱动程序。 开源数据库厂商如MySQL提供MySQL Connector/JDBC,ODBC,.NET等驱动。国内华中理工大学数据库与多媒体研究所研制了主动型多媒体数据库管理系统DM2并研发了DM2的JDBC和ODBC驱动程序。目前SUN公司认可的驱动程序库里共有220多种各数据库厂商的JDBC驱动程序,其中大多数实现了JDBC1.0或2.
6、0,小部分达到了JDBC3.0的标准。所有上述驱动程序大都是针对局域数据库应用的,没有针对多数据库应用的驱动程序,更没有上升到多数据库中间件驱动程序的高度。 微软通用数据访问体系结构 RDOODBC应用程序/浏览器ADOOLEDBDAO关系型数据(RDBMS)非关系型数据(文本、邮件等)MainframeJ2EE数据持久层存储访问技术 Java数据库互连接口JDBC属于底层API,直接调用SQL命令,是构造高层API和数据库开发工具的基础。 嵌入式SQL技术 SQLJ把静态SQL语句以文本形式内嵌入Java程序代码中,在编译时检查和优化SQL语句,SQLJ预处理器把Java/SQL混用的程序翻
7、译成带有JDBC调用的纯Java语言程序 。SQLJ组成部件包括转换器、运行器、定制器。 Java数据对象 JDO存储Java对象的规范,使用 POJO来装入和存储持久数据,目标在JAVA平台上提供面向对象的数据持久存储机制来实现对象级的持久化。组件构成:应用程序、业务对象、持久性管理器、类元数据、底层数据存储。 EJB组件(BMP、CMP)和数据访问对象(DAO)模式 实体Bean代表以持久存储机制保存的数据源中的数据,DAO模式是一个位于业务层之上的集成层的模式,它提供了操作对数据源的透明访问机制。 对象关系映射(O/R)技术:将Java对象状态映射到数据库表上,提供透明的持久化操作。开源
8、项目Hibernate、Castor 。驱动程序种类的选择ODBC、OLEDB、ADO.NET 为微软提供的数据访问接口标准,其中ODBC相对于后两者而言是一种最底层的接口。虽然ODBC也解决了异构数据库互连的问题,但是ODBC主要应用于Windows平台,不支持跨操作系统平台的应用特性;驱动程序管理器和驱动程序必须在每台客户机上分别安装、配置;ODBC是C语言API接口,是面向过程的编程接口;JDBC是Java的数据库互连访问接口规范,它定义了跨数据库、跨平台的通用SQL数据库标准API,而且所有高层API最终将被翻译为JDBC API。 JDBC建立在Java语言基础上,比ODBC更简洁、
9、易用;JDBC确保“100%纯Java”的解决方案,JDBC驱动程序可以通过Web浏览器自动下载,客户机不用安装任何代码,充分体现B/S结构的优点。Java是面向对象编程语言,在JDBC中所有部件都是对象,API都封装在类中。只有实现JDBC驱动程序才能更准确地体现“面向对象数据库访问接口”的命题目标,而ODBC驱动程序只是作为辅助备选方案并给出初步实现。 课题研究内容JDBC驱动程序的框架设计,包括驱动程序的类型选择、总体结构及模块划分、功能定义、设计原则、使用的关键技术、工作流程及原理等。 JDBC驱动程序各组成部分的详细实现,包括驱动程序与多数据库SQL服务器的专用特定网络消息通讯协议的
10、定义和实现 、驱动程序接口、数据库连接及元数据接口、语句接口、结果集及元数据接口、数据源接口、连接缓冲池机制、事务机制等对象的具体实现。ODBC驱动程序的设计与初步实现,包括ODBC驱动程序的应用流程、实现方案、关键数据结构定义、连接管理、通信处理、SQL语句执行和结果获取、安装设置等功能部分的具体实现。 JDBC驱动程序的类型 类型1类型2类型4类型3l 类型1JDBCODBC桥加ODBC驱动程序(非完全Java)l 类型2本地API部分Java驱动程序(非完全Java)l 类型3用于数据库中间件的JDBCNET纯Java驱动程序(完全Java)l 类型4本地协议直连数据库纯Java驱动程序
11、(完全Java)驱动程序的功能建立和断开与数据库服务器的连接或访问任何表格格式的数据源; 向数据源或数据库服务器发送提交要执行的SQL语句 ; 接收处理数据源或数据库服务器返回的结果数据,包括将数据类型转换成应用程序或编程语言所指定的类型。初始化事务管理(对应用程序透明); 检查未被驱动程序管理器检测到的异常错误; JDBC驱动程序的框架结构 驱动程序消息通讯处理模块 驱动程序JDBC接口实现模块 MdbConnectionPoolDataSourceMdbDataSourceFactoryMdbServerDriverNonRegisteringDriverMdbPooledConnecti
12、onMdbDataSourceMdbConnectionMdbStatementMdbPreparedStatementMdbCallableStatementMdbDatabaseMetaDataMdbResultSetMdbUpdateableResultSetRowDataMdbResultSetMetaDataStaticRowDataDynamicRowDataMdbServerNetIOConnectionWrapperJDBC驱动程序工作流程及原理 (1)加载JDBC驱动程序(java.sql.Driver);有四种方法:标准Class.forName方法;直接创建驱动程序对象;
13、向java.lang.System类中的属性jdbc.drivers增加增加驱动程序类名;properties属性设置文件(2)建立与数据源的连接对象(java.sql.Connection);JDBC 的URL:jdbc: jdbc:scut:mdbserver:/:;user=value1;password=value2 两种建立方法:DriverManager和DataSource对象(3)创建语句对象(java.sql.Statement); (4)用语句对象执行SQL语句并返回结果集对象(java.sql.ResultSet)(5)处理语句对象执行SQL语句返回的结果集对象,获取或更
14、新数据; (6)对服务器的数据访问结束后,关闭结果集、语句、连接对象; 驱动程序中主要接口和类的关系驱动程序和服务器消息通信工作流程 (消息通讯机制一)启动主线程,初始化参数创建套接字工厂实例套接字工厂创建服务器指定端口的客户端Socket获取和创建客户端Socket的输入输出数据流启动主线程进行网络初始化,创建指定端口的监听器线程和服务器端ServerSocket启动监听器线程,侦听客户端连接请求监听器接收客户端连接请求获取和创建ServerSocket的输入输出数据流发送握手连接请求消息监听器接收请求并进行握手校验,然后发送应答消息响应消息类型是否正确?握手校验是否通过?抛出SQL异常用于
15、被外部程序捕获通信结束,断开连接通信结束,关闭子通信线程创建客户机子通信线程握手请求握手响应连接请求结束通信是否是否发送SQL命令接收结果响应驱动程序消息通讯机制(二) “握手”连接(HandShake):驱动程序与服务器进行初始化通信,处理用户登录注册校验和解决初始化连接错误等工作 。“套接字工厂”(SocketFactory)驱动程序共需创建三种类型的套接字,即:标准的TCP/IP套接字、管道套接字和SSL(安全套接字层)套接字 在驱动程序中给出了一个抽象套接字工厂接口MdbSocketFactory和三个具体的套接字工厂类:MdbStandardSocketFactory类、MdbNam
16、edPipeSocketFactory类和MdbSSLSocketFactory类,分别对应上述的三种套接字。MdbSocketFactory接口使用了抽象工厂设计模式,三个套接字工厂类则使用了工厂设计模式和单态设计模式,将创建套接字的工作与使用套接字进行通信的工作分开。抽象工厂模式将客户及产品的类名与具体工厂类的实现分离;工厂模式将一个类的实例化延迟到其子类;使用Singleton模式保证一个工厂类仅有一个实例并提供一个全局访问点,以严格控制对唯一实例的受控访问。驱动程序消息通讯机制(三)MdbStandardSocketFactory类创建的是标准TCP/IP套接字,在Java中对应.So
17、cket类 ;MdbNamedPipeSocketFactory类创建的是管道套接字,对应自定义的NamedPipedSocket类,用来表示一个有名管道。java.io.RandomAccessFile类型变量namedPipeFile,支持随机读写管道文件。在管道通信机制下,驱动程序首先与管道文件进行通信(读写消息),然后管道文件通过输入输出数据流与服务器进行通信。 MdbSSLSocketFactory类创建的是SSL套接字,对应.SSLSocket。为确保数据的安全性, SSL提供了以下功能:数据加密、数字签名、建立完整的安全性连接,即SSLHandshake。 驱动程序消息通讯机制(
18、四)驱动程序通过Socket的输入输出数据流与服务器进行消息通信。Java中的数据流指的是数据通信通道,它高度抽象了底层网络数据通信的细节,并且独立于操作系统。数据流分为两大类:字符流和字节流。驱动程序中使用了四种类型的字节流:DataInputStream/DataOutputStream,BufferedInputStream/BufferedOutputStream。选择前两个类是因为可以直接从这两个数据流输入或输出各种Java类型的数据,即:用与机器无关的方式从底层字节流读取或写入字节数据,并自动完成字节和原始Java数据的类型转换而后两个类可为真正的输入输出数据流添加一个缓冲区。驱动
19、程序中使用UTF8作为消息数据的编码方法。 UTF8是一个Unicode字符集的8位字节无损编码标准,它将每个Unicode字符编码成1至4个字节。MdbServerNetIO类专门负责建立驱动程序与服务器之间的SOCKET连接和在底层从网络上发送和接收数据流。由于它使用了外观模式来封装所有驱动程序与服务器通信的功能及细节,所以使驱动程序JDBC接口实现模块与底层通信协议无关。 驱动程序消息通讯机制(五)驱动程序与服务器交互信息的基本单位是消息结构,用类MdbMessage来表示。这个类是所有具体消息类的基类,它使用了值对象(ValueObject)模式。ValueObject代表单个消息对象
20、的结构视图,它是一个不可变的可串行化对象,通过减少分布式通信消息来促进数据交换。类MdbMessage定义的代码片断如下 public class MdbMessage implements java.io.Serializable private String strMsgType; /消息类型 private int iMsgNumber; /消息序号 private int iMsgLength; /消息长度(字节数) private int iMsgDefaultLen; /消息默认长度 private boolean bMsgHeadFlag; /消息头标志 private bool
21、ean bMsgTailFlag; /消息尾标志 public String getMsgType(); /获取消息类型 public void setMsgType(); /设置消息类型 在SCUTDOD JDBC驱动程序中共定义了14种具体类型的消息。 驱动程序管理器和驱动程序对象 驱动程序管理器即DriverManager类,是管理JDBC驱动程序集合的基本服务,它跟踪维护JDBC客户端可用的驱动程序类的DriverInfo对象向量(Vector)集合并处理在数据库和合适的驱动程序之间建立连接的细节。当JDBC客户端请求建立连接时,DriverManager按照驱动程序的注册顺序,依次用
22、向量集合中每个驱动程序对象的connect方法进行连接测试,第一个能识别出目标URL的驱动程序对象将被用于建立连接。实现Driver接口的是NonRegisteringDriver类,真正的驱动程序类是其子类 MdbSeverDriver,它只包含一静态初始器用于注册DriverManager。NonRegisteringDriver类中最重要的方法是connect方法,它真正负责建立与服务器的连接,包括用正则表达式字符串解析JDBC URL来获取连接属性集合(Properties )参数和创建连接对象(MdbConnection)。此外,所有驱动程序属性信息都存放在DriverPropert
23、yInfo 类型数组中。 连接对象和语句对象(一)JDBC规范中定义的连接(Connection)对象代表一个数据源连接。从驱动程序的观点看,一个连接对象表示一个客户会话(session),它含有一系列状态信息,如用户ID、SQL语句、结果集和事务语义等。驱动程序中MdbConnection类实现了Connection接口,它实现的方法包括服务器连接的建立关闭,事务的提交回滚,各种语句对象的创建,SQL语句的执行和结果集的返回,存储过程的调用和返回等。将执行SQL语句、调用存储过程等工作也放在类中是为了把对服务器的逻辑操作集中在Connection对象中。另外类中还定义了一MdbServerN
24、etIO类型的实例成员变量io,驱动程序中所有的消息通讯操作都通过此变量来进行。连接对象建立后就可用于向服务器发送SQL命令。JDBC规范定义了三种语句对象来实现SQL语句的发送执行,即Statement、PreparedStatement和CallableStatement对象。相应地在连接对象中提供createStatement、prepareStatement、prepareCall等三种方法来创建 。连接对象和语句对象(二)Statement1Statement2Statement3Connection1Connection2Connection3 StatementConnectio
25、n1Connection2Connection3PreparedStatement Statement对象:没有参数的静态SQL语句,只返回一个结果集; PreparedStatement对象:存储在其内部的已经预编译的SQL语句,可以包含一个或多个IN参数,执行时仅需传入所需的IN参数而不用重新编译SQL命令,故速度比Statement对象快,可被用于有效的多次执行经常重复使用的SQL语句;CallableStatement对象:数据库存储过程,可返回一个或多个结果集和INOUT、OUT参数。 连接对象和语句对象(三)缓存PreparedStatement对象 cachedPreparedS
26、tatementParam为存储解析准备语句对象信息的缓冲区,它是一个映射(java.util.Map)对象,用于存储SQL语句字符串和对应的解析了的PreparedStatement参数值;从映射对象cachedPreparedStatementParam取出SQL语句对应的解析了的PreparedStatement参数值并将其类型转换为MdbPreparedStatement的内嵌子类ParseInfo类型 若缓冲区已满,则按照最近最久未使用(LRU)算法,找出最近使用时间最早(lastUsedTime值最小)的SQL语句,将它和对应的参数对象从映射缓冲区中删除,将本次新创建的SQL语句和
27、对应的参数对象插入映射缓冲区。 输入(IN)参数绑定执行时将带有参数的SQL语句转换成一个确定的SQL语句字符串发送给服务器,参数绑定的过程是将SQL语句中的所有问号依次替换成相应参数值的字符串类型, 连接对象和语句对象(四)多线程并发访问共享数据资源协调问题起因:JDBC规范允许多个连接同时访问一个数据源;互斥量(mutex)对象:计数器的最大值为1的信号量对象;Java的同步多线程并发活动的监视器(monitors)机制:保证在一个时间内仅允许一个线程执行一块由监视器保护的代码区域。 同步机制的执行过程在执行代码保护区程序体之前,计算互斥量对象(设其名为V)的引用计数;各执行线程竞争获取与
28、对象V相关联的互斥锁(设其名为L);一旦某个执行线程竞争拥有互斥锁L后就对它加锁,其他线程都不能获取锁L;只有拥有锁L的线程执行代码保护区程序体,执行完毕后不论是正常退出还是意外中断都释放锁L,以继续给其他线程竞争使用。结果集对象(一)ResultSet接口表示一个数据库结果集的数据表,它用于获取和操作SQL查询语句执行的结果。JDBC允许创建可滚动或可更新的结果集对象。功能:用getter方法获取结果集对象的数据,用updater方法更新结果集对象,移动游标。三种游标操纵方式:仅向前游标、可滚动不敏感游标、可滚动敏感游标;(敏感是指当结果集对象打开时它能反映底层数据源的数据更新)两个并行级别
29、: 只读、可更新;并行性决定所支持的更新功能的级别。驱动程序中MdbResultSet类实现了ResultSet接口,但并不是JDBC标准意义上的结果集,还可表示执行数据更新语句后的受影响的行数。MdbResultSet为静态不可更新结果集,即一次全部取回查询结果形成“快照”,其子类MdbUpdatableResultSet为可更新的动态结果集 ,仅当移动结果集的游标时才访问服务器并获取结果集的一行数据。 结果集对象(二)驱动程序专门设计行数据接口RowData,用于抽象出结果集对象访问数据表行数据的操作。类StaticRowData和DynamicRowData实现RowData接口,分别用
30、于构建MdbResultSet对象和MdbUpdatableResultSet对象。StaticRowData定义了一向量rows来存储结果集的静态“快照”,获取数据和移动游标操作都是在快照rows中进行而不用访问服务器。DynamicRowData定义了一字符串数组nextRow来存储移动游标后所取得的行数据,每次移动游标操作都必须调用MdbServerNetIO对象来与服务器进行消息通信,每次更新操作都动态生成相应的SQL操作语句并执行。 成员方法具体说明boolean isBeforeFirst() 判断游标是否在第一行之前的位置 void afterLast()移动游标到最后一行之后的
31、位置void beforeFirst()移动游标到第一行之前的位置void beforeLast()移动游标到最后一行之前的位置void close()关闭RowData对象String getAt(int index)获取指定行号的行数据int getCurrentRowNumber()获取当前游标所指向的行号ResultSet getOwner();获取拥有本RowData的ResultSet对象boolean hasNext()判断结果集对象中是否还有行数据String next() 移动游标获取下一行数据 数据源对象JDBC2.0新引进的数据源对象表示一个物理数据源和创建这个数据源连接
32、对象的工厂,它通常要用基于JNDI API的命名服务注册。数据源接口的实现类型:基本,连接池,分布式事务。分别对应JDBC定义的三个接口:DataSource、ConnectionPoolDataSource、XADataSource 。驱动程序中MdbDataSourceFactory类为专门创建数据源对象的抽象工厂类,它实现了javax.naming包的ObjectFactory接口,JNDI框架允许通过它建立的线程安全对象实现可被动态装载。MdbDataSource类实现了DataSource接口,同时还有引用(Referenceable)和串行化(Serializable)接口。定义了
33、一个标准的属性集来识别和描述真实世界的数据源 ;类中的静态初始器,不通过DriverManager注册,直接调用驱动程序类的connect方法建立连接。使用JNDI上下文(Context)对象绑定到JNDI目录服务器并用于以后的查找。 连接缓冲池机制(一) 连接池技术通过维护一个存储在客户会话之间能被重用的物理数据库连接的缓冲区来解决打开、初始化、关闭物理连接而产生的开销问题,极大提高了客户程序和应用程序服务器的性能和可伸缩性。 JDBC 应用程序JDBC驱动程序(连接池管理器)PooledConnection对象缓冲池服务器数据源Datasource APILogical Connectio
34、n ObjectPhysical PooledConnection ObjectConnectionPoolDataSource API连接缓冲池机制(二)MdbConnectionPoolDataSource类实现ConnectionPoolDataSource接口,它提供从连接池中获取逻辑连接句柄的功能。 自定义类MdbConnectionPool,用于实现连接池管理器,负责物理连接到逻辑连接句柄之间的映射;定义一向量(Vector) freeConnections来表示连接池,所有可用MdbPooledConnection对象都登记在向量中。 MdbPooledConnection类实现
35、了PooledConnection接口,它表示缓冲池连接,获得的是ConnectionWrapper对象,表示一个包装了物理连接的逻辑连接句柄对象。 事务机制 自动提交模式,用于描述事务边界。 事务隔离级别READ、READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE 静态映射mapTransIsolationName2Value存储事务隔离级别的名字和值。保存点(savepoint) ,在事务中标志中间点以提供粒状事务控制,用于部分回滚事务。 用数组列表 (java.util.ArrayList)缓冲存储事务中包含的所有SQL语句。 JDBC规范中的分布式事务基础结构事务管理器:控制事务边界和管理两阶段提交协议,并且实现JTA。 JDBC驱动程序:实现了javax.sql包的XADataSource、XAConnection和javax.transacti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水库气候变化适应策略
- 城镇生活污水处理项目运营管理方案
- 钢结构防水设计方案
- 人行道及非机动道设计
- 燃气管道施工周边环境保护方案
- 水资源管理信息系统建设
- 燃气设备安装规范
- 给水设施验收标准
- 智能空调控制系统设计
- 雨水排放口设置规范
- 2026年广东农垦火星农场有限公司公开招聘作业区管理人员备考题库及参考答案详解
- 肿瘤化疗导致的中性粒细胞减少诊治中国专家共识解读
- 2025年查对制度考核考试题库(答案+解析)
- 云南省2025年普通高中学业水平合格性考试历史试题
- 八年级上册历史【全册】知识点梳理背诵版
- 《工会法》及《劳动合同法》教学课件
- 股权转让协议书常电子版(2篇)
- 2023年副主任医师(副高)-推拿学(副高)考试历年高频考点真题演练附带含答案
- 产品质量法课件
- 《食品包装学(第三版)》教学PPT课件整套电子讲义
- plc电机正反转-教案
评论
0/150
提交评论