65.9K
CodeProject 正在变化。 阅读更多。
Home

DeveelDB - 简介

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.54/5 (7投票s)

2009年10月22日

BSD

8分钟阅读

viewsIcon

35091

对一个功能齐全的开源纯 .NET/Mono 嵌入式关系数据库管理系统的基本功能和用法的描述

引言

数据管理是软件产品成功以及更高级别企业资源规划的关键组成部分。IT 早期的开发人员和工程师们早就面临过这个问题:应用程序状态的维护最早是在上个世纪中期被提出的,并且通过实现多种解决方案(数据库管理系统)得到了解决。组织对这些系统的日益增长的应用需求,促使了标准的建立和通信协议的制定,从而帮助开发人员能够轻松地与专门用于存储信息的系统进行交互。

存储系统和应用程序之间最重要且最持久的通信语言是 **SQL**(结构化查询语言),多年来,它经过了官方(ISO ANSI 标准)和非官方(数据库供应商方言)的修订,但始终被用作数据结构化和管理(数据定义语言)、修改数据库内容(数据修改语言)或简单地查询已存储数据(数据查询语言)的基础模型。

数据库管理系统(DBMS)多年来一直被部署为复杂的系统,运行在内部或公共网络上,供特定企业级环境中的应用程序使用:这些系统的精简版本的引入改变了开发人员和项目在应用程序架构和实现过程中所采取的方法。

本文将介绍 **DeveelDB** 的功能,它是一个功能齐全的嵌入式关系数据库管理系统,基于 ANSI/ISO SQL 模型,专为 .NET/Mono 应用程序设计,旨在安全可靠地存储和管理大量数据。
对于 .NET 和 Mono 框架,市面上已有的解决方案(例如 MySQL、SQLite、MSSQL)存在库的可移植性和性能方面的问题:目前应用程序的原始代码不被管理,而用于与底层函数交互的绑定需要对在托管类型到非托管类型转换过程中传递的数据进行封送。此外,托管代码和非托管代码之间交互的性质所带来的限制是显而易见的。
**DeveelDB** 旨在为开发人员提供一个健壮的管理系统,该系统是原生使用托管代码编写的,并且在与它交互的应用程序相同的环境中运行。

目前,服务器和服务的开发将项目的数据管理功能分发给更广泛的受众,可能会扩展上述的原始定义,但不会限制它(因为嵌入式支持将始终得到保障)。

**DeveelDB** 是与 McKoi 团队合作的成果:实际上,该项目相当一部分代码是从第一个版本的 Java 数据库管理系统中移植过来的。

Using the Code

在嵌入式环境中 OSDeelDB 非常容易上手,特别是如果您已经是 SQL 专家。

要开始在应用程序中管理数据库系统,您可以先简单地引用 **DeveelDB** 库(libdeveeldb.dll)中包含的 Deveel.Data.Control 命名空间:它包含两个小型但非常重要的类 DbControllerDbSystem(不要将其与父级 Deveel.Data 命名空间中的 DatabaseSystem 混淆),它们用于开始与数据库的交互(创建或打开)。

通过调用 StartDatabaseCreateDatabase 返回的 DbSystem 类,将提供关键方法(重载)GetConnection,该方法将建立与数据库的新 ADO.NET 连接,您可以使用它来传递 SQL 命令进行处理(无论是创建数据库对象、查询数据还是修改数据库内容:有关命令的完整列表,请参考 SQL 标准)。

using System;
using System.Data;

using Deveel.Data.Control; 

namespace Foo.Bar {
    public class Program {
        [STAThread]
        public static int Main(string[] args) {
            // let's create a default configuration for the system...
            DbConfig config = DbConfig.Default;
            // ... now create a new database named "Test" and administrated by
            // "SA" identified by "123456" password ...
            DbSystem dbSys = DbController.Current.CreateDatabase
				(config, "Test", "SA", "123456");
            // ... and retrieve an IDbConnection instance to communicate to 
            // the newly created "Test" database
            IDbConnection conn = dbSys.GetConnection("SA", "123456");
            // at this time the connection is already opened and you must not 
            // call 'Open' method from IDbConnection...
            [...]
            
            // ... and close the interaction with the database system once
            // finished: this will also close all the connections opened.
            dbSys.Close();
            return 0;
        }
    }
}  

使用 DeveelDbConnection 创建连接

尽管强烈建议使用 DbControllerDbSystem 来打开 ADO.NET 连接,但还有另一种方法可以做到这一点,即实例化 DeveelDbConnection 类(位于 libdeveeldb.dllDeveel.Data.Client 中):实际上,DbSystem 调用返回的 IDbConnection 实例就是 DeveelDbConnection 的实例,它直接连接到本地数据库系统,绕过了连接字符串解析,并使用 IDbConfig 实例来配置连接。

using System;

using Deveel.Data.Client;

namespace Foo.Bar {
    public class Program {
        public static int Main(string[] args) {
            // create a connection to the database "Test" which will dictate
            // the system to create it for the administrator "SA" and return an
            // IDbConnection instance to interface the users with the newly created
            // database...
            DeveelDbConnection conn = new DeveelDbConnection
		("Host=Local;User=SA;Password=123456;Create=True;Database=Test");
            conn.Open();
            
            [...]
            
            conn.Close();
            return 0;
        }
    }
} 

事务系统

请注意,**DeveelDB** 是一个原生事务系统:这意味着您无需在打开连接后开始事务以启动事务执行上下文。不过,为了符合 ADO.NET 规范,IDbConnection 中定义的 BeginTransaction 方法将返回一个 IDbTransaction 实例,该实例将被注册并阻止创建进一步的影子事务对象:从此对象调用 Commit 或 Rollback 方法将作为回调到 DeveelDbConnection 类中的 Commit 或 Rollback 方法。

当向系统发出 COMMIT 命令时,对数据库进行的所有修改都将被刷新,并且事务的状态将重置,直到下一次提交或回滚,开始记录修改。
对于 ROLLBACK,也采用相同的逻辑,它将撤销在发出此命令之前对数据库所做的任何修改。

当连接修改了数据库的状态,并且在关闭之前没有显式发出 COMMIT 命令,则该连接将回滚所有修改。

大量数据管理

**DeveelDB** 支持管理大量的二进制格式(**BLOB**)对象和字符串(**CLOB**)。该系统的特性是用于嵌入式系统和应用程序,这些系统不需要处理大量数据,不像企业环境(例如,在 Word 中索引 120 页的备忘录):实现 LOB 支持的原因是预测将来会创建更广泛的基础设施,将存储系统分发到私有和公共网络。

目前,用 DeveelDB 创建的每个数据库都将在表范围内实现一个用于处理大型对象的子存储。

可插拔架构

**DeveelDB** 的整个架构定义为可插拔:这意味着,只需少量开发工作,您就可以为项目的每个组件实现自己的处理器。
这种开放架构的一个例子是存储系统:目前内置的存储系统类型是 HEAP 和 FILE 存储,前者用于将数据库保存在内存中,并在垃圾回收时丢弃所有结构和数据,而后者处理一个日志系统,将数据库的状态存储在文件中。

如果您需要实现自己的存储系统(例如,基于网络的存储、单文件存储系统等),您可以实现 Deveel.Data.Store 命名空间中提供的接口,并配置系统使用它,而不是内置的。

有关存储实现的完整指南,请参阅 DeveelDB Wiki 站点。

(这种范式也可以应用于系统中的其他几个组件:函数、fsync、诊断、正则表达式处理器等)

开源

Deveel 关系数据库管理系统(DeveelDB)根据 GPLv3 开源许可证发布:这是最严格的许可证之一,可能也是最激进的。不幸的是,由于 DeveelDB 的很大一部分代码是从另一个开源项目移植过来的,我们被迫将许可证应用于其余代码。

开源社区的相当一部分成员抱怨 GPL 许可证的限制性,我个人也持此立场:如前所述,这个选择是迫不得已的。

尽管在当前情况下,可以通过类似以下的代码间接链接该项目到其他开源项目,而不会违反许可证。

using System;

namespace Foo.Bar {
    public class Program {
        public static int Main(string[] args) {
            string connTypeString = "Deveel.Data.Client.DeveelDbConnection, libdeveeldb";
            Type connType = Type.GetType(connTypeString, true, true);
            IDbConnection conn = (IDbConnection)Activator.CreateInstance(connType);

            [...]

            conn.Close();
        }
    }
} 

一个 LGPL 版本的客户端正在开发中:这将允许 DeveelDB 在更复杂的场景中使用,例如在开发和发布不同许可证的应用程序的分布式网络中。

在商业项目中使用 DeveelDB 需要用户与 Deveel 达成协议。

关注点

DeveelDB 系统在数据管理方面被认为是非常健壮的,这得益于其已内置的以下功能:

  • 原生事务系统:该系统本质上将连接封装在可序列化事务中;这意味着对数据库结构或内容的每一次修改都会被记录下来,并且只在 COMMIT 时刷新到数据库,或在 ROLLBACK 时被丢弃。
    该系统的关键组件可防止对数据库进行不受欢迎和未经授权的修改,这些修改可能会损害所存储数据的质量。
  • 大量数据:尽管 DeveelDB 最初是为嵌入式环境设计的,其中管理的数据量较小,但它也旨在管理非常大量的数据(BLOBs 和 CLOBs),并具有优化的访问级别,可以流式输入和输出系统的二进制和文本数据。
  • ADO.NET 接口:实现了标准的 ADO.NET 客户端,这是一个用于数据库通信的开放接口,降低了开发人员在代码方面所需的技术门槛,从而简化了系统的使用。
  • 可插拔架构:系统的每个组件都设计为可由开发人员扩展,以满足更高级别的需求。
  • 开源:该项目发布的开源许可证确保了用户对代码质量的信任。

延伸阅读

有关 DeveelDB 的功能、配置和使用方式的更多信息,请参阅网站

历史

  • 2009 年 10 月 22 日:初始帖子
© . All rights reserved.