IBM SolidDB是一款数据管理平台,该平台将基于内存和磁盘的全事务处理数据库引擎、载体级高,可用性及强大的数据复制功能紧密地融为一体。
SolidDB集基于内存和磁盘的多线程数据库引擎于一身,以提高事务处理速度并在同一数据库内最有效地利用系统资源。SolidDB管理平台的设计可以无缝融合到需要高速、灵活以及需要不间断访问的数据管理技术解决方案中。用户既可以把表建在内存内,也可以象普通数据库一样建在磁盘上,使用非常灵活,而且具备完善的数据保护机制。
SolidDB是一个具备完整功能的关系型数据库,完全支持SQL规范以及ODBC/JDBC。SolidDB完整的功能更可以满足用户日益扩大的应用需求,同时也能帮用户节约开发时间和成本。
SolidDB在同类产品中有一些很独特的功能,如Smart Flow, Transparent Failover, Load Balance以及Universal Cache(可以加快访问 IBM DB2、IBM Informix? Dynamic Server (IDS)、Oracle、Microsoft SQL Server 和 Sybase 数据库的速)等。
Solid公司于2008年被IBM收购,SolidDB成为IBM家族的一个产品。
安装配置
1. 安装
solidDB 系统需求大约 64MB 磁盘空间,用于保存代码、文档和测试数据库。默认配置需要至少 40MB 内存,在内存中保存的每个表需要额外的空间。
solidDB 数据库的安装是通过 Java based InstallAnywhere 来进行的,因此需要 JRE 或 JDK 1.4.2 或更新的版本来运行 solidDB 安装程序。
整个安装步骤大致如下:
·如果还没有安装 Java 运行时环境(JRE)或 Java Development Kit(JDK),V1.4.2 或更新的版本,先将其安装。
·在 Windows 系统上,运行 exe 产品安装文件执行安装。在 Unix 或 Liunx 系统上,运行相应的 bin 产品安装文件执行安装。界面如图 1 所示。
·在简介屏幕上,按 Enter 键以显示许可协议。浏览并接受许可协议。输入安装目录的绝对路径,或者按 Enter 键以接受缺省值。如果安装程序无法创建此目录,那么将提示您指定另一个目录。查看安装总结。按 Enter 键以开始安装。
·如果购买了 solidDB 或 solidDB Universal Cache,请将许可证文件(solid.lic 或 soliduc.lic)从许可证证书映像复制至 solidDB 工作目录。solidDB 的缺省安装将在 solidDB 安装目录下包括一个评估许可证(solideval.lic)。评估许可证允许您在 90 天之内试用 solidDB。
·如果计划使用 solidDB JDBC 驱动程序,将所在环境的 CLASSPATH 环境变量设置为包含 solidDB JDBC 驱动程序 .jar 文件安装路径。 solidDB JDBC 驱动程序(SolidDriver2.0.jar)位于 solidDB 安装目录下的 jdbc 目录中。
2. 配置
solidDB 从 solid.ini 文件中获取它的大多数配置信息。更确切地说,其实有两个不同的 solid.ini 配置文件,一个位于服务器上,另一个位于客户端。这两个配置文件都不是必需的。如果没有配置文件,那么将使用出厂值。这两个 solid.ini 配置文件分别包含客户端和服务器的配置参数。如果使用了 ODBC 驱动程序,那么将使用客户端配置文件,并且此文件必须在应用程序的工作目录中。
当启动 solidDB 时,它将从 solid.ini 配置文件中读取配置参数。也可以使用不带配置文件的 solidDB,这种情况下将使用缺省设置。solid.ini 配置文件指定了可帮助定制和优化 solidDB 的参数。例如,FileSpec 参数指定 solidDB 数据库文件的名称和最大大小。
另外,当启动 solidDB 时,它将检查数据库是否已经存在。如果未找到任何数据库,那么引擎会自动使用 solid.ini 配置文件中的设置来创建新的数据库。
${PageNumber} Benchmark测试
·测试环境
本次测试使用的软硬件环境如下:
硬件配置:Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz,4核8线程,内存8GB。
操作系统: Redhat Enterprise Linux 6.0 X64。
·测试假定
本次测试为充分展示内存数据库的性能,使用SolidDB的Disk less方式,并创建内存表,使用SolidDB的sa接口完成测试。
·数据结构
create table RECORD (IDinteger, I1integer, I2integer, D1 float,D2 float, S1 VARCHAR, S2 VARCHAR, PRIMARY KEY (ID))
插入测试
1. 单线程
首先进行单线程的插入测试,向数据库中插入10000000条记录,性能如下:
线程ID | 记录数 | 耗时(毫秒) |
1 | 10000000 | 1796677 |
每条记录所花费的时间(微秒) | 179.6677 | |
每秒吞吐率(object/s) | 5565.830697 |
单线程插入10000000条记录的耗时为1796秒,每条记录的花费时间为180微秒,每秒处理的记录数为0.56万。
2. 四线程
之后我们增加线程数为4.
四个线程同时插入10000000条记录,性能如下:
线程ID | 记录数 | 耗时(毫秒) |
1 | 2500000 | 491358 |
2 | 2500000 | 492830 |
3 | 2500000 | 493357 |
4 | 2500000 | 494972 |
插入10000000条记录所花费的总时间(秒) | 493.12925 | |
每条记录所花费的时间(微秒) | 49.312925 | |
每秒吞吐率(object/s) | 20278.6592 |
四个线程插入10000000条记录的总耗时为493秒,平均每条记录耗时49.3微秒,每秒处理2万条数据。
3. 八线程
最后将线程数增加到八个线程,向数据库中添加10000000条记录,每个线程的性能和总体性能如下:
线程ID | 记录数 | 耗时(毫秒) |
1 | 1250000 | 170789 |
2 | 1250000 | 173127 |
3 | 1250000 | 173270 |
4 | 1250000 | 175674 |
5 | 1250000 | 175954 |
6 | 1250000 | 186918 |
7 | 1250000 | 187381 |
8 | 1250000 | 187409 |
插入10000000条记录所花费的总时间(秒) | 178.81525 | |
每条记录所花费的时间(微秒) | 17.881525 | |
每秒吞吐率(object/s) | 55923.64186 |
可以看到8个并发写入10000000条记录所花费的时间大概为178.8秒,平均每秒可以添加5.6万条记录。
4. 总结
插入操作的总体吞吐率:
可以看到,插入操作的性能,8个线程并发操作时,吞吐率最大。
${PageNumber} 更新测试
1. 单线程
首先进行单线程的更新测试,在数据库中进行10000000次更新,每次更新一条记录的所有字段,性能如下:
线程ID | 记录数 | 耗时(毫秒) |
1 | 10000000 | 2606681 |
每条记录所花费的时间(微秒) | 260.6681 | |
每秒吞吐率(object/s) | 3836.29604 |
单线程更新10000000条记录的耗时为2606秒,每条记录的更新花费时间为261微秒,每秒处理的记录数为0.38万。
2. 四线程
之后我们增加线程数为4.
四个线程同时更新10000000条记录,性能如下:
线程ID | 记录数 | 耗时(毫秒) |
1 | 2500000 | 755055 |
2 | 2500000 | 756552 |
3 | 2500000 | 758577 |
4 | 2500000 | 760468 |
插入10000000条记录所花费的总时间(秒) | 757.663 | |
每条记录所花费的时间(微秒) | 75.7663 | |
每秒吞吐率(object/s) | 13198.4801 |
四个线程更新10000000条记录的总耗时为757秒,平均每条记录耗时75.7微秒,每秒处理1.32万条数据。
3. 八线程
更新测试是通过八个线程,同时更新数据库中记录,共10000000次操作,每个线程的性能和总体性能如下:
线程ID | 记录数 | 耗时(毫秒) |
1 | 1250000 | 241278 |
2 | 1250000 | 241411 |
3 | 1250000 | 241638 |
4 | 1250000 | 241846 |
5 | 1250000 | 242336 |
6 | 1250000 | 242492 |
7 | 1250000 | 242605 |
8 | 1250000 | 243235 |
更新10000000条记录的耗时(秒) | 242.105125 | |
更新每条记录所的耗时(微秒) | 24.2105125 | |
每秒吞吐率(object/s) | 41304.3714 |
可以看到8个并发同时更新10000000条记录所花费的时间大概为242秒,平均每秒可以更新4.1万条记录。此处的更新为涉及到了每条记录的每个字段。
4. 总结
更新操作的总体吞吐率:
可以看到,更新操作的性能,同样也是8个线程并发操作时,吞吐率最大。
${PageNumber} 查询测试
1. 单线程
首先进行单线程的查询测试,在数据库中进行10000000次查找,性能如下:
线程ID | 记录数 | 耗时(毫秒) |
1 | 10000000 | 1757760 |
每条记录所花费的时间(微秒) | 175.776 | |
每秒吞吐率(object/s) | 5689.058802 |
单线程进行10000000次查询的耗时为1758秒,每次查询花费时间为176微秒,每秒处理的操作数为0.57万。
2. 四线程
之后我们增加线程数为4.
四个线程进行10000000次查找操作,性能如下:
线程ID | 记录数 | 耗时(毫秒) |
1 | 2500000 | 456052 |
2 | 2500000 | 457558 |
3 | 2500000 | 457776 |
4 | 2500000 | 467496 |
插入10000000条记录所花费的总时间(秒) | 459.7205 | |
每条记录所花费的时间(微秒) | 45.97205 | |
每秒吞吐率(object/s) | 21752.34735 |
四个线程进行10000000次查找操作的总耗时为460秒,平均每条记录耗时46微秒,每秒处理2.17万次查询操作。
3. 八线程
查询测试是通过八个线程,同时查询数据库中记录,共10000000次查询,每个线程的性能和总体性能如下:
线程ID | 记录数 | 耗时(毫秒) |
1 | 1250000 | 138539 |
2 | 1250000 | 138930 |
3 | 1250000 | 138945 |
4 | 1250000 | 139056 |
5 | 1250000 | 139483 |
6 | 1250000 | 140850 |
7 | 1250000 | 141758 |
8 | 1250000 | 142580 |
查询10000000次的耗时(秒) | 140.017625 | |
每次查询的耗时(微秒) | 14.0017625 | |
每秒吞吐率(object/s) | 71419.58021 |
可以看到8个并发同时查询10000000条记录所花费的时间大概为140秒,平均每秒可以进行7.1万次查询。
4. 总结
查询操作的总体吞吐率:
可以看到,查询操作的性能,同样也是4个线程并发操作时,吞吐率最大。
${PageNumber} 1:1读写测试
1. 四线程
首先进行四线程的读写测试,其中2个线程做更新操作,另外两个线程做查询操作,持续运行10秒钟,每个线程的性能和总体性能如下:
线程ID | 操作 | 操作次数 |
1 | 查询 | 54175 |
2 | 查询 | 53892 |
3 | 更新 | 31654 |
4 | 更新 | 31501 |
每秒查询吞吐率(完成次数/s) | 10806.7 | |
每秒更新吞吐率(完成次数/s) | 6315.5 | |
总吞吐率(完成次数/s) | 17122.2 |
在四个线程进行读写测试时,平均每秒可以进行1.08万次查询,0.63万次更新,总体吞吐率为1.71万。
2. 八线程
读写测试是通过八个线程,其中四个线程持续做更新操作,另外四个线程做查询操作,持续运行10秒中,每个线程的性能和总体性能如下:
线程ID | 操作 | 操作次数 |
1 | 查询 | 86541 |
2 | 查询 | 88496 |
3 | 查询 | 88899 |
4 | 查询 | 89359 |
5 | 更新 | 52063 |
6 | 更新 | 51586 |
7 | 更新 | 52002 |
8 | 更新 | 52318 |
每秒查询吞吐率(完成次数/s) | 35329.5 | |
每秒更新吞吐率(完成次数/s) | 20796.9 | |
总吞吐率(完成次数/s) | 56126.4 |
可以看到同时进行读写测试时,平均每秒可以进行3.5万次查询,2.1万次更新,总体吞吐率为5.6万。
3. 总结
1:1读写操作的总体吞吐率:
可以看到,1:1读写操作的性能,8线程比4线程总体吞吐率高很多。
${PageNumber} 删除测试
1. 单线程
首先进行单线程的删除测试,在数据库中进行10000000次删除,每次删除一条记录,性能如下:
线程ID | 记录数 | 耗时(毫秒) |
1 | 10000000 | 2594770 |
每条记录所花费的时间(微秒) | 259.477 | |
每秒吞吐率(object/s) | 3853.906 |
单线程进行10000000次删除操作的耗时为2595秒,每次查询花费时间为259.5微秒,每秒处理的操作数为0.385万。
2. 四线程
之后我们增加线程数为4.
四个线程进行10000000次删除操作,性能如下:
线程ID | 记录数 | 耗时(毫秒) |
1 | 2500000 | 642164 |
2 | 2500000 | 646238 |
3 | 2500000 | 646266 |
4 | 2500000 | 652727 |
插入10000000条记录所花费的总时间(秒) | 646.8488 | |
每条记录所花费的时间(微秒) | 64.68488 | |
每秒吞吐率(object/s) | 15459.56 |
四个线程进行10000000次删除操作的总耗时为647秒,平均删除每条记录耗时64.7微秒,每秒处理1.55万次删除操作。
3. 八线程
删除测试是通过八个线程,按照记录ID,同时删除数据库中记录,共10000000个对象,每个线程的性能和总体性能如下:
线程ID | 记录数 | 耗时(毫秒) |
1 | 1250000 | 252805 |
2 | 1250000 | 262653 |
3 | 1250000 | 265421 |
4 | 1250000 | 265445 |
5 | 1250000 | 273086 |
6 | 1250000 | 273289 |
7 | 1250000 | 295351 |
8 | 1250000 | 295747 |
查询10000000次的耗时(秒) | 272.9746 | |
每次查询的耗时(微秒) | 27.29746 | |
每秒吞吐率(object/s) | 36633.44 |
可以看到8个并发同时删除10000000条记录所花费的时间大概为273秒,平均每秒可以进行3.7万次删除。
4. 总结
查询操作的总体吞吐率:
可以看到,删除操作的性能,同样也是8个线程并发操作时,吞吐率最大。
以上测试都是每次操作都为一个事务,每次操作只涉及一条记录。
本文总结:
这里的测试的所有数据均是驻留在内存中,SolidDB有两种数据库引擎,同时支持内存表和磁盘表,查询和事物可以同时跨越两种类型的表,表类型对应用和用户透明,由于查询磁盘表会极大的损失性能,不能作为内存数据库的参考,故在此没有测试。双数据库引擎这种设计原想是想把冷数据和热数据分开存放,即要内存数据的性能,又要磁盘数据库稳定。在2007年,SolidDB推出了SolidDB for MySQL,2008年被IBM收购,成为了IBM数据库产品。