对于Cassandra 两节点集群我们已经做了插入数据的压力测试:文章见http://supercharles888.blog.51cto.com/609344/869276

 

这里纯粹作为对比,我们在关系数据库中插入50W条数据,来作为和NoSQL的比较

我们选用Oracle DB ,当然了,数据库所在的宿主机器也是VM并且和刚集群的一样。

为了提高速度,我们用了预编译语句,这样没必要多次打开游标,并且可以重用这条插入语句的执行计划。

代码如下,为了减少时间开销,我把所有的变量,字段的定义都放在循环外面了,这样可以减少创造大量小对象所用的额外时间开销,而且我以牺牲可读性的方式减少函数之间的调用开销,所以看到所有的执行过程都封装在一个函数中:

 
  
  1. /*  
  2.  */ 
  3. package com.charles.cassandra.demo; 
  4.  
  5.  
  6. import java.sql.Connection; 
  7. import java.sql.Date; 
  8. import java.sql.DriverManager; 
  9. import java.sql.PreparedStatement; 
  10. import java.sql.ResultSet; 
  11. import java.sql.Statement; 
  12. import java.sql.ResultSetMetaData; 
  13. import java.sql.Timestamp; 
  14.  
  15.  
  16. /** 
  17.  * 
  18.  * Description:插入50W条记录到关系数据库中 
  19.  * 
  20.  * @author charles.wang 
  21.  * @created May 19, 2012 5:25:36 PM 
  22.  *  
  23.  */ 
  24.  
  25. public class OracleStressTest1 { 
  26.  
  27.   
  28.      
  29.      
  30.      
  31.     /** 
  32.      * 既然要测负载,就尽可能减少方法调用的时间开销,所以我用了最原始的写法 
  33.      * @param args 
  34.      */ 
  35.      
  36.     public static void main(String[] args){ 
  37.          
  38.         String url="jdbc:oracle:thin:@192.168.129.14:15210:ora11g"
  39.         String username="Charles_Stress_Test1"
  40.         String password="Charles_Stress_Test1"
  41.          
  42.         String sDBDriver = "oracle.jdbc.driver.OracleDriver"
  43.  
  44.         try
  45.              
  46.             System.out.println("开始压力测试,我们以预编译的方式插入50W条数据到Oracle中"); 
  47.             System.out.println("..."); 
  48.             //标记开始时间 
  49.             long startTime=System.currentTimeMillis(); 
  50.                      
  51.                      
  52.             Class.forName(sDBDriver).newInstance(); 
  53.             Connection conn = DriverManager.getConnection(url,username,password); 
  54.              
  55.             //因为这里使用预编译语句,所以不用每次都生成新的执行计划 
  56.              
  57.             String rowkey=null
  58.             String id=null
  59.             String name=null
  60.             Date date=null
  61.             String statementString="insert into Student (rowkey,id,name,create_date )values(?,?,?,?)";; 
  62.             
  63.             PreparedStatement pstmt = conn.prepareStatement(statementString); 
  64.             for(int i=0;i<500000;i++){ 
  65.                 rowkey="a"+i; 
  66.                 id=""+i; 
  67.                 name="student"+i; 
  68.                 date= new Date(System.currentTimeMillis()); 
  69.                   
  70.                 pstmt.setString(1,rowkey); 
  71.                 pstmt.setString(2, id); 
  72.                 pstmt.setString(3,name); 
  73.                 pstmt.setDate(4, date); 
  74.                 pstmt.execute(); 
  75.             } 
  76.              
  77.             //关闭相关连接 
  78.             pstmt.close(); 
  79.             conn.close(); 
  80.              
  81.             long endTime=System.currentTimeMillis(); 
  82.             long elapsedTime=endTime-startTime; 
  83.              
  84.             System.out.println("压力测试完毕,用时: "+elapsedTime+" 毫秒"); 
  85.              
  86.         }catch(Exception e){ 
  87.             System.out.println("数据库连接失败"); 
  88.             e.printStackTrace(); 
  89.         } 
  90.          
  91.         
  92.         
  93.     } 
  94.      
  95.  

我们最终执行结果是:

 
  
  1. 开始压力测试,我们以预编译的方式插入50W条数据到Oracle中 
  2. ... 
  3. 压力测试完毕,用时: 446223 毫秒 

为了验证我们数据库的确插入了50W条记录:

所以,从这里看出,我们插入50W 条记录一共用了446223毫秒,差不多7分半钟,这个成绩甚至好于同样低硬件配置条件下的插入50W条记录到Cassandra集群中的用时(11分半钟)。

 

所以官方教程说Cassandra对于写操作性能很强大,我想应该是基于硬件配置足够强大的情况,那时候才能体现Cassandra的优势。对于低配置的机器,也许关系数据库更好。