一、什么是内存数据库

内存数据库系统带来的优越性能不仅仅在于对内存读写比对磁盘读写快上,更重要的是,从根本上抛弃了磁盘数据管理的许多传统方式,基于全部数据都在内存中管理进行了新的体系结构的设计,并且在数据缓存、快速算法、并行操作方面也进行了相应的改进,从而使数据处理速度一般比传统数据库的数据处理速度快很多,一般都在10倍以上,理想情况甚至可以达到1000倍。
一、雏形期
从上个世纪60年代末到80年代初。在这个时期中,出现了主存数据库的雏形。1969年IBM公司研制了世界上最早的数据库管理系统------基于层次模型的数据库管理系统IMS,并作为商品化软件投入市场。在设计IMS时,IBM考虑到基于内存的数据管理方法,相应推出了IMS/VS
Fast Path。Fast
Path是一个支持内存驻留数据的商业化数据库,但它同时也可以很好地支持磁盘驻留数据。在这个产品中体现了主存数据库的主要设计思想,也就是将需要频繁访问,要求高响应速度的数据直接存放在物理内存中访问和管理。在这个阶段中,包括网状数据库、关系数据库等其他各种数据库技术也都逐渐成型。
1984年,D
J DeWitt等人发表了《主存数据库系统的实现技术》一文。第一次提出了Main Memory
Database(主存数据库)的概念。预言当时异常昂贵的计算机主存价格一定会下降,用户有可能将大容量的数据库全部保存在主存中,提出了AVL树、哈希算法、主存数据库恢复机制等主存数据库技术的关键理论,为主存数据库的发展指出了明确的方向
1984年,D
J
DeWitt等人提出使用非易逝内存或预提交和成组提交技术作为主存数据库的提交处理方案,使用指针实现主存数据库的存取访问。
1985年,IBM推出了IBM
370上运行的OBE主存数据库
1986
1987
1988年普林斯顿大学设计出TPK主存数据库。
1990
三、产品发展期和市场成长期
随着互联网的发展,越来越多的网络应用系统需要能够支持大用户量并发访问、高响应速度的的数据库系统,主存数据库市场成熟
1994
1998
1999
2000
2001
四、几种主存技术应用的比较
第一代:用户定制的主存数据库。通过应用程序来管理内存和数据;不支持SQL语句,
第二代:简单功能的内存数据库。能够快速处理简单的查询;支持部分的
第三代:通用的主存数据库。针对传统的商业关系型数据库领域,能够提供更高的性能、通用性以及稳定性;提供不同的接口来处理复杂的SQL语句和满足不同的应用领域;可以应用在计费、电子商务、在线安全领域,几乎包括磁盘数据库的所有应用领域。
五、目前几种常见的通用内存数据库
eXtremeDB:eXtremeDB实时数据库是McObject公司的一款特别为实时与嵌入式系统数据管理而设计的数据库,只有50K到130K的开销,速度达到微秒级。eXtremeDB完全驻留在主内存中,不使用文件系统(包括内存盘)。eXtremeDB采用了新的磁盘融合技术,将内存拓展到磁盘,将磁盘当做虚拟内存来用,实时性能保持微秒级的同时,数据管理量在32BIT下能达到20G。
Oracle
TimesTen:Oracle
TimesTen是Oracle从TimesTen公司收购的一个内存优化的关系数据库,它为应用程序提供了实时企业和行业(例如电信、资本市场和国防)所需的即时响应性和非常高的吞吐量。Oracle
TimesTen可作为高速缓存或嵌入式数据库被部署在应用程序层中,它利用标准的
SolidDB:Solid
Information
Technology
Solid数据管理平台将基于内存和磁盘的全事务处理数据库引擎、载体级高可用性及强大的数据复制功能紧密地融为一体。
Altibase:ALTIBASE公司从1999年就一直致力于内存数据库软件和其应用的开发,提供高性能和高可用性的软件解决方案。特别适合通信、网上银行、证券交易、实时应用和嵌入式系统领域。目前占据80%以上内存数据库市场,可以说是当今数据库软件技术的领导者。目前Altibase在国内成功案例也比较多,尤其是在电信行业,已经得到了广泛认可。
SQLite是一个小型的C程序库,实现了独立的,可嵌入的,零配置的SQL数据库引擎。特性包括:
SQLite发行版包含一个独立的命令行访问程序(sqlite),可用于管理SQLite数据库,并适合作为一个如何使用SQLite库的例子。
License:
技术上的优点和特性
SQLite是一个轻量级、跨平台的关系型数据库。
◇轻量级
先说它的第一个特色:轻量级。想必SQLite的作者很看重这个特性,连它的Logo都是用的“羽毛”,来显摆它的轻飘飘。SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也挺小,以版本3.6.11为例,Windows下487KB、Linux下347KB。
◇
SQLite的另外一个特点是绿色:它的核心引擎本身不依赖第三方的软件,使用它也不需要“安装”。所以在部署的时候能够省去不少麻烦。
◇单一文件
所谓的“单一文件”,就是数据库中所有的信息(比如表、视图、触发器、等)都包含在一个文件内。这个文件可以copy到其它目录或其它机器上,也照用不误。
★技术上的缺点和不足
◇并发访问的锁机制
SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错。
SQL标准支持不全
在它的官方网站上,具体列举了不支持哪些SQL92标准。我个人感觉比较不爽的是不支持外键约束。
◇网络文件系统(以下简称NFS)
有时候需要访问其它机器上的SQLite数据库文件,就会把数据库文件放置到网络共享目录上。这时候你就要小心了。当SQLite文件放置于NFS时,在并发读写的情况下可能会出问题(比如数据损坏)。原因据说是由于某些NFS的文件锁实现上有Bug。
★编程语言接口
SQLite支持很多种语言的编程接口。这对于我这种喜欢混用多种编程语言的人来说,是很爽的。下面我大概介绍一下。
◇C/C++
由于SQLite本身是C写的,它自带的API也是C接口的。所以C/C++用起来最直接了。假如你不喜欢面向过程的C
API风格,可以另外找个C++的包装库。想重新发明轮子的同学,也可以自己包装一个。
◇Java
如果要用Java访问SQLite,可以通过SQLite的JDBC驱动,或者通过专门的SQLite包装库。我个人建议走JDBC方式,万一将来要换数据库,代码就不用大改。
◇Python
pysqlite是Python操作SQLite的首选。从Python
2.5开始,它已经被整合到Python的标准库中。看来Python社区还是蛮喜欢SQLite嘛。
◇.Net
对于喜欢.Net的同学,可以通过SQLite的ADO.NET驱动来访问。
◇Ruby
Ruby可以通过SQLite-Ruby操作SQLite数据库,不过我没用过。
◇Perl
在CPAN上有DBD::SQLite,不过我也没用过。
★一些非技术的参考因素
需要根据“如何选择开源项目”里面提到的几个参考因素,再评估一下。
◇授权协议(License)
SQLite使用的是Public
Domain协议,这是最爽一种,可以放心大胆地用。
◇用户的普及程度
最近这几年,使用SQLite的人越来越多。包括一些大公司也开始把它整合到产品中(比如Google的Gears、Apple的Safari、Adobe的AIR)。
◇开发的活跃程度
如果到SQLite的Change
Log上大致了解一下,可以看出最近5年基本上每1-2个月都会有更新。说明开发的活跃度还是非常高的。
SQLite不同于其他大部分的SQL数据库引擎,因为它的首要设计目标就是简单化:
许多人喜欢SQLite因为它的小巧和快速.
简单化在一个数据库引擎中可以说是一个优点,
仅凭经验来说SQLite适用于以下场合:
·
作为数据库引擎SQLite适用于中小规模流量的网站(也就是说,
99.9%的网站).
SQLite可以处理多少网站流量在于网站的数据库有多大的压力.
·
因为SQLite数据库几乎不需要管理,
·
SQLite作为桌面应用程序的本地磁盘文件格式取得了巨大成功.例如金融分析工具、CAD
数据库里可以加入一些临时的触发器,用来把所有的改变记录在一张临时的取消/重做日志表中.
·
许多程序使用fopen(),
fread(),
·
对于那些有大量的数据需要用不同的方式筛选分类的程序,
·
有经验的SQL用户可以使用SQLite命令行程序去分析各种混杂的数据集.
当然你也可以用企业级的客户端/服务器数据库来做同样的事情.
·
如果你正在编写一个使用企业级数据库引擎的客户端程序,
·
因为SQLite的安装和使用非常的简单(安装过程几乎忽略不计,
·
SQLite简单且模块化的设计使得它可以成为一个用来测试数据库语言特性或新想法的优秀的原型平台.
·
如果你有许多的客户端程序要通过网络访问一个共享的数据库,
好的经验告诉我们,
·
SQLite通常情况下用作一个网站的后台数据库可以很好的工作.
·
当你在SQLite中开始一个事务处理的时候(事务处理会在任何写操作发生之前产生,
·
SQLite对于整个数据库文件进行读取/写入锁定.
|
方面 |
具体要求 |
必要条件 |
详细描述 |
|
License |
是否收费 |
|
免费使用 |
|
是否开源 |
|
开源 |
|
|
是否有技术支持 |
|
主要是社区支持,如果需要专业支持需要购买 |
|
|
商业目的的分发版本是否仍要收费 |
是 |
免费 |
|
|
其他 |
|
|
|
|
性能 |
数据容量支持100000条以上记录 |
是 |
支持 |
|
并发查询处理能力 |
|
SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错。 |
|
|
查询速度 |
是 |
|
|
|
修改速度 |
是 |
|
|
|
平台支持 |
32/64位 |
|
全部支持 |
|
Linux/window/UNIX/mobile |
|
支持Linux/Mac OS/Windows |
|
|
运行方式支持 |
支持嵌入式 |
|
支持 |
|
支持独立运行 |
|
不支持 |
|
|
连接方式支持 |
支持ODBC |
|
默认不支持,必须通过第三方的ODBC驱动 |
|
支持JDBC |
|
默认不支持,必须通过第三方的JDBC驱动 |
|
|
支持内存访问 |
|
通过c接口(专用API) |
|
|
支持网络访问 |
|
不支持 |
|
|
SQL支持 |
支持SQL |
是 |
支持 |
|
支持Index,Trigger, Constrains,Views |
|
支持,有资料说其不支持外键约束。 |
|
|
管理界面 |
支持管理界面 |
|
支持CLI |
|
管理界面友好程度 |
|
较差 |
Altibase™内存数据库管理系统(DBMS),内存数据管理系统的最新技术,是一个在事务优先的环境中提供高性能和高可用性的软件解决方案。Altibase提供极限性能、容错能力和事务管理的方便性,特别是在通信、网上银行、证券交易、实时应用和嵌入式系统领域。Altibase能够最大限度的发挥数据库服务系统的潜力,使用Altibase能大大增强您公司的数据服务器的处理能力。
Altibase™内存DBMS为需要容错服务的系统提供实时数据库复制的功能。采用Altibase数据库复制的系统可以实现高性能、高可用性、数据库一致性、负载平衡和系统可伸缩性。如果您希望您的业务能够实现最大的成功,请在您的事务优先的系统中使用我们的Altibase数据库复制解决方案。
资料比较少,且需要商业License,没有详细去研究
Oracle是最重要的商业数据库产品提供商,它也有内存数据库的产品系列:主要就是Oracle
Berkeley DB
Oracle Berkeley
DB
Oracle Berkeley
DB
—
—
—
Oracle
eXtremeDB内存式实时数据库是为实时系统及嵌入式系统而特别设计的数据库。与同类产品不同,eXtremeDB不是通过
eXtremeDB满足了您对实时数据库的一切期待:高级数据定义语言、并行访问、基于交易及灵活的索引… …等等。不仅如此,出乎您的意外,eXtremeDB在紧凑的引擎中还提供诸如事件触发、目标历史等等功能。
eXtremeDB嵌入式数据库满足更多的实时开发的要求。
·
·
·
·
·
·
又一个商业内存数据库产品,这个特点是实时数据库,号称最快。
4.5
其他特性还包括
性能比较(摘自h2database网站)

|
Test Case |
Unit |
H2 |
HSQLDB |
Derby |
|
Simple: Init |
ms |
610 |
657 |
3187 |
|
Simple: Query (random) |
ms |
297 |
312 |
1828 |
|
Simple: Query (sequential) |
ms |
203 |
266 |
1766 |
|
Simple: Update (random) |
ms |
1078 |
1484 |
22031 |
|
Simple: Delete (sequential) |
ms |
234 |
281 |
7407 |
|
Simple: Memory Usage |
MB |
6 |
7 |
11 |
|
BenchA: Init |
ms |
859 |
438 |
4047 |
|
BenchA: Transactions |
ms |
5266 |
2875 |
17500 |
|
BenchA: Memory Usage |
MB |
9 |
14 |
10 |
|
BenchB: Init |
ms |
4016 |
2687 |
16875 |
|
BenchB: Transactions |
ms |
2609 |
3282 |
4250 |
|
BenchB: Memory Usage |
MB |
9 |
10 |
8 |
|
BenchC: Init |
ms |
891 |
594 |
5766 |
|
BenchC: Transactions |
ms |
4359 |
75438 |
11718 |
|
BenchC: Memory Usage |
MB |
9 |
18 |
9 |
|
Executed statements |
# |
594255 |
594255 |
594255 |
|
Total time |
ms |
20422 |
88314 |
96375 |
|
Statements per second |
# |
29098 |
6728 |
6166 |
包括Derby, HSQLDB等
上述内存数据库,首先由于License限制,排除了所有的商业数据库产品包括:
Alitibase
Oralce Berkelay DB
Oracle TimesTen
eXtrmeDB
还包括
所以比较的重点就是SQLite和H2
|
方面 |
具体要求 |
必要条件 |
SQLite |
H2 |
|
License |
是否收费 |
|
免费使用 |
免费使用 |
|
是否开源 |
|
开源 |
开源 |
|
|
是否有技术支持 |
|
主要是社区支持,如果需要专业支持需要购买 |
主要是社区支持,如果需要专业支持需要购买 |
|
|
商业目的的分发版本是否仍要收费 |
是 |
免费 |
免费 |
|
|
其他 |
|
|
|
|
|
性能 |
数据容量支持100000条以上记录 |
是 |
支持 |
支持 |
|
并发查询处理能力 |
|
SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错。 |
并发性较好(在模拟器中有使用,支持50个并发查询没问题) |
|
|
查询速度 |
是 |
|
数据量少的情况非常好 |
|
|
修改速度 |
是 |
|
|
|
|
平台支持 |
32/64位 |
|
全部支持 |
全部支持(需java平台支持) |
|
Linux/window/UNIX/mobile |
|
支持Linux/Mac OS/Windows |
全部支持(需java平台支持) |
|
|
运行方式支持 |
支持嵌入式 |
|
支持 |
支持 |
|
支持独立运行 |
|
不支持 |
支持 |
|
|
连接方式支持 |
支持ODBC |
|
不支持 |
支持 |
|
支持JDBC |
|
必须通过第三方的JDBC驱动 |
支持 |
|
|
支持内存访问 |
|
通过c接口(专用API) |
通过JDBC,不支持API访问 |
|
|
支持网络访问 |
|
不支持 |
支持 |
|
|
SQL支持 |
支持SQL |
是 |
支持 |
支持 |
|
支持Index,Trigger, Constrains,Views |
|
支持,有资料说其不支持外键约束。 |
支持 |
|
|
管理界面 |
支持管理界面 |
|
支持CLI |
支持Web界面的管理控制台 |
|
管理界面友好程度 |
|
较差 |
较好 |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22994674/viewspace-1117373/ ,如需转载,请注明出处,否则将追究法律责任。