mysql、h2插入性能对比

2013-01-05 更新:导致循环调用save插入慢的问题是我循环调用了service方法,而不是在service内部循环,而事物是在service级别,所以相当于每次插入都提交事物,所以慢了。


同样是插入,差别咋就这大呢?


操作系统:wubi ubuntu 12.04 (precise) 32 位

内核: Linux 3.2.0-33-generic-pae

内存:4GB

cpu:Intel® Core™2 Duo CPU T6570 @ 2.10GHz × 2

mysql:版本5.5.28-0ubuntu0.12.04.2, innodb,本地服务

h2: 版本1.3.169, 嵌入式

插入数据:1656行,id自动增长

数据库持久层操作方式耗时(ms)
mysqlhibernate循环调用save插入127910
mysqlhibernatesaveOrUpdateAll插入4499
mysqljdbcTemplate循环调用update插入3045
mysqljdbcTemplate调用update一次插入全部value2295
h2hibernate循环调用save3529
h2hibernatesaveOrUpdateAll2037
h2jdbcTemplate循环调用update插入796
h2jdbcTemplate调用update一次插入全部value610



mysql hibernate loop insert| data size:1656, time:127910 ms
mysql hibernate saveOrUpdateAll| data size:1656, time:4499 ms


mysql jdbcTemplate loop insert| data size:1656, time:3045 ms
mysql jdbcTemplate multi values| data size:1656, time:2295 ms


h2 hibenate loop insert| data size:1656, time:3529 ms
h2 hibernate saveOrUpdateAll| data size:1656, time:2037 ms


h2 jdbcTemplate loop insert| data size:1656, time:796 ms
h2 jdbcTemplate multi values| data size:1656, time:610 ms



配置:

#hibernate.connection.driver_class = com.mysql.jdbc.Driver
#hibernate.connection.url = jdbc:mysql://127.0.0.1:3306/emds?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
#hibernate.connection.username = mysql
#hibernate.connection.password = mysql
#hibernate.dialect = org.hibernate.dialect.MySQLDialect

hibernate.connection.driver_class = org.h2.Driver
hibernate.connection.url = jdbc:h2:db/emds_db
hibernate.connection.username = h2
hibernate.connection.password = h2
hibernate.dialect = org.hibernate.dialect.H2Dialect

hibernate.show_sql = true
hibernate.format_sql = false
hibernate.batch_size = 20
hibernate.hbm2ddl.auto = update
hibernate.cglib.use_reflection_optimizer = true
hibernate.cache.use_second_level_cache = false
hibernate.cache.use_query_cache = true
hibernate.cache.provider_class = org.hibernate.cache.EhCacheProvider


model

package com.emds.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import com.emds.util.DateUtil;

@Entity
@Table(name="air_quality_data")
public class AirQualityData {
	
	public enum DataType{
		AllAirQuality((short)1);
		
		private short dataType;
		
		DataType(short dataType){
			this.dataType = dataType;
		}
		
		public short getDataType(){
			return dataType;
		}
	}

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	
	@Column(name="area", length=20, nullable=false)
	private String area;
	
	@Column(name="type", nullable=false)
	private short type;
	
	@Column(name="time", columnDefinition="DATETIME")
	private Date time;
	
	@Column(name="index_name", length=20, nullable=false)
	private String indexName;
	
	@Column(name="index_value", length=20, nullable=false)
	private String indexValue;
	
	@Override
	public String toString(){
		return "{" + id + " " + area + "\t" + DateUtil.dateToStr_yyyy_MM_dd_HH_mm(time) + "\t" + indexName + "\t" + indexValue + "}";
	}
	
	public Date getTime() {
		return time;
	}
	public void setTime(Date time) {
		this.time = time;
	}
	public String getIndexName() {
		return indexName;
	}
	public void setIndexName(String indexName) {
		this.indexName = indexName;
	}
	public String getIndexValue() {
		return indexValue;
	}
	public void setIndexValue(String indexValue) {
		this.indexValue = indexValue;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getArea() {
		return area;
	}

	public void setArea(String area) {
		this.area = area;
	}

	public short getType() {
		return type;
	}

	public void setType(short type) {
		this.type = type;
	}
	
}



<think>好的,用户想了解H2数据库的介绍及使用场景。首先,我需要整理已有的引用内容,确保回答符合用户的要求。根据系统级指令,要使用正确的中文和LaTeX格式,还要生成相关问题,并在引用处添加标识。 首先,查看用户提供的四个引用内容。引用[1]和[2]都提到了H2数据库的基本介绍,包括它是嵌入式数据库、内存模式、支持JDBC等。引用[3]提到了H2 Console的使用和注意事项,比如数据备份和持久化。引用[4]则涉及命令行工具的使用。 接下来,我需要将这些信息结构化。首先介绍H2数据库的基本概念,比如嵌入式、内存模式、轻量级等。然后是其核心特性,可能包括支持多种模式、兼容性、Web控制台和跨平台。接着是使用场景,例如开发测试、嵌入式应用、教学演示和临时数据处理。最后是注意事项,比如持久化和安全性。 需要注意的是,回答中要自然插入引用标识。例如,在提到H2数据库实战时引用[^1],在WebConsole控制台时引用[^2],注意事项部分引用[^3],命令行工具引用[^4]。 生成相关问题时要基于用户可能关心的点,比如与其他数据库的比较、持久化配置、安全措施以及命令行工具的具体使用。确保问题有针对性,能够引导用户进一步探索。 检查是否所有行内数学表达式正确使用了$...$格式,但当前内容中似乎没有涉及数学公式,所以可能不需要。独立公式如果有的话要用$$...$$,但这里也没有,所以可能可以忽略。确保LaTeX语法正确,不过这里可能用不上。最后用中文回答,结构清晰,分点说明。</think>### H2数据库介绍及使用场景 #### 一、H2数据库简介 H2是一款开源的**嵌入式关系型数据库**,支持内存模式和磁盘存储模式。它以轻量级(仅约2MB的JAR文件)、高性能和兼容性著称,支持标准的SQL语法与JDBC API,并能模拟其他主流数据库(如MySQL、PostgreSQL)的部分功能[^1]。 #### 二、核心特性 1. **多种运行模式** - **内存模式**:数据完全存储在内存中,适用于临时计算或快速测试,重启后数据丢失,例如:`jdbc:h2:mem:testdb`[^1][^3]。 - **嵌入式模式**:直接集成到应用程序中,无需独立服务。 - **服务器模式**:通过TCP/IP提供远程访问。 2. **兼容性** 支持多种数据库方言,可无缝切换开发环境(如H2)与生产环境(如Oracle)。 3. **Web控制台** 提供基于浏览器的管理界面(H2 Console),支持执行SQL、导出数据等操作[^3]。 4. **跨平台** 纯Java实现,可在任何支持JVM的环境中运行。 #### 三、典型使用场景 1. **开发与测试** - 快速搭建本地数据库环境,避免依赖外部服务。 - 单元测试中通过内存模式实现数据隔离,例如: ```java Connection conn = DriverManager.getConnection("jdbc:h2:mem:test"); ``` 2. **嵌入式应用** 适用于桌面软件或移动应用,如小型财务系统、本地缓存等。 3. **教学与演示** 轻量级特性便于展示数据库操作,无需复杂安装。 4. **临时数据处理** 内存模式适合需要快速计算且无需持久化的场景,如实时分析中间结果。 #### 四、注意事项 - **数据持久化**:内存模式需定期备份,或切换为文件模式(如`jdbc:h2:~/mydb`)。 - **安全性**:生产环境应避免暴露Web控制台,需配置访问权限。 - **命令行工具**:通过`org.h2.tools.Shell`连接数据库执行脚本或查询。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值