对于Cassandra 两节点集群我们已经做了插入数据的压力测试:文章见http://supercharles888.blog.51cto.com/609344/869276
这里纯粹作为对比,我们在关系数据库中插入50W条数据,来作为和NoSQL的比较
我们选用Oracle DB ,当然了,数据库所在的宿主机器也是VM并且和刚集群的一样。
为了提高速度,我们用了预编译语句,这样没必要多次打开游标,并且可以重用这条插入语句的执行计划。
代码如下,为了减少时间开销,我把所有的变量,字段的定义都放在循环外面了,这样可以减少创造大量小对象所用的额外时间开销,而且我以牺牲可读性的方式减少函数之间的调用开销,所以看到所有的执行过程都封装在一个函数中:
- /*
- */
- package com.charles.cassandra.demo;
- import java.sql.Connection;
- import java.sql.Date;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.Statement;
- import java.sql.ResultSetMetaData;
- import java.sql.Timestamp;
- /**
- *
- * Description:插入50W条记录到关系数据库中
- *
- * @author charles.wang
- * @created May 19, 2012 5:25:36 PM
- *
- */
- public class OracleStressTest1 {
- /**
- * 既然要测负载,就尽可能减少方法调用的时间开销,所以我用了最原始的写法
- * @param args
- */
- public static void main(String[] args){
- String url="jdbc:oracle:thin:@192.168.129.14:15210:ora11g";
- String username="Charles_Stress_Test1";
- String password="Charles_Stress_Test1";
- String sDBDriver = "oracle.jdbc.driver.OracleDriver";
- try{
- System.out.println("开始压力测试,我们以预编译的方式插入50W条数据到Oracle中");
- System.out.println("...");
- //标记开始时间
- long startTime=System.currentTimeMillis();
- Class.forName(sDBDriver).newInstance();
- Connection conn = DriverManager.getConnection(url,username,password);
- //因为这里使用预编译语句,所以不用每次都生成新的执行计划
- String rowkey=null;
- String id=null;
- String name=null;
- Date date=null;
- String statementString="insert into Student (rowkey,id,name,create_date )values(?,?,?,?)";;
- PreparedStatement pstmt = conn.prepareStatement(statementString);
- for(int i=0;i<500000;i++){
- rowkey="a"+i;
- id=""+i;
- name="student"+i;
- date= new Date(System.currentTimeMillis());
- pstmt.setString(1,rowkey);
- pstmt.setString(2, id);
- pstmt.setString(3,name);
- pstmt.setDate(4, date);
- pstmt.execute();
- }
- //关闭相关连接
- pstmt.close();
- conn.close();
- long endTime=System.currentTimeMillis();
- long elapsedTime=endTime-startTime;
- System.out.println("压力测试完毕,用时: "+elapsedTime+" 毫秒");
- }catch(Exception e){
- System.out.println("数据库连接失败");
- e.printStackTrace();
- }
- }
- }
我们最终执行结果是:
- 开始压力测试,我们以预编译的方式插入50W条数据到Oracle中
- ...
- 压力测试完毕,用时: 446223 毫秒
为了验证我们数据库的确插入了50W条记录:
所以,从这里看出,我们插入50W 条记录一共用了446223毫秒,差不多7分半钟,这个成绩甚至好于同样低硬件配置条件下的插入50W条记录到Cassandra集群中的用时(11分半钟)。
所以官方教程说Cassandra对于写操作性能很强大,我想应该是基于硬件配置足够强大的情况,那时候才能体现Cassandra的优势。对于低配置的机器,也许关系数据库更好。
本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/869414,如需转载请自行联系原作者