`
AreYouOK?
  • 浏览: 56670 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JDBC数据库插入性能测试

阅读更多

版本

2008年8月21日,完成测试1的Oracle_Win、Mysql_Li、Mysql _Win、MSSQL部分。
2008年8月22日,完成测试2的Oracle_Win、Mysql_Li、Mysql _Win、MSSQL部分。

2008年8月23日,文档整理。

2008年8月25日,完成postgresql linux版本的测试1、测试2。
2008年8月27日,完成postgresql windows版本的测试1、测试2。



1.背景
这不是数据库性能的综合测试,这里只测试插入,并且是用JDBC插入。这是针对某种应用的某模块的简单模拟,不可能适用所有的情况。
假设系统的基本情况是,有后台线程要不停的读取数据,并写入流水表,写入以后就不会update。没有人使用系统的时候,就没有查询,偶尔才会有人来使用。查询的时候,因为数据量比较大,性能优化也是一个重要的问题,但不在本文讨论范围之内。

本文还没有完成,测试3还没有进行,并缺少Oracle Linux版本和PostgreSQL的数据。计划将来补上。

2.测试方法

测试1,简单表测试
建立3个一模一样的小表,只有3个数字类型的字段,一个主键,没有另外建索引。对不同的数据库执行以下测试:
A.用1个线程写一个表
B.用2个线程同时写2个不同的表
C.用2个线程写同一个表
D.用3个线程同时写3个不同的表
E.用3个线程写同一个表
每50条为一批进行批量操作,每5秒进行一次采样,稳定运行一段时间以后,取每秒插入的数据条数进行比较。用多个线程并发进行操作可以检查对双核CPU的利用效果。

测试2,普通表测试
与测试1相同,但是表不一样,建立3个一模一样的表。表包含10个各种字段,另外再单独建3个索引。

测试3,超大表测试(TODO)
与测试1相同,但是表不一样,建立3个一模一样的表。表包含100个以上的字段,10个索引。系统中有类似这样的流水表。

 

3.环境定义
3.1.硬件环境定义
笔记本
CPU Core Duo T2350(双核,1.86G)
硬盘120G
内存2G

Java程序和数据库跑在一个机器上测试确实不太好,不过只有这样的条件。另外,在小型客户那里的生产环境,有把数据库和Java应用服务器安装在一个机器的情况,因此这样也能说明一些问题。

3.2.操作系统定义
Windows平台:Windows XP Pro SP2,文件系统NTFS
Linux平台:Ubuntu 8.04,文件系统EXT3

Windows 平台上已经尽可能停用了无关的程序,比如杀毒软件等。
CPU在负载低的时候会自动降频到800M,在Windows下,使用软件RMClock将主频强制稳定在1.86G,避免CPU频率调整可能带来的性能波动。Linux下没有做这个处理(因为不知道用什么软件)。
为了偷懒是在Eclipse里面运行的,不过应该没有太多的影响。程序在循环中没有生成垃圾对象,不清楚数据库驱动程序会不会,但是应该不会频繁GC吧。

3.3.待测试数据库环境定义

 

数据库 OS 缩写 说明
Oracle 10g 10.2.01 Windows Oracle_win JDBC驱动程序用的安装Oracle后自带的。先整理磁盘碎片,然后建立新的表空间和用户,数据表空间5G,临时表空间200M,重做日志文件3×50M。
Oracle 10g 10.2.01 Linux Oracle_Li
MS SQL Server 2005 SP2 Windows MSSQL JDBC驱动程序为jtds1.2.2。磁盘碎片整理后建立数据库文件5G,日志文件100M。
MySQL 5.1.26 RC Linux Mysql_Li
存储引擎为InnoDB。JDBC驱动为mysql-connector-java-5.1.6-bin.jar
MySQL 5.1.26 RC Windows Mysql_Win 存储引擎为InnoDB。JDBC驱动为mysql-connector-java-5.1.6-bin.jar

Postgresql 8.3.3

Linux Pgsql_Li JDBC3 Postgresql Driver, Version 8.3-603。

Postgresql 8.3.3

Windows Pgsql_Win JDBC3 Postgresql Driver, Version 8.3-603。


数据库没有再做什么优化,简单的调整内存之类的参数,对测试结果基本没有影响。

4.测试结果

明细结果在附件(Eclipse工程)的result中。有的测试重复做过多次,基本上数据都是稳定的。
文件名命名规则是:数据库_s_线程数_表相同或不相同,s表示simple,n表示normal

输出每行表示一次采样,5秒1次,“本阶段平均”表示这5秒的平均速度,“共处理”是进程启动以后处理记录的总和,“平均”是根据启动后处理的记录总数和总时间计算出来的:

normal_evt 2170/s normal_evt 2050/s normal_evt 2170/s 本阶段平均6390/s 共处理3,1950条 平均6390/s


4.1.结果数据

测试1,简单表,3字段,1主键,无索引

条/秒 1线程1表 2线程2表 2线程1表 3线程3表 3线程1表
Oracle_Li





Oracle_Win 3,7205 5,6065 4,2437 5,0640 4,6861
Mysql_Li 1,0287 2,0449 1,2751 2,0397 1,4239
Mysql_Win 1020 1173 1167 1706 1671
MSSQL 2975 5584 5561 7705 7703
Pgsql_Li

1,3882

2,1870 2,2225 2,2402 2,4181
Pgsql_Win 1,0241 1,7287 1,7323 1,7153 1,8160



测试2,普通表,10字段,1主键,3索引

条/秒 1线程1表 2线程2表 2线程1表 3线程3表 3线程1表
Oracle_Li
Oracle_Win 1,9989 2,2001 1,8419 2,2442 1,8643
Mysql_Li 5857 1,0226 5890 1,0204 6180
Mysql_Win 973 1152 1142 1685 1595
MSSQL 2692 5155 5150 7173 6922
Pgsql_Li 8763 1,1492 1,2935 1,0141 1,2517
Pgsql_Win 7043 9997 9671 1,2274 1,2645



4.2.结果分析
不同的数据库在不同的方式下表现不一样,取最好的成绩,结果是Oracle_Win > Mysql_Li > MSSQL >> Mysql_Win。具体情况可以看上面的表。
除了Oracle以外,其他的数据库插入的性能都很稳定。
CPU占用率通常在20%~60%之间,随着线程数的增加略有提高。

下面对单个数据库做分析:
4.2.1.Mysql_Li

mysql的特点是,当使用2个线程插入2个不同的表时,性能立刻提高了整整一倍,使用3个线程插入3个表的时候却,相比2线程2表没有提高。看起来,要用至少两个线程才能充分利用双核的两个CPU(其实是4个线程,2个java线程,2个数据库线程,但是java线程资源占用率较小,主要瓶颈还是在数据库)。
当使用多个线程同时入1个表时,性能只是稍微有点提高。

4.2.2.Mysql_Win
都说Mysql Windows版本性能不行,没想到差那么多。但是有两个很有意思的特点(MS SQL差不多也有这样的特点):第一是测试2的数据比测试1几乎没有下降,而测试2的表要复杂的多,看来mysql有个瓶颈在我们不知道的地方,使得面对一个很简单的表,速度也上不去;第二是不断增加线程,性能始终能够提高,后来我又做了4线程和5线程的测试,仍然如此,不过提高的幅度越来越小。

4.2.3.Oracle_Win
插入性能很不稳定。如果把采样时间缩短为1秒,会发现大部分时间性能是基本稳定的,但每隔一小段时间,会基本失去响应(插入速度能降低到200以下),估计是重做日志的切换引起的,Oracle重做日志是3×50M。
随着数据量的增加,性能稍有下降,因此每次测试先都先truncate表,测试1的5次运行每次都在单表数据量达到1000w时结束测试,测试2在500w时结束测试。尚未测试在极大的数据量情况下会怎么样,但oracle在这种情况下的表现应该是久经考验的,估计可能到了一定的程度会稳定吧。

oracle的数据相当的好,并且其他数据库往往需要增加线程来获得更好的成绩,而oracle在1个线程的情况下能得到相对最好的成绩,增加线程以后提高不多。
当使用2个线程入2个表时,测试1提高50%,测试2略微提高。3个线程入3表则没有提高。
多个线程入同一个表的时候,测试1性能只有一些提高,而测试2竟出现了下降,但这种情况也不是不可思议的,测试2有10个字段,包括主键有4个索引,多个线程可能在争夺资源中出现了锁定。

cpu占有率波动很大,通常在10%~70%左右以大约20秒的周期剧烈波动,随着线程数的增加,占有率稍有上升。cpu占有率低时,写入速度也急剧下降,应该是切换重做日志引起。

最初做Oracle这个测试的时候,是把表建在一个已经有很多数据的表空间里面。后来,做碎片整理,然后新建表空间和用户,再测试,性能提高了30%。

4.2.4.MSSQL
MSSQL的特点和Windows下的Mysql差不多,测试1和测试2数据相当,似乎有别的瓶颈。刚开始的时候,数据真是非常可怜(与它假象的对手oracle相比),不过在增加线程后出现了可观的提高,不然就要沦落为和Mysql_win一个量级了。

 4.2.5.Pgsql_Li
Postgresql的数据比mysql略高。

 4.2.6.Pgsql_Win
postgresql在windows下性能只出现了少量下降。有一个特点是在3个线程的时候CPU占用率接近到100%。

 

 

  • dbtest.zip (328.8 KB)
  • 描述: 代码工程和本文的pdf版本文档,更新于2008-08-29
  • 下载次数: 170
分享到:
评论

相关推荐

    Mybatis与JDBC批量插入MySQL数据库性能测试

    Mybatis与JDBC批量插入MySQL数据库性能测试,资源包含文档、代码和数据库。

    使用JDBC插入大量数据的性能测试

    使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试:1、使用statement插入100000条记录  使用jdbc向数据库插入100000条记录,分别使用...

    软件测试中使用JDBC插入大量数据的性能测试

    jdbc数据软件测试中使用JDBC插入大量数据的性能测试使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试:1、使用statement插入100000条记录...

    jdbc连接数据库的方式2

    三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能(系转载)。  1、在客户端软件开发中使用Thin驱动程序  在开发Java软件方面,Oracle...

    AlliedTesting/pgmex-jdbc-perf-test:用于比较来自 Matlab 的 PostgreSQL 的 PgMex 和 JDBC 连接器的性能测试包-matlab开发

    开发测试套件是为了比较 PgMex 库和通过直接 JDBC 连接工作的 Matlab 数据库工具箱的性能。 目前的测试涵盖了不同插入方法和要插入的数据类型的性能,以及通过多种方式检索标量数据的性能。 通过该套件获得的实验...

    Java数据库编程宝典3

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    Java数据库编程宝典2

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    Java数据库编程宝典1

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    Java数据库编程宝典4

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    支持多数据库的ORM框架ef-orm.zip

    实际性能测试表明,EF的大部分操作都要快于Hiberante和MyBatis, 部分操作速度甚至数十倍于上述框架。 EF在极限插入模式下,甚至刷新了每秒10万条写入的记录。远远超过了其他框架。 一个初步的性能测试:测试代码...

    postgres-json

    本次测试内容主要测试MongoDB/PostgreSQL,在性能方面对比,包括插入性能与查询性能 二、测试目标 测试PostgreSQL在使用文档类型这方面的性能 三、测试方法 本次采用apache的开源测试工具jmeter,采用数据结构...

    超强MySQL课程笔记_V4.0.ctb

    DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据 SELECT C. DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE 3. 数据访问技术 A. ODBC PHP <.php> B. ...

    基于Java Swing + MySQL + JDBC 的图书管理系统.zip

    它完全支持结构化查询语言(SQL),允许用户进行数据查询、插入、更新、删除、创建和管理数据库结构等操作。SQL标准的广泛支持使得MySQL易于学习,且与其他关系型数据库系统有良好的互操作性。 存储引擎 MySQL支持...

    沪宁全线动车售票系统-毕业论文系统设计原装全套 jsp servlet mysql jsbc

    沪宁全线动车售票系统 ...选择oracle10g数据库通过SQL语句建立表,插入相关的测试数据等相关操作,完成数据库的建立。 4.本设计采用JSP+Servlet+JDBC+oracle技术进行开发,最后通过JDBC进行与数据库的相关的链接。

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2...

    Apache JMeter压力测试工具-其他

    Apache JMeter能够加载和性能测试许多应用程序/服务器/协议类型:网络-HTTP,HTTPS(Java,NodeJS,PHP,ASP.NET等)SOAP / REST Web服务的FTP通过JDBC的数据库LDAP通过JMS的面向消息的中间件(MOM)邮件-SMTP(S)...

    JSP+Servlet+EJB3.0+Oracle10g火车售票系统

    本系统主要实现火车查询...3.选择Oracle数据库通过SQL语句建立表,插入相关的测试数据等相关操作,完成数据库的建立。 4.本设计采用JSP+Servlet+EJB3.0+Oracle10g工具进行开发,最后通过JDBC进行与数据库的相关的链接。

    shardingsphere-benchmark:分布式数据库中间件

    ShardingSphere Benchmark是一种性能工具,可以检查其核心方案的基准,如下图所示。基准案例的数量为96,公式为3(方案)* 4(产品)* 2(SQL类型)* 4(规则)。 完整路由:sql将路由到所有物理表。 范围路由:sql...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    良好的安全性能,防火墙技术可以保证后台数据库的安全性。所有的配置工作都集中在服务器端且所有客户端请求都是通过DBMS来访问数据库,从而大大减少了数据直接暴露的风险。 第四章 系统设计 4.1开发框架技术介绍 ...

Global site tag (gtag.js) - Google Analytics