[转]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 ...
随机推荐
- Shiro 登录认证源码详解
Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加 ...
- 对象API
遍历对象里的每个元素 var obj ={ a:32, b:12, c :342 } for (const key of obj){ if(obj.hasOwnProperty(key)){ cons ...
- redis主从同步收到以下参数影响
repl-ping-slave-period主从心跳ping的时间间隔.默认10 repl-timeout 从节点超时时间.默认60 repl-backlog-size 主节点保存操作日志的大 ...
- MySQL实现序列自增
#创建序列表 DROP TABLE IF EXISTS `sequence`; CREATE TABLE `sequence` ( `name` ) NOT NULL COMMENT '序列名称', ...
- mysql的密码忘记了,怎么办, 来来来.
尤其是在学习的过程, 也是天天和数据库打交道, 难免会有脑子短路的时候, 比如root密码忘记了, 你说怎么办~~~, 没关系, 往下看 mysql提供了一种跳过用户认证的配置, 参数, 你配置上这个 ...
- 接口API封装中常见的HTTP状态码
在进行后端接口API封装的过程中,需要考虑各种错误信息的输出.一般情况下,根据相应问题输出适合的HTTP状态码,可以方便前端快速定位错误,减少沟通成本. HTTP状态码有很多,每个都有对应的含义,下面 ...
- hive的desc命令
desc命令 desc 命令是为了展示hive表格的内在属性.例如列名,data_type,存储位置等信息.这个命令常常用在我们对hive表格观察之时,我们想要知道这个hive各个列名(基于这些具体列 ...
- SQL Server附加数据库拒绝访问错误解决方法
今天在MsSQL里附加数据库时提示操作系统错误5(拒绝访问),这里我没给出了两个解决方案供大家解决问题. 方案一:切换登录方式 出现这种情况是由于用“混合验证方式”(SQL Server身份验证)登录 ...
- [Python 3.X]python练习笔记[2]-----用python实现七段数码管显示年月日
#SevenDigitsDrawV2.py import turtle import time def drawGap(i):#绘制数码管间隔 turtle.penup() turtle.fd(i) ...
- RTL8195AM开发板使用
1. 本次使用RTL8195AM测试一下,原厂资源地址:https://os.mbed.com/platforms/Realtek-RTL8195AM/ 2. 由于板子支持mbed,所以把CON2连接 ...