[转]Hibernate入门:批量插入数据
转自:http://blog.csdn.net/xiazdong/article/details/7709068
一般如果要插入100万条数据,则会写如下代码:
- package org.xiazdong.test;
 - import junit.framework.TestCase;
 - import org.hibernate.Session;
 - import org.hibernate.SessionFactory;
 - import org.hibernate.Transaction;
 - import org.hibernate.cfg.Configuration;
 - import org.junit.Test;
 - import org.xiazdong.Person;
 - public class PersonTest extends TestCase{
 - @Test
 - public void testAdd(){
 - long begin = System.currentTimeMillis();
 - Configuration config = new Configuration();
 - config.configure();
 - SessionFactory factory = config.buildSessionFactory();
 - Session session = factory.openSession();
 - Transaction tx = session.beginTransaction();
 - for ( int i=0; i<1000000; i++ ) { //插入100万条数据
 - Person person = new Person("xiazdong-"+i,i+20);
 - session.save(person);
 - }
 - tx.commit();
 - session.close();
 - long end = System.currentTimeMillis();
 - System.out.println((end-begin)/1000.0);
 - }
 - }
 
此程序正常来说是会报错:
这是因为hibernate默认会把没有提交的数据全部缓存,但是缓存是不能存入100万条数据的,因此会报错,我们怎么样能够解决呢?
我们可以通过每100个insert语句时,就强制刷入数据库,实现代码如下:
- package org.xiazdong.test;
 - import junit.framework.TestCase;
 - import org.hibernate.Session;
 - import org.hibernate.SessionFactory;
 - import org.hibernate.Transaction;
 - import org.hibernate.cfg.Configuration;
 - import org.junit.Test;
 - import org.xiazdong.Person;
 - public class PersonTest extends TestCase{
 - @Test
 - public void testAdd(){
 - long begin = System.currentTimeMillis();
 - Configuration config = new Configuration();
 - config.configure();
 - SessionFactory factory = config.buildSessionFactory();
 - Session session = factory.openSession();
 - Transaction tx = session.beginTransaction();
 - for ( int i=0; i<1000000; i++ ) { //插入100万条数据
 - Person person = new Person("xiazdong-"+i,i+20);
 - session.save(person);
 - if(i%100==0){ //每一千条刷新并写入数据库
 - session.flush();
 - session.clear();
 - }
 - }
 - tx.commit();
 - session.close();
 - long end = System.currentTimeMillis();
 - System.out.println((end-begin)/1000.0);
 - }
 - }
 
经过测试,花费时间为:148秒;
注:如果数据库在程序执行过程中记录数为0,是因为数据库为read commited,事务提交之后才能够数据。
当然,同样可以使用Hibernate配置来实现同样功能:
在hibernate.cfg.xml中插入:
- <property name="hibernate.jdbc.batch_size">50</property>//每50条语句提交一次
 - <property name="hiberante.cache.use_second_level_cache">false</property>//关闭二级缓存
 
[转]Hibernate入门:批量插入数据的更多相关文章
- FreeSql (六)批量插入数据
		
var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...
 - C#批量插入数据到Sqlserver中的四种方式
		
我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...
 - .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库
		
批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...
 - sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )
		
通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下. 其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...
 - Java 批量插入数据(Oracle)
		
//批量添加20000条数据用时8秒. try { String url = "jdbc:oracle:thin:@IP:1521:orcl"; // orcl为数据库的SI ...
 - 批量插入数据(基于Mybatis的实现-Oracle)
		
前言:做一个数据同步项目,要求:同步数据不丢失的情况下,提高插入性能. 项目DB框架:Mybatis.DataBase:Oracle. -------------------------------- ...
 - C#批量插入数据到Sqlserver中的三种方式
		
本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...
 - SqlServer——批量插入数据
		
像Major表里面批量插入数据演示: 代码如下: Declare @I int Set @I= Begin Tran InsertData: Insert into Major values(@I,' ...
 - mybatis批量插入数据到oracle
		
mybatis 批量插入数据到oracle报 ”java.sql.SQLException: ORA-00933: SQL 命令未正确结束“ 错误解决方法 oracle批量插入使用 insert a ...
 - SQLServer 批量插入数据的两种方法
		
SQLServer 批量插入数据的两种方法-发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Ins ...
 
随机推荐
- Unity3d-制作粒子光环特效
			
http://blog.csdn.net/ozhangseno/article/details/70799611
 - 通过ajax给后台提交数据时,radio性别数据的获取
			
通过ajax向后台异步发送数据,经常我们会遇到个人信息额提交,一般我们采用FormData来装数据.在装性别值得时候,我们会有两个radio框,获取radio值得方法如下: 一般情况下,一个radio ...
 - sprinbboot  热部署 造成类加载器 不一致问题
			
这里只说devtools的方式,注意以下的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9), 自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟 ...
 - Vue+node.js+express+mysql实例---对图书信息进行管理
			
一个简单的 CURD 实例 ---对图书信息进行管理 目录 1 开发环境 1.1 前端开发环境 1.2 后端开发环境 2 数据库设计和创建 2.1 数据库和表设计 2.2 book 表设计 2.3 s ...
 - fabricjs 的用途
			
使用html5 的canvas画板做一些图片旋转,拖动,放大,缩小和合成图片的功能,有没有一个集成好的组件库呢?答案肯定是有的,而且还不止我前面提到的功能,下面介绍一下我使用的fabricjs. 官网 ...
 - python面向对象-cs游戏示例
			
#!/usr/local/bin/python3 # -*- coding:utf-8 -*- class Role(object): n = 123 # 类变量 name = "我是类na ...
 - CSS 转载
			
CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). CSS语法 CSS实例 ...
 - python继续函数-练习(2017-8-3)
			
写函数,计算传入字符串中[数字].[字母].[空格] 以及 [其他]的个数 def detection(p): intcount = 0 strcount = 0 othercount = 0 spa ...
 - Redis 在springBoot中的一个使用示例
			
在现系统中使用了一个字典表,更新或插入字典表需要做Redis缓存 @Override @Cache(name = Constants.REDIS_PREFIX_DIC, desc = "变更 ...
 - 《Go语言实战》书摘
			
书籍简介 名称:Go语言实战 作者: 威廉·肯尼迪 (William Kennedy) / 布赖恩·克特森 (Brian Ketelsen) / 埃里克·圣马丁 (Erik St.Martin) 内容 ...