多进程共享数据库
概述
SmartEDB支持在多进程操作环境中(例如Linux和Windows平台)允许多个进程共享一个公共数据库。为了实现多个进程之间的数据共享,数据库必须创建在共享内存中。一个进程中的多个线程会共享该进程的内存,而SmartEDB运行时使用的共享内存机制则依赖于具体的体系结构和操作系统。
在某些环境中,如Sun Solaris和Linux,SmartEDB使用System V共享内存机制;而在其他环境中,则使用POSIX风格的共享内存。对于Microsoft Windows平台,还有专门的共享内存机制。当创建数据库时,SmartEDB运行时会分配两个共享内存段:一个用于保存机器上所有数据库实例的信息(称为“注册表”),另一个用于存储实际的数据。之后,所有数据库操作都通过SmartEDB的标准接口完成。
实现
与使用传统内存的数据库应用程序相比,SmartEDB共享内存应用程序有以下两个主要区别:
- 链接共享内存运行时库:这些应用程序必须链接到特定的共享内存运行时库。
- 单点打开,多点连接:共享数据库只在一个进程中打开,而其他进程只需连接到这个已打开的数据库即可。
共享内存库的具体实现依赖于操作系统,详细信息可以在包内容页面中找到。
共享内存运行时选项
为了配置共享内存,必须通过运行时选项通知SmartEDB运行时。这些选项因操作系统而异。
Windows应用程序
对于Windows应用程序,有两组运行时选项:
- 确定共享内存块名称的范围:可以选择本地或全局范围。
- 确定应用于共享内存块的安全级别:设置安全级别以保护共享内存块。
这两组选项组合应用于共享(命名)内存块设备中指定的名称。有关为开发环境设置这些运行时选项的具体说明,请参阅本机语言API部分。
Linux应用程序
在Linux系统中,共享内存应用程序使用POSIX函数mmap()
将虚拟共享内存映射到当前进程。(详情请参阅手册页:mmap(2))。有关为开发环境设置这些运行时选项的具体说明,请参阅本机语言API部分。
Unix应用程序
在Unix系统上,共享内存访问模式由特定于Unix的文件系统访问权限值指定。共享内存和信号量具有与普通文件相同的权限系统,以限制不同用户和组的进程访问。(关于Unix文件访问权限的详细信息,请参阅:文件系统权限)。
MacOS和一些Linux系统上的共享内存设置
在MacOS上开发SmartEDB应用程序时,您可能需要重新配置系统的共享内存设置,即使您的应用程序并未特意使用共享内存。这是因为默认情况下,操作系统会为每个进程分配少量的共享内存。(实际上,这不仅限于MacOS;某些Linux发行版也有类似的默认设置。)
为了确保应用程序能够顺利运行,建议通过编辑(或创建)文件/etc/sysctl.conf
来调整默认的共享内存设置,并进行以下配置:
kern.sysv.shmmax=1073741824
kern.sysv.shmall=262144
kern.sysv.shmmin=1
kern.sysv.shmseg=32
kern.sysv.shmmni=128
共享内存配置
这将为一个进程分配最多1Gb的共享内存。有关详细信息,请参阅以下文章:共享内存设置。
本地语言API
共享内存应用程序的API取决于所使用的编程语言。请使用以下链接查看针对您开发环境的详细解释和示例:
开发语言 | 说明 |
---|---|
C / C++ | C / C++语言中的共享内存应用程序 |
Java | Java 语言中的共享内存应用程序 |
Python | Python 语言中的共享内存应用程序 |
C# | C# 语言中的共享内存应用程序 |