转自: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. SQL批量添加,更新,删除

    SQL语句: 存储过程: 代码: 这里说的是关于SQL的批量操作数据. 需要准备: 三层框架:利用 动软代码生成器(可以快速生成增删改查) 生成三层 Model,BLL,Dal ①DbHelpeSQL ...

  2. 写到 HTML 文档

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

  3. 记录使用antd时样式不生效的问题

    最近在学webpack,就配置了一个react的运行环境,为了偷懒使用了antd npm install antd 之后发现竟然tmd没有样式 谷歌之后发现好多同学都出现了这个问题,好在最后解决了 在 ...

  4. iOS | 地图定位

    在IOS开发中,最常见的功能之一就是地图定位功能,不单单是百度地图,高德地图等专业的地图导航软件,还有美团,咕咚等一些美食购物类和运动类也需要这样的功能,所以学会这项技能是一名IOS开发工程师必须的. ...

  5. c#本地缓存实现

    用了一段时间java,java实现服务端程序很简单,有很多公共开源的组件或者软件.但是c#的很少. 现在准备自己写点东西,学习下新的东西,总结下c#的内容以及我们经常用的内容,抽离成类,组件,模型.方 ...

  6. session和cookie的介绍

    1.将cookie,session之前,还是先说说http协议 http协议是基于TCP/UDP之上的应用层一个标准 请求,响应的模式.是你必须先请求到一个服务端之后,服务端才会响应到你.他是不会无缘 ...

  7. npm ERR! code ENOENT (未找到文件 error no entry)

    问题: ENOENT一般是没找到文件或路径,包括因为权限问题没找到的情况 解决: 我这个是 目录选择错了 其他:

  8. Vscode配置C++运行环境(2019/1//11更)并加入bits/stdc++.h头文件

    因为重装系统,以前配置好的c++环境又没了.所以有要配置一遍. 1 下载mingw64或minw, 配置好环境变量:C://mingw64//bin;  在cmd下用g++ -v验证是否成功. 2. ...

  9. mysqldump备份与基于bin-log实现完全恢复

    MySQL数据库备份是一项非常重要的工作,mysql的备份主要分为逻辑备份和物理备份,同时,不同的生产环境要备份的策略也不会不同.下面先说一说备份时要考虑到的一些因素,然后再实际操作进行不同方式的数据 ...

  10. 编译安装GCC

    下载GCC包 http://mirror.hust.edu.cn/gnu/gcc/ 解压 .tar.gzcd gcc-4.9.4./contrib/download_prerequisites #下载 ...