首页> 中国专利> 实现共享内存数据库的方法及内存数据库系统

实现共享内存数据库的方法及内存数据库系统

摘要

本发明公开了一种实现共享内存数据库的方法,以解决现有的内存数据库存在无法满足高并发量数据访问的问题;该方法包括:创建步骤,用于创建可供多进程访问的共享内存,并将内存数据库保存于该共享内存中;加锁步骤,当所述内存数据库在接收到进程的访问请求时对操作加锁,使进程间互斥访问内存数据库以保证数据的一致性;执行步骤,在操作加锁后由数据库管理系统对数据进行实际操作并输出结果;解锁步骤,用于在执行完进程的访问操作后解除该操作的锁。

著录项

  • 公开/公告号CN1740978A

    专利类型发明专利

  • 公开/公告日2006-03-01

    原文格式PDF

  • 申请/专利权人 华为技术有限公司;

    申请/专利号CN200410064324.8

  • 发明设计人 彭波;郭房富;

    申请日2004-08-23

  • 分类号G06F9/52(20060101);G06F9/46(20060101);G06F17/30(20060101);

  • 代理机构

  • 代理人

  • 地址 518129 广东省深圳市龙岗区坂田华为总部办公楼

  • 入库时间 2023-12-17 16:59:29

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2007-12-05

    授权

    授权

  • 2006-05-03

    实质审查的生效

    实质审查的生效

  • 2006-03-01

    公开

    公开

说明书

技术领域

本发明涉及数据库技术,尤其涉及可供多进程进行数据处理的共享内存数据库。

背景技术

内存数据库是相对于传统磁盘关系型数据库(如Oracle、SQLServer)而言的。传统数据库使用磁盘来保证数据的持久存储,而内存数据库将数据常驻内存,所有的事务/数据的存取只涉及内存。因此内存数据库相对于传统的关系型数据库,可以达到更高的性能、更好的实时性。

在实时性要求比较高的电信软件中,内存数据库使用得比较多。专利号为ZL00134030.1,名称为提高短消息调度中心消息处理能力的方法的专利公开了一种内存数据库的实现方案。这些内存数据库因为其运行环境不同,实现的方案也不一样,但其共同的特点就是:都是单进程的方案,数据库数据只能单进程访问。

在有些要求比较低的运行环境中,单进程的内存数据库实现简单,是能够满足需求的。但是对于电信系统的平台软件,比如智能网业务控制点(SCP)平台,需要高并发量的数据访问,需要多个进程同时进行数据的处理,这时候单进程的内存数据库就无法不能满足要求。

发明内容

本发明提供一种实现共享内存数据库的方法及内存数据库系统,以解决现有的内存数据库存在无法满足高并发量数据访问的问题。

为解决上述问题,本发明提供以下技术方案:

一种实现共享内存数据库的方法,该方法包括:创建步骤,用于创建可供多进程访问的共享内存,并将内存数据库保存于该共享内存中;

加锁步骤,当所述内存数据库在接收到进程的访问请求时对操作加锁,使进程间互斥访问内存数据库以保证数据的一致性;

执行步骤,在操作加锁后由数据库管理系统对数据进行实际操作并输出结果;

解锁步骤,用于在执行完进程的访问操作后解除该操作的锁。

其中:

采用信号量对操作加锁和解锁;每个锁用两个信号量实现,其中一个信号量记录当前可进入的读进程数,即读信号量,另一个信号量记录当前写进程数量,即写信号量。

当所述访问操作为读操作时,先判断写信号量是否大于0;如果是则使读操作进入等待状态,否则,将读信号量减1后进行读操作,并在完成读操作后将读信号量加1。

当所述访问操作为写操作时,先将写信号量加1后判断读信号量是否为最大读进程数;如果是,则进行写操作,并在写操作完成后将写信号量减1,否则使写操作进入等待状态。

所述共享内存包括多个具有唯一标识的共享内存段,进程根据该标识映射共享内存段并记录映射后共享内存段在进程内的首地址,根据该首地址访问此共享内存段内的数据。

一种内存数据库系统,用于供多进程访问;该内存数据库系统包括:

接口模块,用于向外部应用进程提供访问通道;

数据定义语言执行模块,用于根据接口模块输出的操作命令执行创建表、删除表和创建索引操作;

数据字典模块,用于根据数据定义语言执行模块输出的命令管理表结构信息;

数据操作语言执行模块,根据接口模块输出的操作命令执行数据的读、写操作;

索引模块,根据数据操作语言执行模块输出的操作命令组织数据;

锁模块,用于对访问操作进行加锁,并在操作完成后解锁,以在多进程访问共享数据时保证数据的一致性。

内存管理模块,用于管理保存内存数据库的共享内存。

本发明具有以下有益效果:

1、本发明可以实现多进程同时访问内存数据库,能够大大提高的内存数据库的并发查询的性能。

2、本发明能够可以实现动态内存管理的内存数据库,这样就能保证的内存数据库的弹性,使内存数据库可以在各种应用环境上使用。

3、本发明能够实现直接存取数据的内存数据库,应用数据能够通过内存数据库集中管理,同时相对与应用分散管理数据的方式,只会有很小的性能损失。

附图说明

图1为多进程访问共享内存示意图;

图2为系统接口示意图;

图3为本发明的内存数据库系统的逻辑结构图;

图4为T-树索引的逻辑结构图;

图5为本发明的内存管理示意图。

具体实施方式

共享内存是一种由UNIX操作系统提供的进程间通信(IPC)的机制,它允许两个或多个进程共享一给定的存储区。数据放入存储区中,不同进程可以直接存取,不需要在客户机和服务器间进行数据复制,所以这是最快的一种进程间通信方式。使用共享内存的内存数据库的优势是多进程同时访问数据,数据在共享内存中,访问数据的接口在每个进程中,如图1所示。

信号量是一种UNIX操作系统中的进程间通信机制,它是一个计数器,用于多进程对于共享数据对象的存取。信号量是UNIX中一种常见的进程间同步的技术,在本发明中,它用于对多进程访问共享内存的同步。

本发明提供的实现共享内存数据库的方法,包括:

创建步骤,用于创建可供多进程访问的共享内存,并将内存数据库保存于该共享内存中;

加锁步骤,用于所述内存数据库在接收到进程的访问请求时对操作加锁,使进程间互斥访问内存数据库以保证数据的一致性;

执行步骤,用于在操作加锁后由数据库管理系统对数据进行实际操作并输出结果;

解锁步骤,用于在执行完进程的访问操作后解除该操作的锁。

而对加锁和解锁操作是采用信号量实现;每个锁用两个信号量实现,其中一个信号量记录当前可进入的读进程数,即读信号量,另一个信号量记录当前写进程数量,即写信号量。

如图2所示,内存数据库采用库的方式发布,系统中需要访问内存数据库的进程只需要在其程序编译时链接此库即可。

对于内存数据库,重要的是能够提高数据查询的性能,降低处理过程的复杂度是提高性能的方法,因此,使用共享内存实现的内存数据库可以只提供数据的定义和数据的查询功能。具体包括:

表结构的定义:包括字段、字段类型、字段缺省值、主键、索引等的定义;

数据查询:根据字段值查询记录;

数据的修改:包括插入记录、修改记录、删除记录。

参阅图3所示,内存数据库包括:接口模块(IF)、数据定义语言执行模块(DDL)、数据查询语言执行模块(DML)、数据字典模块(DL)、索引模块(INDEX)、锁模块(LOCK)和内存管理模块(MM)。各模块详细说明如下:

1、接口(IF)模块,是提供给外部应用的接口,包括:DDL/DML的执行和其它一些专用接口。其中DDL/DML采用标准结构化查询语言(SQL)语句接口。IF模块解析这些SQL语句,然后传递给DDL或者DML模块。

为了提高执行效率,IF模块还为每个操作(包括:select、update、delete、insert、create table、drop table)提供专用接口。

2、数据定义语言执行模块(DDL),用于处理建表、删表和创建索引等操作。

3、数据操作语言执行模块(DML),用于对数据的查询和修改操作。

DML模块处理DML操作请求时,首先调用LOCK模块进行进程同步的一些处理,然后调用INDEX模块来修改或者查询数据,最后将查询结果组织成标准的输出形式输出给外部应用。对于查询(select),输出的信息就是查询的记录;对于插入(insert)、删除(delete)、更新(update),输出是操作的结果和数据库中被影响的数据行。

4、数据字典模块(DL),用于管理表结构信息,包括表的表名、字段名、字段类型、字段缺省值、索引等等信息。表结构放在共享内存中的专门区域,采用Hash表管理。

5、索引模块(INDEX),用于组织数据,提供高性能的数据查询和修改过程。索引是关系型数据库中最重要的技术之一。

本发明采用T-树进行索引。T-树是数据库中最常用到的一种索引,如图4所示,T-树是在平衡二叉树的基础上提出的一种平衡的两路查找树,T-树的每个节点上可以存储多于一个的码字,可以减少二叉树插入删除引起的平衡次数,它是一颗比平衡二叉树矮胖的树。

如果每个节点上码值个数为5,则100万个码字组成的T-树的高度为[lg(220/5+1)=18],即某表记录数为100万时,只需要访问18个树节点即可找到所需的记录。

6、锁模块(LOCK),用于多进程访问共享数据时的数据一致性控制。内存数据库不同于通用数据库,它的最主要目的是要支持高性能的数据查询和数据修改,并不需要支持事务的概念,因此锁的目标是要保证查询、修改操作之间的互斥,保证查询时不能读到“脏”数据,保证修改时不会影响其它的修改过程。

锁的粒度分为表级和数据块级,还有一些存储在共享内存的数据结构,比如Hash表、链表等,也需要加锁。

因为信号量在进程死亡是可以自动释放,所以锁采用信号量实现。锁分为读锁和写锁。每个锁用两个信号量实现,其中一个信号量记录当前可进入的读进程数(初始值为最大读进程数,后面每进入一个读进程则减1),称为读信号量,另一个信号量记录当前写进程数量(初始值为0,后面每进入一个写进程则加1),称为写信号量。

对于读操作,首先判断写信号量是否大于0,如果大于0,则等待,否则,将读信号量减1,然后读取数据,读取完毕,将读信号量加1;

对于写操作,首先将写信号量加1,然后判断读信号量是否为最大读进程数,如果是,则进行写操作,写操作完成后,将写信号量减1,并将读信号量置为最大进程数。因为一般的应用中读操作数量要远远大于写操作数量,写操作进入时,先置写标志,保证后面的读操作不能进入,写操作只要等待前面已经进入的读进程完成操作即可开始写过程,不至于让写操作等待太多时间。

7、内存管理模块(MM),用于对共享内存进管理,包括共享内存段的管理和内存块的管理。

A、共享内存段管理:共享内存是UNIX的一种IPC,共享内存由某个进程创建后,其它进程只需要做一个映射,就可以访问这块共享内存的数据。

本发明的内存管理可以管理多段共享内存。所有共享内存段在系统内部统一编号,并有一个唯一的ID。需要访问某个共享内存段的进程会判断自己是否已经映射此共享内存段,如果没有映射,则根据此共享内存段的唯一的ID做映射,并记录映射后它在进程内的首地址。此后根据这个首地址,就可以访问此共享内存段内的数据。在访问时如果发现的共享内存段已被其它进程释放,则会重新映射。

共享内存段可以根据数据量动态申请,这样可以充分利用系统的内存资源。

B、内存块管理:如图5所示,所有的内存段都分成大小相等的块,所有的内存数据库的数据,包括索引,记录,锁,表结构等待都放入这些内存块中。

为了更块的释放整表数据,不同的表记录和索引使用不同的数据块

在上述数据库基础上,实现共享内存数据库的方法为:由服务器进程创建可供多进程访问的共享内存,并将内存数据库保存于该共享内存中;当内存数据库在接收到进程的访问请求时对操作加锁,使进程间互斥访问内存数据库以保证数据的一致性;在操作加锁后由数据库管理系统对数据进行实际操作并输出结果;以及于在执行完进程的访问操作后解除该操作的锁。

典型的对内存数据库的操作过程描述如下:

对内存数据库的查询过程:应用进程通过接口模块(IF)提交查询请求,接口模块将请求转换为内部的格式,然后将此请求传递给DML模块处理,DML模块首先调用INDEX模块查找记录地址,然后调用LOCK模块进行加锁,最后调用MM模块读取记录数据,再调用LOCK模块解锁,最后将数据返回给应用进程,一次查询操作即处理完成。对内存数据库的写与此同理。

创建表的过程为:应用进程通过接口(IF)提交创建表请求(SQL),接口将请求转换为内部的格式,然后将此请求传递给数据语言执行模块(DDL)处理,DDL调用DL模块将表结构存入Hash表,然后给接口模块返回保存结果,最后由接口模块将创建表过程的结果返回给应用。

本发明充分利用UNIX的共享内存进程间通信(IPC)功能,实现了以下功能:

1、直接数据存取:每个进程可以直接存取共享内存中的数据;

2、多进程同时数据存取:通过进程间的同步控制,多个进程可以同时存取共享内存中的数据;

3、大容量的、弹性的数据管理:共享内存段大小可配置,共享内存段数量可以在运行过程中动态调整;

本发明实现了一个高性能的、高度灵活的、能在多种场景中使用的内存数据库,尤其是能够多进程同时访问的内存数据库,能够满足高并发量的数据访问要求。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号