Microsoft Jet Database Engine


请输入要查询的词条内容:

Microsoft Jet Database Engine


版 权 声 明

(1)本文译自维基百科(WikiPedia),原文地址如下:

http://en.wikipedia.org/wiki/Microsoft_Jet_Database_Engine#cite_note-0

无法登录维基百科的朋友可以参考如下地址:

http://docs.google.com/Doc?id=dwdwvtj_178cvtn9pcd

(2)根据维基百科的版权策略,本文内容在GNU Free Documentation License, Version 1.2下发布。

(3)关于GNU Free Documentation License,参考下列地址:

http://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License

这里有一个简体中文翻译版本:http://www.linuxfocus.org/Chinese/team/fdl.html

(4)从维基百科原文历史中可以看到最近修改过原文的几位作者如下:(2008/06/22为止)

Christopher G Lewis

SmackBot

Xpclient

Chowbok

S ried

Voyagerfan5761

Soumyasch

(5)本文译者:David Lau (stillicel@gmail.com )

本文专门讲述Microsoft Access的底层数据库引擎JET Red;除了JET Red,Jet里还包括了一个被称作Jet Blue的ISAM实现。关于Jet Blue,请参考Extensible Storage Engine。

作为数据库的底层组件,数据库引擎的主要功能体现在它能把信息有规律地存储在计算机上。Jet是微软开发的一种数据库引擎,微软还以它为基础开发出了若干种产品,其中包括著名的Microsoft Access。Jet的第一个版本出现于1992年,当时它主要包括三个数据库处理相关的模块。

JET 是Joint Engine Technology的缩写,它的正式名称是“微软Jet数据库引擎(Microsoft JET Engine)”,但我们更喜欢用Jet这个简单而直接的叫法。Microsoft Access使用Jet作为其默认的数据库引擎,Visual Basic也曾这么做。不过,现在Jet已经被微软的其他产品取代了,地位大不如从前了。关于Jet的继任者安排问题,微软显得左右摇摆:首先是MSDE (Microsoft Desktop Engine),接着是SQL Server 2005 Express Edition,最近又换成了SQL Server 2005 Compact Edition。除此之外,你也应该了解,微软的MDAC(Microsoft Data Access Components)里也不再包括Jet了。因此,如果你需要更大型的数据库,可以考虑“升级”(按照Microsft的说法是“up-sized”)到微软的旗舰产品SQL Server 2005。

多年来,Jet已经成为 Microsoft Access的代名词,以致于许多人错误地认为Jet数据库即是Microsoft Access数据库,甚至连微软的人有时候也搞错。但是针对Jet这个术语的误用现象应该得到纠正——Jet是一种数据库,而Microsoft Access是一种数据库应用程序开发工具。

内容概要

1 架构(Architecture)

1.1 锁(Locking)

1.2 事务处理(Transaction processing)

1.3 数据完整性(Data integrity)

1.4 安全(Security)

1.5 查询(Queries)

2 历史回顾

3 未来展望

4 参考资料

架构(Architecture)

Jet 能够用于操作关系数据库,它同时也是关系数据库管理系统(Relational Database Management System,RDBMS)的一部分。其他软件可以利用Jet提供的接口来访问微软数据库产品里存放的数据;Jet也提供安全、参照完整性(referential integrity)、事务处理(transaction processing)、索引(Indexing)、记录(Record)、页级别锁定(page locking)和数据库复制(replication)等功能支持。较新版本的Jet有一些功能上的增强,它能执行SQL查询(SQL query),能以Unicode格式存储字符数据,支持视图(database view),也能实现与Microsoft SQL Server之间的双向复制(bi-directional replication with Microsoft SQL Server)。

Jet 由三个模块构成:第一个是Native Jet ISAM Driver——这是一个DLL,它使用ISAM(Indexed Sequential Access Method)技术操作Microsoft Access数据库文件(*.mdb);第二个模块是ISAM Driver——这是一组DLL,用于访问诸如Xbase、 Paradox、 Btrieve、FoxPro之类的ISAM数据库文件;最后一个模块是DAO DLL( Data Access Objects)。DAO提供了一组方法,允许程序员使用VBA(Visual Basic for Applications)和VB访问Jet数据库。

锁(Locking)

Jet 允许多用户并行访问数据库。它采用了一种数据写入锁机制(data write locking policy),当多个用户同时对数据库执行写操作时数据不会遭到破坏。用户只能修改那些已经被加锁的记录,加锁让用户以独占的方式操作特定数据库记录直到锁被释放为止。Jet 4.0之前一直使用页面锁模型(page locking model),Jet 4.0开始支持行级锁模型(record locking model)。页面(Page)指的是一种长度固定的数据结构——Microsoft的数据库物理上是由一个个页面组成的,Jet 4.0之前一个页面的大小2KB,Jet 4.0开始变为4KB。然而,用户终究是以记录(Record)为单位来存取数据的,一条记录占据的空间可能不足一个页面,也可能多于一个页面。页面锁模型一次只能锁定整数个页面,而不是单个记录,这意味着某些时候使用页面锁模型可能导致一条多条记录被锁住。

微软使用了两种锁定机制:悲观锁(pessimistic locking)和乐观锁(optimistic locking)。如果使用悲观锁,当一个加锁请求发生时目标记录(Record)或者目标页面(Page)立即会被锁住。乐观锁则不然,它会等到所有的数据库记录(Record)修改都完成后才动作。尽管目标记录或者目标页面被锁住的时间会很短,但在这段时间内其他用户还是无法访问它们;使用乐观锁能尽量缩短目标记录或者目标页面被锁住的时间,这意味着发生锁定冲突(Lock Conflict)的可能性更低一些。然而,使用乐观锁也更容易导致数据库更新失败,因为别的用户可能会抢先一步锁住你想要的那条记录;如果使用悲观锁就不会发生这种情况——只要你能成功锁定目标记录则更新必然会被执行。一般来说,使用悲观锁比较容易导致锁定冲突。如果遇到锁定冲突,用户必须等到修改完成,锁定被释放才能继续更新数据库,也有可能因为超时导致请求失败。

事务处理(Transaction processing)

Jet 具有大多数数据库都支持的事务处理能力。不过,此处需要澄清一下,这里说的是“大多数”,而不是“全部”;换句话说,并非所有数据库都有这种能力—— ODBC数据库仅支持一级事务处理(one level transaction processing),而像Paradox这样的ISAM数据库没有事务处理能力。事务指的是在数据库中进行的一组动作,他们必须一起完成——这被称作原子性(atomicity),它是ACID(Atomicity, Consistency, Isolation, and Durability)的一部分;对于数据库系统的事务处理,ACID是极端重要的概念。Jet 3.0之前,为了执行事务处理,程序员必须先手动开始一个事务,接着执行各种数据库更新,最后提交(Commit)事务。在事务提交动作发生之前,所有操作只会发生在内存里,并不实际写入磁盘。比起来单纯的数据库更新操作,事务有许多优势,其中最重要的一点在于:执行过程中如果发生了错误,能够取消整个事务,数据库里的数据不会遭到破坏。取消事务的动作被称作回滚(Rollback),它能够把数据记录精确地恢复到事务开始前的状态,就好像什么也不曾发生过一样。在一系列原子操作执行过程中如果发生了故障,事务能够保证数据的一致性。事务处理的独特之处在于它能保证一组操作要么全部成功,要么全部失败(这意味着数据库重启时会自动放弃数据更动),不会出现仅仅有一部分更新操作结果被写入磁盘的情况。顺便说一下,使用ODBC的in-memory机制,也能做到让全部更新动作先行发生在内存里,最后仅执行一次昂贵的写入磁盘。

Jet 3.0开始支持隐式的事务(Implicit transactions)。当最后一个事务被提交之后,数据库会自动开启一个新的事务。最初的时候当执行DML SQL语句时Jet也会自动开启一个隐式事务,不久人们就发现这在一定程度上会影响程序性能;因此,Jet 3.5去掉了它。

数据完整性(Data integrity)

Jet 强制执行实体完整性(entity integrity)和参照完整性(referential integrity)。实体完整性是关系数据库的关键概念之一,它保证记录不会重复存在,并且主键(primary key)也不会被赋值为NULL。当然,Jet也支持主键。参照完整性指的是外键(freign key)必须和数据库内业已存在的主键相一致。如果一个外键值存在,但在被参照表里却没有与之对应主键,那么参照完整性就被破坏了,这将导致两个表的数据无法保持一致性。

举例来讲,一个音乐爱好者可能会建立一个数据库,其中存储了艺术家以及音乐作品相关的信息。在这个例子里面,一个艺术家可能拥有许多唱片,但一张唱片只能属于一个艺术家。于是我们创建了两个表:Artist和 Album。Artist表以artist_id为主键,Album表以album_id为主键。 Album表有个字段artist_id,它作为外键,和Artist表的同名主键artist_id含义相同。如果一个艺术家的记录(Record)出于某种原因从Artist 表里被删除掉了,而在Album表里该艺术家的唱片记录却依然存在的话,参照完整性就已经被破坏了。默认情况下,Jet会阻止这种事情发生;而且,Jet 也支持级联更新和级联删除(cascading updates and deletes)。如果针对album表设置了“级联删除”,那么在前面那个例子里,当一个艺术家被从Artist表里删除的时候,那个艺术家的所有唱片都会从Album表里自动删除。

Jet 也支持所谓的“业务规则(business rules)”,也被称作“约束(constraints)”。约束是应用于某些字段的条件和规则,能强制做到“只有符合这些要求的数据才会被放到表里 ”。例如,可以通过添加约束来保证过去的日期和时间值不会写入date_logged字段,或者要求一个数值字段只接受大于0的数值。

安全性(Security)

对 Jet数据库的访问需以用户为单位。用户信息存放于单独的系统数据库(System Database)里,并且Jet在数据库对象(例如:表、查询)级别上实现访了问控制。从Jet 4.0开始数据库管理员可以使用CREATE、ADD、ALTER、DROP USER以及DROP GROUP等SQL命令完成安全性设置。上述命令都是ANSI SQL 92标准的子集。数据库管理员也可以使用GRANT/REVOKE命令(※参考资料1)。除此之外,从Jet 2.0开始程序员已经可以使用DAO编程实现数据库安全性的设置了。

查询(Queries)

Jet 可以用于查询并获取数据库中的数据。我们可以通过Microsoft QBE(Query By Example)、Microsoft Access的SQL窗口或者Microsft Access Basic的DAO(Data Access Objects)语言来定义查询。Jet先将查询转换为SELECT SQL语句,之后进行编译。编译是一个复杂的过程,它不仅执行诸如语法检查、确定目标字段归属哪个表之类的语法解析动作,还会将SQL转换成一种树形结构,称作“Jet内部查询对象(internal Jet query object)”。除了上述动作,对于Jet 3.0以后的版本而言,还将调用Microsft Rushmore查询优化技术执行优化动作。最后,Jet会执行查询并将结果返回给应用程序或者用户。

Jet 以一种动态记录集(Dynaset)的形式返回查询结果。所谓“动态记录集(Dynaset)”指的是一组动态地关联到后台数据库的数据。动态记录集允许用户直接查看或者修改其中的数据,而仅仅把查询结果存入临时表的做法则无法实现直接修改。假定一个大学教师查询所有学生的成绩时发现其中某条存在错误,那么他只需要修改动态记录集里的数据即可,因为动态记录集会自动更新后台数据库;也就是说,他没有必要先将查询结果存入一个临时表,然后再专门针对那条错误数据执行一条更新查询(update query)。

历史回顾

Jet 始于1992年,那个时候Microsoft内部的数据库产品项目组正在开发一种代号为Cirrus底层数据访问技术。Cirrus是用VB的早期版本实现的,它被用作Microsoft Access的数据库引擎。Tony Goodhew当时正在Microsoft工作,他说——

到了那个阶段,基本上可以说Jet项目组所做的工作已经超越了最初的目标。最初项目组的任务仅仅是为Microsoft Access开发数据库引擎模块,而不是完成一个通用组件。在那之后,VB 3.0项目组为了将Jet移植到VB上,不得不先设法把Jet从Micrisoft Access里分离出来。这也就是为什么VB 3.0也和Microsoft Access一样有那么多Jet/ODBC方面的问题。

由于Access ODBC开发组使用Jet的一部分代码实现了ODBC驱动程序,随Microsoft Access 2.0发布的Jet新版本变得更加组件化了。这个版本的一个改进是允许VB 3.0调用新版本的Jet。(※参考资料2)

表1 Jet DLLs

------------------------------------------------------------------------------

Jet version        Jet engine        DLL file name        MDB version

------------------------------------------------------------------------------

1.1        1.10.0001         MSAJT110.DLL        1.0 / 1.1

2.0 (comlyr)        2.00.0000        MSAJT200.DLL        1.0 / 1.1 / 2.0

2.5 (accsvc)        2.50.1606        MSAJT200.DLL        1.0 / 1.1 / 2.0 / 3.0

2.5 (VB4 16)        2.50.1606        MSAJT200.DLL        1.0 / 1.1 / 2.0 / 3.0

3.0        3.0.0.2118        MSJT3032.DLL        1.0 / 1.1 / 2.0 / 3.0

3.5         MSJET35.DLL        1.0 / 1.1 / 2.0 / 3.0

4.0 (SP7)        4.0.7328.0        MSJET40.DLL        1.0 / 1.1 / 2.0 / 3.0 / 4.0

-----------------------------------------------------------------------------

※数据来源

http://support.microsoft.com/kb/178880/en

http://support.microsoft.com/kb/282010/en

表2 Jet版本

-----------------------------------------------------------------------------

Application/Version        Jet version

-----------------------------------------------------------------------------

Microsoft Access 1.0        1.0

Microsoft Access 1.1        1.1

Microsoft Access 2.0        2.0

Microsoft Access 2.0        2.5 with Microsoft Access Service Pack

Microsoft Access 7.0        3.0

Microsoft Access 97        3.5 with Office 97

Microsoft Access 97 SR1        3.5 with Office 97SR1

Visual Basic 3.0        1.1

Visual Basic 3.0        2.0 with Visual Basic Compatibility Layer

Visual Basic 3.0        2.5 with Microsoft Access Service Pack

Visual Basic 4.0 16-bit        2.5

Visual Basic 4.0 32-bit        3.0

Visual Basic 5.0 32-bit        3.0

Visual Basic 5.0 32-bit        3.5

Visual C++ 4.X         3.0

Visual C++ 5.0         3.5

Jet 3.51 (web download)        3.51 (3.5 Binary compatible)

Microsoft Access 2000 Standard Edition 4.0

Microsoft Access 2002 Standard Edition 4.0

Microsoft Access 2003 Standard Edition        4.0

----------------------------------------------------------------------------

※来源:

INFO: Identifying the Jet Database Engine Components(http://support.microsoft.com/kb/178880/en )

How to find information about Microsoft Jet 4.0 Service Pack 7(http://support.microsoft.com/kb/282010/en )

Jet 2.0以数个DLL(dynamic linked libraries)的形式出现,Microsoft Access等应用程序中用到了它们。Windows下的DLL文件是可以被多个应用程序共用的代码库——把多个应用程序的共通部分抽出来,做成功能通用而代码相互独立的代码库是减少维护工作量、提高开发效率的好办法。Jet 2.0由三组DLL组成:Jet DLL、DAO DLL和ISAM DLLs。Jet DLL知道正在访问的数据库属于何种类型以及如何执行客户端应用程序发过来的请求。如果数据源是MDB文件(即Microsoft Access文件),Jet DLL将直接读写文件中的数据。如果是外部数据源,Jet DLL将调用ODBC驱动程序来执行客户端应用程序的请求。DAO DLL提供了一组接口,程序员藉此能够访问Jet引擎。Visual Basic程序员和Access Basic程序员会经常使用DAO DLL。ISAM DLLs是一组模块。有了它们,Jet就可以访问三种基于ISAM的数据库:Xbase、Paradox和Btrieve。

Jet 3.0在以下方面做了改善:

新的索引(Index)结构,降低了索引占用的存储空间,减少了重复创建索引时所需的时间。

去掉了Index Page上的读锁定(read lock)。

一种新的Page复用机制。

一种新的压缩方法,压缩数据库使得索引以clustered-index格式存放。

一种新的Page分配机制,它改善了Jet的Read-ahead能力。

改善了删除操作,使之速度更快。

多线程(有三个线程,分别用于执行read ahead, write behind和 cache maintenance)。

增加了隐式事务功能,这样用户就不必以手动方式开启和提交一个事务。

一个新的排序引擎,用于把Memo或者binary data这样的数据类型存储在单独的表里并支持动态扩展缓存。有了这个排序引擎,Jet可以在起动时分配缓存,并且缓存大小没有限制;另外,缓存淘汰机制从 FIFO(first in, first out,先进先出)变成了LRU(least recently used)。(※参考资料3)

数据库复制支持。

Jet 4.0拥有以下几个方面的新增特性和改善(※参考资料1):

Unicode字符存储支持。由于使用了一种NT sorting method,在Windows 95上也支持Unicode存储了。

数据类型方面发生了改变,看起来更像SQL Server的数据类型了(LongText/Memo; Binary; LongBinary; Date/Time; Real; Float4; IEEESingle; Double; Byte/Tinyint; Integer/Integer synonyms Smallint, Integer2, Short; LongInteger/ LongInteger synonyms Int, Integer, Counter; Auto-Increment support; Currency/Money; Boolean ;GUID)。另外,还包括一种新的Decimal类型。

Memo files索引支持。

可压缩的数据类型。

SQL增强,令Jet SQL更加接近于ANSI SQL-92。

粒度更细的安全性支持。

支持视图和存储过程。

支持事务的开启和中止(即提交和回滚)。

表的创建和修改方面的增强。

支持参照完整性。

数据库链接控制(已经处于连接状态的用户能保持连接,但一旦断开则无法再次连接;并且无法建立新链接。当数据库管理员想获得数据库控制权时这一点非常有用。)

一个用户列表,管理员可以据此知道谁正处于连接状态。

行级锁定(Record-level locking)(之前的版本仅支持也锁定(page-locking))。

支持与SQL Server之间的双向复制。

Microsoft Office 2000 Professional版包含了一个名为“Microsoft Access升级向导(Microsoft Access Upsizing Wizard)”的实用工具。使用这个工具可以把Jet 4.0数据库升级到SQL Server,并能保留原有Jet数据库的表结构、数据以及其他一些属性。但是该实用工具并不能处理Microsoft Access的报表(Report)、查询(Query)、宏(Macro)以及安全设置(Security)。如果原来的Jet数据库使用了这些Jet 特有功能,那么手动升级无法避免。

未来展望

从数据访问技术的角度来看,微软现在已经不推荐大家使用Jet(※参考资料4)。 Jet也已经不再是MDAC(Microsoft Data Access Components)安装包的一部分了。然而,Jet将继续作为Microsoft Access的主要数据库引擎继续存在。Microsoft Access 2007包含了一个Jet新版本,它独立于过去Windows MDAC里自带的那个版本,数据文件格式却和旧版完全兼容。新版本的Jet只能通过Microsoft Access来访问,并且以后也会随着Microsoft Access的发布而更新(※参考资料5)。

到目前为止,微软并没有计划在64位的Windows上支持Jet。在可预见的未来,Jet可能只有32位的版本。这意味着原生的64位应用程序无法通过 ODBC、OLE DB或者其他途径访问存储在MDB文件里的数据——除非我们通过一个32位的软件作为中介,在64位客户端和32位客户端之间架起一座桥(※参考资料6)。

参考资料

1. MS KB article 275561 (2007-01-29).

Description of the new features that are included in Microsoft Jet 4.0.

http://support.microsoft.com/kb/275561/en

Microsoft. Retrieved on 2008-06-19.

2. Goodhew, Tony (1996), Jet Engine: History,

http://www.avdf.com/nov96/acc_jet.html

Retrieved on 19 June 2008

3. MS KB article 137039 (2003-12-03).

New Features in Microsoft Jet Version 3.0.

http://support.microsoft.com/kb/137039/en

Microsoft. Retrieved on 2008-06-19.

4. Shirolkar, Prash; Henry, Alyssa; Pepitone, Stephen; Bunch, Acey J.;

(2008), Data Access Technologies Road Map,

Microsoft Corporation,

http://msdn.microsoft.com/en-us/library/ms810810.aspx

Retrieved on 19 June 2008

5. Rucker, Erik (2005-10-13). Access 12''s new data engine.

http://blogs.msdn.com/access/archive/2005/10/13/480870.aspx

Retrieved on 2008-06-19.

6. Gorm Braarvig. Access database from SQL 2005/64.

http://gorm-braarvig.blogspot.com/2005/11/access-database-from-sql-200564.html

Retrieved on 2007-06-18.

7. Microsoft, "Microsoft Access 2000 Data Engine Options", white paper.

8. Erik Rucker Access 2007 database limits

http://blogs.msdn.com/access/archive/2006/06/05/access-2007-limits.aspx

相关分词: Microsoft Jet Database Engine