最近有个项目要用到高性能数据库,数据量不大但读写统计非常频繁,所以优先考虑内存数据库。找了找发现一个叫H2的数据库,据说性能不错,拿来试验一下。

硬件环境:Inter E8400 @ 3.0G,4G内存
软件环境:Windows 7 32bit,H2 1.3.167,JDK 1.6

开发时非常简单,只有一个1.2M的jar文件,引入项目就可以了。

测试代码:

   
   
   
   
  1. import java.sql.*; 
  2. import java.util.*; 
  3.  
  4. public class H2Test { 
  5.  
  6.     public static void main(String[] args) throws Exception { 
  7.         //以嵌入式内存模式工作,建个简单的表 
  8.         Connection conn = DriverManager.getConnection("jdbc:h2:mem:test"); 
  9.         PreparedStatement stmt = conn.prepareStatement("CREATE TABLE cc (GUID varchar(40) PRIMARY KEY,Data int,AddTime datetime)"); 
  10.         stmt.execute(); 
  11.         Random rand = new Random(); 
  12.          
  13.         //精度要求不高,就用这个计时吧 
  14.         long start = System.currentTimeMillis(); 
  15.         stmt = conn.prepareStatement("INSERT INTO cc VALUES (RANDOM_UUID(), ?, NOW())"); 
  16.         for(int i = 0;i < 100000;++i){ 
  17.             stmt.setInt(1, rand.nextInt()); 
  18.             stmt.execute(); 
  19.         } 
  20.         long duration = System.currentTimeMillis() - start; 
  21.         conn.close(); 
  22.          
  23.         System.out.println("Finished in " + duration + " ms"); 
  24.     } 

运行一下,单线程插入10万条数据,只用时1827ms,性能确实惊人,之前对比过MySQL的Memory引擎,同样的表结构,记得插入10万条记录大约要8秒。

PS:另外测试了一下5个线程并发总共插入10万条记录,性能略有下降,2050ms。

PPS:如果不用内存模式,改用tcp模式,性能下降严重,10万次插入要将近7秒,不过和MySQL比仍有一点优势。