嵌入式数据库(Core)
产品概述
SmartEDB 首先是一款内存嵌入式数据库系统(IMDS),非常适合嵌入式系统和其他需要极高性能/低延迟、小占用空间、紧凑存储、零内存分配或这些属性任意组合的应用领域。SmartEDB 通过极短的代码路径提供卓越性能,同时不牺牲必要的数据库管理系统功能,例如确保 ACID 属性的事务、数据定义语言以及在需要时对 SQL 的支持。SmartEDB 还表现出极小的内存、CPU 和存储开销。专为全内存优化设计,它通过消除文件 I/O、多个数据副本和冗余逻辑进程(如缓存)来提高速度。当与非易失性(例如电池支持)RAM 一起使用时,SmartEDB 能够提供无与伦比的速度和持久性。
SmartEDB 内核通过事务日志记录、备份和数据库快照功能,以最佳性能提供数据持久性。或者,只需声明数据库类为持久类,即可将数据库全部或部分存储在持久介质上。
对“临时”(内存中)数据库对象的操作消除了复杂且影响性能的缓存和文件管理任务,这带来了几个有益的附带效果:
- 通过消除与缓存和文件管理相关的复杂逻辑,我们不仅减少了代码的大小(占用空间)和执行路径,还消除了同一数据片段在不同层级中的冗余副本(例如应用程序、数据库缓存、文件系统缓存以及文件系统本身中的多个副本)。这使得系统更加简洁高效。
- 全内存数据库的优化策略与基于磁盘的数据库有所不同。后者主要关注如何尽量减少文件 I/O 操作,并愿意大量使用内存和 CPU 指令来避免这些操作。而全内存数据库无需担心磁盘 I/O,因此其优化目标是减少 CPU 指令并最大化给定空间内可存储的数据量。因此,SmartEDB 在存储相同数量的数据时,所需的存储空间仅为基于磁盘的数据库的一小部分。
- 为了更好地支持全内存数据库,SmartEDB 提供了两种库供您选择:
- - 直接指针运算库:通过简单的指针运算访问数据库记录的内存位置,提供 5% - 15% 的性能优势。这种库非常适合单个(可能是多线程的)进程中的内存数据库。
- 偏移量库:首先获取记录相对于数据库起始地址的偏移量,然后将其转换为正确的指针来计算记录位置。虽然会带来轻微的额外性能开销,但具有以下优势:
- 内存中数据库的保存二进制映像可以加载到内存中的不同起始地址。
- 在共享内存中共享内存数据库的两个(或多个)应用程序不必将共享内存段映射到它们本地进程的相同地址空间(有时这是不可能的)。 - 对于某些嵌入式系统,如与飞行安全相关的系统,不允许使用动态内存分配,因为这可能会导致内存泄漏,最终造成系统故障。为此,SmartEDB 在启动时会分配一块固定的内存用于内存存储,确保不会进行动态内存分配。如果需要,应用程序可以根据需求增加内存数据库的大小,但 SmartEDB 本身绝不会动态分配内存。
- 为了允许多个进程访问全内存数据库,您可以将 SmartEDB 数据库创建在共享内存中,这样其他应用程序就可以直接共享数据,从而实现更高效的协作。
SmartEDB 可用于多种嵌入式、实时、桌面和服务器操作系统。对于采用单进程多任务架构的操作系统(例如 VxWorks 5.5 和 INTEGRITY OS),SmartEDB 可在内存的任何专用区域管理数据,并协调多个任务(线程)的访问。对于多进程架构(例如 Sun Solaris、Linux、Windows、QNX Neutrino 等),SmartEDB 可在共享内存中管理数据库,并协调多个进程的访问,每个进程可能具有多个线程。
SmartEDB 是一种开发工具,可为应用程序提供数据库支持,为众多编程语言和开发环境提供编程接口,其中包括:
除了核心的 SmartEDB 软件包之外,以下功能扩展了核心功能以满足特定系统的特殊需求:
- C/C++:无论是 C 语言程序员还是 C++ 开发者,都能在几乎所有平台上找到最适合自己的 API。对于 C 语言开发者,原生 C API 是最佳选择;而对于 C++ 开发者,可以通过方便的应用程序特定类来封装数据库功能,使代码更加简洁和易于维护。
- Python:SmartEDB 提供了 Python 扩展模块“exdb.py”,支持核心 C 语言 API,并提供了一系列 Python 类,帮助您更轻松地使用流行的 Python 语言和交互式工具开发应用程序。这使得 Python 开发者可以快速上手并充分利用 SmartEDB 的强大功能。
- Java 本地接口:SmartEDB 与 Java 编程语言实现了无缝集成。Java 开发者只需在类定义中添加 SmartEDB 属性注释,即可通过 Java 的反射机制自动生成数据库字典,无需额外的模式语言或编译步骤。这样一来,标准的 Java 面向对象语言不仅保持了原有的灵活性,还增强了持久数据存储的功能,无论是全内存、磁盘存储,还是两者的结合。
- C#(.NET 框架):对于 Windows 开发者来说,C# API 是将高性能数据库功能集成到 .NET 框架应用程序中的理想选择。与 Java API 类似,您可以使用“持久”属性标记 C# 类,以便在 SmartEDB 数据库中进行存储。通过 Database、Connection 和 Cursor 等类,您可以直接调用专用方法或使用 LINQ 查询来实现数据库操作。此外,SmartEDB 的 .NET 框架 LINQ 提供程序利用强大的索引功能显著提升了 LINQ 查询的性能。
- SmartESQL:SmartEDB 提供了一种高性能的 SQL 实现,支持行业标准的 SQL 数据库语言,并提供了 C/C++(专有和 ODBC)以及 Java(JDBC)语言接口。这使得不同编程语言的开发者都可以轻松访问和操作数据库。
所有这些编程接口都可以在同一应用程序和/或同一数据库中灵活使用,为您提供最大的编程灵活性。
- SmartEDB 事务日志记录:通过事务日志记录功能,SmartEDB 支持数据库的持久性。当事务提交时,系统会将对数据库所做的更改记录到事务日志文件中。启用此功能后,所有写入操作都是顺序进行的,确保了高效和稳定的数据记录。如果发生硬件或软件故障,SmartEDB 运行时可以从日志文件中恢复数据库,确保数据的安全性和完整性。此外,SmartEDB 还提供“数据中继”功能,这是一种开放的复制方案,能够方便地将 SmartEDB 事务转发到外部系统(例如其他中间件或企业级数据库管理系统),进一步增强了系统的灵活性。
- SmartEDB 高可用性:这是 SmartEDB 的一个可选模块,专为需要最高可靠性的应用程序设计,特别是在系统故障情况下。该模块实现了时间感知的两阶段提交协议(也称为 2-safe 或同步协议),以确保主数据库实例和一个或多个副本数据库实例始终保持完全同步。对于需要更高性能的应用,还可以选择更快的 1-safe/异步协议,尽管一致性稍低,但性能更优。高可用性模块扩展了 SmartEDB 的核心编程接口,提供了额外的功能,使副本数据库可以连接并同步到主数据库,或者在“故障转移”场景中接管主数据库的角色。副本数据库实例是可读的,有助于在所有可用的数据库实例之间平衡查询负载,提高系统的整体性能。
- SmartEDB 集群:这是 SmartEDB 的另一个可选模块,适用于分布式数据库实现。在网络集群中,不同节点上的应用程序都拥有数据库的相同副本,并且所有数据库修改都会自动复制到所有节点。每个节点都可以执行读写和只读操作,这不仅有助于负载均衡,还通过利用商品硬件实现了经济高效的可扩展性。这种设计使得系统能够在不影响性能的情况下轻松扩展,满足不断增长的需求。
- SmartESQL:作为 SmartEDB 的一个选项,SmartESQL 提供了 SQL 数据库编程语言的高性能实现。开发人员可以通过多种方式使用标准 SQL,包括 Windows ODBC 驱动程序、直接链接到 SmartEDB API 库(绕过 ODBC 驱动程序和驱动程序管理器)、JDBC、SmartEDB 专有的 C 语言调用级别接口(CLI)或一组精简的 C++ 类。基于 SmartEDB 无可匹敌的性能,SmartESQL 的 SQL 优化器经过精心调优,能够充分利用 SmartEDB 运行时的优势,为 SQL 程序员提供了一个快速且高效的接口。
产品进化
SmartEDB 在成千上万的实时应用程序成功中发挥了重要作用。在开发人员和热情客户的建议和支持下,我们不断添加新功能,以扩展 SmartEDB 核心技术,满足用户日益变化的需求。从上面列出的版本和可选模块可以看出,我们在每个发展阶段都保持了对极致性能的承诺。无论是事务日志记录、高可用性、集群功能、SmartESQL 还是 Java、C# 和 Python API,每项新增功能都以独立库的形式提供,可以根据需要灵活地集成到应用程序中,以满足特定需求。
对于那些需要为关键任务应用程序获取最佳性能的开发人员来说,他们可以放心的是,底层核心运行时仍然是业内速度最快、最可靠的。同时,我们也非常高兴地看到,对于要求不那么高的应用程序,开发人员可以通过 SQL 等方式与相同的 SmartEDB 数据库进行交互,轻松生成报告或提供灵活的查询接口。
随着用户对多样化数据持久化功能的需求不断增加,我们为全内存数据库和持久化数据库添加了多项功能,以增强其功能并赋予开发人员更多的控制权。这些新增功能包括:
通过简单链接相应的库,您可以轻松选择“乐观”或“悲观”的事务管理方式:
- 多版本并发控制(MVCC)事务管理器:这是一种乐观(无锁)的事务管理器,能够最大限度地提高并发性,并在多核系统上表现出色。它允许您在查询和更新数据库时选择不同的隔离级别,确保数据的一致性和高效访问。
- 多读单写(MURSIW)事务管理器:这是一个极其轻量级的事务管理器,非常适合内存数据库,特别适用于并发任务较少或只读操作与读写操作比例较高的系统。它简化了事务管理,提高了系统的响应速度。
二进制模式演变(BSE)
BSE 功能使您可以将现有的数据库加载到较新的格式中,并自动转换现有数据对象(例如新增或删除类、字段或索引)。这使得升级数据库变得更加简便和安全。
事务日志记录
事务日志记录功能增强了数据持久性:
- 日志记录可以在运行时开启或关闭,灵活应对不同需求。
- 数据中继:通过开放复制功能,您可以轻松与外部系统共享数据,确保数据同步和一致性。
- 主动复制结构:SmartEDB 的主动复制结构能够在服务器与边缘设备之间自动复制数据,确保数据的高可用性和可靠性。
XML 功能
XML 实现提供了强大的数据导入和导出能力,方便您与其他系统进行数据交换。
增强型数据库安全
为了确保数据的安全性和可靠性,SmartEDB 提供了以下安全措施:
- 从持久存储中读取数据时,提供 AES 和 CRC 校验,确保数据的完整性和准确性。
- 支持页级数据加密,为您的数据提供强大的安全保障。
- 支持 NVRAM,可以从电池供电内存中恢复数据库,确保数据不会因意外断电而丢失。
缓存选项
SmartEDB 提供了多种性能优化的应用程序管理缓存选项,帮助您进一步提升系统性能:
- 优先级缓存:采用增强型 LRU 算法,允许应用程序影响某些页面在数据库缓存中保留的时间,确保关键数据始终可用。
- 连接缓存:数据库运行时确保为给定事务加载的页面在缓存中保留,直至事务提交为止,减少了不必要的磁盘 I/O 操作,提升了整体性能。
产品特性
以下主题阐述了 SmartEDB 应用程序设计和实现的一般原则:
主题 | 说明 |
---|---|
数据库模式 | 定义数据库模式 |
运行时控制 | 启动和终止 SmartEDB 运行时;设置运行时选项和致命错误处理程序 |
数据库控制 | 创建和关闭数据库;连接和断开数据库连接;监控和扩展内存;备份和加载数据库快照 |
数据库对象接口 | 创建和修改数据库对象 |
创建类关系 | 连接(关联)数据库类的实现技术 |
索引和游标 | 定义和使用索引以实现最佳数据访问;管理代表数据库对象选择的游标 |
搜索方法 | 实现对单个数据库对象的查找以及对象选择的搜索 |
事件和 TTL | 数据库事件触发器以及通过生存时间(TTL)功能自动删除过时的数据库对象 |
数据库备份与恢复 | 增量在线备份与恢复以及内存数据库和持久数据库的基于文件的备份 |
数据导出与导入 | 备份与恢复、保存和加载数据库快照、元数据和字典、XML 导出/导入 |
事务日志 | 使用事务日志实现持久化、恢复和“数据中继” |
垂直数据存储 | 使用序列数据类型以垂直或列式形式存储数据 |
网络通信 | 管理网络连接和安全性 |
监控存储 | 数据库统计接口和监控存储空间使用情况 |
持久数据库 I/O | SmartEDB 如何管理缓存和持久介质 I/O 操作 |
事务日志文件 | 设置事务日志文件类型和参数 |
跟踪调试框架 | 将跟踪和调试信息输出到日志文件 |
数据库恢复 | 从失败的进程恢复数据库 |
数据库加密 | 加密数据库内存 |
数据库压缩 | 使用数据压缩技术 |
设计和编程注意事项 | 关于 SmartEDB 的数据库设计注意事项 |
编程示例 | 说明如何使用 SmartED BAPI 的示例代码 |
共享内存应用程序 | 在多进程应用程序中使用共享内存中的数据库 |
统一数据库访问 | 统一数据库访问(UDA) - 用于访问 SmartEDB 数据库的预定义通用导航 API |
主动复制结构 | 物联网(IoT)边缘设备与远程系统上的主动复制结构技术优化。 |