[转]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 ...
随机推荐
- jenkins 安装配置: centos-master windows/linux-slave + nginx代理 + node + job
centos install jenkins: 1.sudo vi /etc/yum.repos.d/jenkins.repo [jenkins] name=Jenkins baseurl=http: ...
- Struts2中期(这框架目前正处于淘汰状态)
Struts2的第二天 Struts2的第二天的内容 1. Struts2框架中的Servlet的API的使用 2. Struts2中Action接收请求参数 3. Struts2中自定义拦截器 案例 ...
- DBCacheServer服务升级
前段时间完成了该服务的设计的功能,花了很多时间和经历,最终完成了一个版本,已经测试了:现在后期再次在以前的基础上,完成了一些扩展. 1.扩展了内存存储 最初版本只是采用了gauva cache进行存储 ...
- 手机浏览器页面点击不跳转(Android手机部分浏览器) 浏览器双击放大网页 解决
手机端web网页项目(angluar js 1.4.6) 1,网页项目开发过程中,使用PC浏览器能正常访问,IOS设备浏览器也能正常访问,但是使用Android部分浏览器进行访问的时候,链接偶尔不跳转 ...
- linux链路聚合
配置聚合连接(网卡绑定,链路聚合): eth0 ================>>虚拟网卡team eth1 配置聚合连接 [root@Centos7-Server ~]# nmcli ...
- Nginx反向代理 Laravel获取真实IP地址(PHP)
使用VUE前后端分离开发 后端使用Laravel 想要获取到用户的真实IP地址 因为分离开发不同源跨域问题 所以只能进行前端Nginx反向代理 location /api { rewrite ^/a ...
- Laravel -- Blade模板
{{--流程控制--}} @if($name == '1') this is 1 @elseif($name == '2') this.is 2 @else who am i? @endif @for ...
- Linux下编译出现undefined reference to ‘pthread_create’问题解决
1.代码 /* * File: HeartPackageSendAgent.cpp * Author: Pangxiaojian * * * 主要实现:向服务器发送心跳包,每5s向服务器发送一个心跳包 ...
- python应用:异常处理
Python的错误异常在大部分IDE编辑器中则可以直接显示出来,便于开发人员的调试及修改工作,对初学者也比较友好. Python中包含错误和异常两种情况,错误主要是常见的语法错误SyntaxError ...
- python 装饰器 回顾 及练习
# 复习 # 讲作业 # 装饰器的进阶 # functools.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数 # 周末的作业 # 文件操作 # 字符串处理 # 输入输出 # 流程控制 ...