数据库控制
无论是全内存型、持久型或混合型(具有瞬态和持久类),所有数据库都在应用程序的内存空间中占用主内存。
- 对于内存数据库,单个内存设备指定内存类型(常规或共享)及其大小。
- 对于持久型数据库,至少需要四个内存设备。然后动态分配内存并传递给运行时以打开或创建数据库。从此时起,直到运行时关闭,此内存由运行时专门管理,不过如有必要,之后可以扩展(通过分配更多动态内存)。
每个数据库应用程序进程,以及多线程应用程序中的每个线程,必须首先连接到数据库才能执行任何数据库操作。所有数据库事务都在此连接的上下文中进行管理。在终止之前,应用程序在关闭运行时之前断开连接并关闭数据库。
请使用以下各语言相关 API 查看详细信息:
- 内存设备(Memory Device) - 定义数据库设备。
- 数据库创建/关闭(Database Open/Close) - 创建/打开和关闭数据库。
- 数据库连接/断开(Database Connect/Disconnect) - 连接到和断开数据库。
- 扩展内存(Extending Memory) - 扩展设备内存。
存储设备
SmartEDB 支持逻辑数据库设备的概念,这是对物理存储位置的抽象,可以是常规内存(应用程序地址空间中的静态或堆分配内存)、共享内存(多个进程共享的“命名”内存)、甚至是持久文件系统内存,例如简单文件、多文件或 RAID 文件,甚至原始磁盘分区。
对于内存数据库,使用单个常规或共享内存设备,而对于持久性数据库,则定义至少四个内存设备的数组,以指定数据库数据、元数据、缓存和日志文件的内存属性。
内存设备的定义方式取决于所使用的编程语言。请使用以下链接查看您开发环境的详细信息:
开发语言 | 说明 |
---|---|
C / C++ | C / C++ 语言的存储设备规格 |
Java | Java 语言的存储设备规格 |
Python | Python 语言的存储设备规格 |
C# | C# 语言的存储设备规格 |
创建全内存数据库
当调用数据库打开 API 时,内存数据库会在常规内存或共享内存中创建。打开数据库时,内存设备会被初始化,以数据库字典形式存在的元数据(该字典向运行时提供有关数据库结构的信息)会被加载到内存中。运行时会根据用户指定的几个参数进行初始化,这些参数会决定运行时的行为,直到数据库关闭。然后,在应用程序终止之前,必须关闭数据库。
用于定义内存数据库参数的 API 和结构特定于所使用的编程语言。请使用以下链接查看您开发环境的详细说明和示例:
开发语言 | 说明 |
---|---|
C / C++ | 在 C / C++ 语言中打开和关闭内存数据库 |
Java | 在 Java 语言中打开和关闭内存数据库 |
Python | 在 Python 语言中打开和关闭内存数据库 |
C# | 在 C# 语言中打开和关闭内存数据库 |
创建持久数据库
持久化数据库是在调用数据库打开 API 时创建(对于初始实例)或从现有的持久化 <dbname>.dbs 文件打开。数据库打开后,所有数据库操作都使用与内存数据库相同的 API 执行。然而,对于持久化数据库,有一些额外的注意事项非常重要。以下各节将讨论关键因素。
内存设备
对于内存数据库而言,单个内存设备就包含了所有数据库数据和元数据,而持久性数据库则至少需要四个内存设备来分别存储“数据库存储”页面中所描述的不同内存区域:数据、元数据、缓存和日志。
内存页大小
MemPageSize
可以通过计算来优化性能,其大小会因应用程序的动态变化而有所不同,但通常来说,页面大小应在 80 到 512 字节之间;在大多数情况下,128 字节的页面大小是不错的。
请注意,R树索引需要更大的页面大小。如果在数据库事务期间遇到错误代码 MCO_ERR_RTREE
,请逐步增加页面大小,直到这些错误代码得到解决。
磁盘页面大小
对于持久性和混合数据库,这两个参数都应设置为 2 的幂次方,且 DiskPageSize
至少应为 MemPageSize
值的 8 倍,以实现高效缓存。
将 DiskPageSize
映射到持久性介质的阻塞因子可能很有用。这是因为以 DiskPageSize
为单位执行 I/O 操作(即,如果您修改了一页中包含的五个记录中的一个记录,运行时将写入整个页面),而磁盘以块为单位执行 I/O 操作,无论数据库系统请求的 I/O 大小如何。换句话说,如果磁盘的阻塞因子为 8192 字节,那么即使请求写入 4096 字节(因为 DiskPageSize 为 4096 字节),磁盘也始终会读取或写入 8192 字节。鉴于磁盘始终以 8192 字节为单位读取或写入,也应如此。
当定义了持久设备且应用程序未为其显式分配数据库页面大小时,运行时将为其分配默认值 4096 字节。如果多个应用程序或任务尝试为同一个数据库分配不同的持久数据库页面大小,运行时将返回错误代码。
最大连接数
对于持久型数据库和内存数据库而言,MaxConnections
参数决定了此数据库所能支持的应用程序连接的最大数量。
磁盘最大数据库大小
MaxDiskDatabaseSize
元素指定了所占用的持久性媒体空间的最大量。当导致超过此阈值的事务运行时,数据库运行时将向其报告 MCO_E_DISK_SPACE_EXHAUSTED
或 MCO_ERR_DISK_SPACE_EXHAUSTED
错误(具体取决于所链接的是发布版库还是调试版库)。
日志类型
持久数据库的事务日志文件用于在系统出现故障时提供自动数据库恢复。事务日志文件策略是可配置的,允许开发人员选择最适合应用程序的类型,并且会对性能产生重大影响(有关更详细的讨论,请参阅“持久数据库 I/O”页面)。LogType 指定运行时将使用的日志记录策略:NoLog、UndoLog 或 RedoLog。默认情况下,LogType 值设置为 RedoLog。
用于定义数据库参数的 API 和结构特定于所使用的编程语言。请使用以下链接查看您开发环境的详细说明和示例:
开发语言 | 说明 |
---|---|
C / C++ | 在 C / C++ 语言中创建持久性数据库 |
Java | 在 Java 语言中创建持久性数据库 |
Python | 在 Python 语言中创建持久性数据库 |
C# | 在 C# 语言中创建持久性数据库 |
连接数据库
要对数据库执行操作,应用程序需通过创建连接来连接数据库(创建数据库句柄)。
数据库必须已预先创建,如果数据库位于共享内存中,则可能是在不同的进程中创建的。数据库连接在后续对数据库 API 的调用中使用。
请注意,所有应用程序都必须为访问数据库的每个线程(任务)创建单独的连接;数据库连接不能在不同的线程或任务之间共享。 用于创建数据库连接的应用程序编程接口(API)和结构因所使用的编程语言而异。请使用以下链接查看您开发环境的详细说明和示例:
开发语言 | 说明 |
---|---|
C / C++ | 在 C / C++ 语言中创建数据库连接 |
Java | 在 Java 语言中创建数据库连接 |
Python | 在 Python 语言中创建数据库连接 |
C# | 在 C# 语言中创建数据库连接 |
扩展数据库内存
应用程序可以扩展数据库可用的内存量。 用于扩展数据库内存的 API 和结构特定于所使用的编程语言。请使用以下链接查看针对您的开发环境的详细说明和示例:
开发语言 | 说明 |
---|---|
C / C++ | 在 C / C++ 语言中创建数据库连接 |
Java | 在 Java 语言中创建数据库连接 |
Python | 在 Python 语言中创建数据库连接 |
C# | 在 C# 语言中创建数据库连接 |