转自:http://blog.csdn.net/xiazdong/article/details/7709068

一般如果要插入100万条数据,则会写如下代码:

  1. package org.xiazdong.test;
  2. import junit.framework.TestCase;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.Transaction;
  6. import org.hibernate.cfg.Configuration;
  7. import org.junit.Test;
  8. import org.xiazdong.Person;
  9. public class PersonTest extends TestCase{
  10. @Test
  11. public void testAdd(){
  12. long begin = System.currentTimeMillis();
  13. Configuration config = new Configuration();
  14. config.configure();
  15. SessionFactory factory = config.buildSessionFactory();
  16. Session session = factory.openSession();
  17. Transaction tx = session.beginTransaction();
  18. for ( int i=0; i<1000000; i++ ) { //插入100万条数据
  19. Person person = new Person("xiazdong-"+i,i+20);
  20. session.save(person);
  21. }
  22. tx.commit();
  23. session.close();
  24. long end = System.currentTimeMillis();
  25. System.out.println((end-begin)/1000.0);
  26. }
  27. }

此程序正常来说是会报错:

这是因为hibernate默认会把没有提交的数据全部缓存,但是缓存是不能存入100万条数据的,因此会报错,我们怎么样能够解决呢?

我们可以通过每100个insert语句时,就强制刷入数据库,实现代码如下:

  1. package org.xiazdong.test;
  2. import junit.framework.TestCase;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.Transaction;
  6. import org.hibernate.cfg.Configuration;
  7. import org.junit.Test;
  8. import org.xiazdong.Person;
  9. public class PersonTest extends TestCase{
  10. @Test
  11. public void testAdd(){
  12. long begin = System.currentTimeMillis();
  13. Configuration config = new Configuration();
  14. config.configure();
  15. SessionFactory factory = config.buildSessionFactory();
  16. Session session = factory.openSession();
  17. Transaction tx = session.beginTransaction();
  18. for ( int i=0; i<1000000; i++ ) { //插入100万条数据
  19. Person person = new Person("xiazdong-"+i,i+20);
  20. session.save(person);
  21. if(i%100==0){   //每一千条刷新并写入数据库
  22. session.flush();
  23. session.clear();
  24. }
  25. }
  26. tx.commit();
  27. session.close();
  28. long end = System.currentTimeMillis();
  29. System.out.println((end-begin)/1000.0);
  30. }
  31. }

经过测试,花费时间为:148秒;

注:如果数据库在程序执行过程中记录数为0,是因为数据库为read commited,事务提交之后才能够数据。

当然,同样可以使用Hibernate配置来实现同样功能:

在hibernate.cfg.xml中插入:

    1. <property name="hibernate.jdbc.batch_size">50</property>//每50条语句提交一次
    2. <property name="hiberante.cache.use_second_level_cache">false</property>//关闭二级缓存

[转]Hibernate入门:批量插入数据的更多相关文章

  1. FreeSql (六)批量插入数据

    var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...

  2. C#批量插入数据到Sqlserver中的四种方式

    我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...

  3. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

  4. sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )

    通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下.   其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...

  5. Java 批量插入数据(Oracle)

    //批量添加20000条数据用时8秒. try {    String url = "jdbc:oracle:thin:@IP:1521:orcl"; // orcl为数据库的SI ...

  6. 批量插入数据(基于Mybatis的实现-Oracle)

    前言:做一个数据同步项目,要求:同步数据不丢失的情况下,提高插入性能. 项目DB框架:Mybatis.DataBase:Oracle. -------------------------------- ...

  7. C#批量插入数据到Sqlserver中的三种方式

    本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...

  8. SqlServer——批量插入数据

    像Major表里面批量插入数据演示: 代码如下: Declare @I int Set @I= Begin Tran InsertData: Insert into Major values(@I,' ...

  9. mybatis批量插入数据到oracle

    mybatis 批量插入数据到oracle报 ”java.sql.SQLException: ORA-00933: SQL 命令未正确结束“  错误解决方法 oracle批量插入使用 insert a ...

  10. SQLServer 批量插入数据的两种方法

    SQLServer 批量插入数据的两种方法-发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Ins ...

随机推荐

  1. 自定义AngularJS中的services服务

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  2. golang-Tag

    Tag 理解 Golang中可以对struct定义Tag 例如: type TestTag struct{ UserName string `json:"name"` Age In ...

  3. Spring知识点总结(一)

       1. 框架概述        所谓的框架其实就是程序的架子,在这个程序的架子中,搭建起程序的基本的骨架,针对程序的通用问题给出了便捷的解决方案,可以使开发人员 基于框架快速开发具体的应用程序.  ...

  4. JDBCUtils工具类(转)

    JdbcUtils.java import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource ...

  5. ABAP术语-Interface Parameter

    Interface Parameter 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/26/1081800.html Parameter t ...

  6. ABAP术语-Database Rollback

    Database Rollback 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/24/1051238.html Operation tha ...

  7. hibernate的CRUD操作

    一对多关系映射的crud操作: 1.单项的保存操作 /** * 保存操作 * 正常的保存:创建一个联系人,需要关联客户 */ @Test public void test1(){ Session s= ...

  8. Java中调用存储过程或函数

    //?代表一个参数,多个参数用逗号隔开 CallableStatement cs = connect.prepareCall("{?=call 存储过程名称或函数名(?)}"); ...

  9. PHP-提升PHP性能的几个扩展

    下面介绍的几个扩展原理都是对OPCODE进行缓存(Opcode缓存原理查看http://www.cnblogs.com/JohnABC/p/4531029.html): Zend Opcache: 由 ...

  10. 来自一个大三开学三周的huster的迷茫与失措

    大三开学考研保研的话题开始多了起来.自从前天去听了一回谢长生教授的实验室宣讲会,回来直到现在都好像心头上压了些东西,喘不过气来.本来我就少与外界接触,加之我自己一个人主动学习的积极性也很是缺乏,所以当 ...