转自: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. 标准对象——RegExp

    字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样麻烦且代码难以复 ...

  2. js获取站点根目录

    function getRootPath(){        var strFullPath=window.document.location.href;        var strPath=win ...

  3. CSS实战3

    1. z-index  层级   div 层 <!DOCTYPE html> <html> <head lang="en"> <meta ...

  4. Unicode转化为汉字

    + (NSString *)replaceUnicode:(NSString *)unicodeStr { NSString *tempStr1 = [unicodeStrstringByReplac ...

  5. Django-rest-framework(一)简单入门使用

    简单的使用 Django-rest-framework 建成DRF,可以帮助我们快速构建出 django的rest full 风格的api接口. 其源码容易理解,所以我们可以很方便的使用. 安装 pi ...

  6. Oracle 11g RAC小结

    1.查看数据库所有实例与状态 unixdev$[/home/grid]srvctl status database -d unixdev Instance unixdev11 is running o ...

  7. MySQL数据库主从(主主)配置

    一.系统环境: centos7.4 (centos 1708) mysql 5.7 master主机的IP地址为192.168.159.50 slave主机的IP地址为192.168.159.51 M ...

  8. Largest Rectangle in a Histogram(hdu1506,单调栈裸题)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  9. 关于Navicat连接MySQL 报 Authentication plugin 'caching_sha2_password' cannot be loaded

    报错原因: 报这个错是因为MySQL8使用了 caching_sha2_password 加密方式而之前MySQL使用的是 mysql_native_password 加密方式,而你的Navicat不 ...

  10. frame3.5安装出错

    一般是因为禁用了microsoft update,可以在服务里禁用改为手动,之后启动,然后就可以安装