`
schy_hqh
  • 浏览: 542369 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Hibernate基于配置文件(二十)Hibernate进行批处理

阅读更多

Hibernate中的批处理,实质上是对JDBC的批处理进行配置

 

要使用批处理插入数据,id生成策略不能是native策略,可以是uuid或者hilo


批量数据获取
    属性:hibernate.jdbc.fetch_size
    *MYSQL不支持,ORACLE支持

批量数据提交(极大的提高了批量执行的效率)
    属性:hibernate.jdbc.batch_size
    *MYSQL支持,ORACLE支持

    步骤(理解):
        1.id生成策略不能是native
            [native依赖数据库生成id,每save()就会执行插入,否则无法生成id,所以无法进行批量插入]
            可选策略:uuid/hilo  在内存中生成id,这样才能在commit的时候进行批量提交操作
       
        2.关闭二级缓存,否则对象都被放入二级缓存中,有可能造成内存溢出,另外还影响速度
       
        3.hibernate.cfg.xml中配置batch_size参数
       
        4.MYSQL数据库需要修改url,加上 rewriteBatchedStatements=true
   
        5.即时flush clear [及时清除一级缓存中的数据,每插入多少条记录便清除一次]
       
        6.为了不影响批量插入的速度,关闭sql打印<property name="show_sql">false</property>
       
        7.<property name="hibernate.jdbc.batch_size">50</property>
            每50条进行一次批量插入,然后根据此参数在程序中定义清空缓存的时机
            可设置为50的倍数,那么每插入4次后,就清空一次缓存,防止内存溢出
                if(i%200==0) {
                    session.flush();//强制将内存中的持久化对象更新到数据库中
                    session.clear();//清空缓存中的持久化对象,防止内存溢出
                }

package org.leadfar.hibernate.model;

import java.util.Date;



public class ContactPerson {
	private int id;
	private String name;
	private int age;	
	private Date birthday;
	private Group group;
	
	private int versionNumber;
	
	public ContactPerson() {
	}
	
	public ContactPerson(String name) {
		this.name = name;
	}
	public ContactPerson(int id,String name) {
		this.id = id;
		this.name = name;
	}
	public ContactPerson(int id,int age,String name) {
		this.id = id;
		this.age = age;
		this.name = name;
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Group getGroup() {
		return group;
	}
	public void setGroup(Group group) {
		this.group = group;
	}

	

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public int getVersionNumber() {
		return versionNumber;
	}

	public void setVersionNumber(int versionNumber) {
		this.versionNumber = versionNumber;
	}
	
	
}

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping 
	package="org.hibernate.auction">
		<class name="org.leadfar.hibernate.model.ContactPerson" table="t_person">

		<id name="id">
			<!-- 批量插入数据,可以使用hilo策略(不依赖数据库生成id值)-->
			<generator class="hilo"/>
		</id>
		<!-- 版本标识,用于解决并发访问 -->
		<version name="versionNumber"></version>
		
		<property name="name"/>
		<property name="age"></property>
		<property name="birthday" type="date"></property>
		
		<many-to-one name="group" column="gid" fetch="join"></many-to-one>
		
	</class>
	
</hibernate-mapping>

 

 

测试

	public void save_person() throws Exception {
		Configuration cfg = new Configuration().configure();
		
		SessionFactory sfactory = cfg.buildSessionFactory();
		
		long begin = System.currentTimeMillis();
		
		Session session = sfactory.openSession();
		
		try {
			session.beginTransaction();
			
			for(int i=0;i<100000;i++) {
				ContactPerson cp = new ContactPerson();
				cp.setAge(1);
				cp.setName("x");
				session.save(cp);
				if(i%200==0) {
					session.flush();
					session.clear();
				}
			}
			
			session.getTransaction().commit();
			
		} catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			session.close();
		}
		long end = System.currentTimeMillis();
		System.out.println("耗时:"+(end-begin)+"ms");
	}

 

分享到:
评论

相关推荐

    SpringBatch批处理 刘相编

    基本篇重点讲述了数据批处理的核心概念、典型的作业配置、作业步配置,以及Spring Batch框架中经典的三步走策略:数据读、数据处理和数据写,详尽地介绍了如何对CVS格式文件、JSON格式文件、XML文件、数据库和JMS...

    高效Java数据访问组件Uncode-DAL全功能源码

    - 文件构成:共213个文件,包括176个Java源文件,以及其他配置文件和脚本 文件类型详细: - Java源文件 (.java): 176个 - XML配置文件 (.xml): 18个 - 属性配置文件 (.properties): 9个 - Git忽略文件 (.gitignore)...

    基于SpringMVC3+Spring3+Hibernate3+Freemarker+HTML5的开源项目jeecms

    ├ 文件上传配置 ├ 模板管理 ├ 自定义模板 ├ 可视化模板编辑 ├ 全文检索 ├ 友情链接管理 系统管理 ├ 内容关键字管理 ├ 自定义模型管理(自定义栏目/内容模型,一个栏目支持多种内容模型) ├ 网页...

    Java语言基础下载

    第二十二章:使用Java解析XML 397 学习目标 397 解析器的介绍 398 DOM以及广义的基于树的处理具有几个优点 399 文档对象模型(DOM)解析实例 402 DOM对象 404 DOM解析的例子: 406 SAX解析实例 409 DOM4J解析实例 ...

    jdbc基础和参考

    3.hibernate的配置文件(hibernate.cfg.xml)得存在 4.POJO.hbm.xml文件存在 5.hibernate的jar包以及数据库的驱动包存在 Hibernate的编程: 1.构建Configuration对象读取配置文件 2.读取映射文件 3.构建SessionFactory...

    MySQL 6 绿色精简BAT版 2.24 MB

    -verbose --help 可以看到所有能够使用的参数. &lt;br&gt;mysql_start.bat &lt;br&gt;@echo off @echo Mysql startup ... start bin\mysqld.exe --default-character-set=gbk exit &lt;br&gt;以不需要配置文件,...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    8.5.1 Struts2的配置文件类型 8.5.2 Struts2的包配置 8.5.3 名称空间配置 8.5.4 Action相关配置 8.5.5 通配符实现简化配置 8.5.6 返回结果的配置 8.6 Struts2的开发模式 8.6.1 实现与ServletAPI的交互 86.2 域模型...

    springboot参考指南

    改变应用程序外部配置文件的位置 iii. 63.3. 使用'short'命令行参数 iv. 63.4. 使用YAML配置外部属性 v. 63.5. 设置生效的Spring profiles vi. 63.6. 根据环境改变配置 vii. 63.7. 发现外部属性的内置选项 iii. 64....

    Java学习笔记-个人整理的

    {13.4}批处理模式}{195}{section.13.4} {13.5}分页查询}{196}{section.13.5} {13.5.1}MySQL}{198}{subsection.13.5.1} {13.6}连接池}{199}{section.13.6} {13.6.1}Wrapper}{199}{subsection.13.6.1} {13.7}DAO...

    xmljava系统源码-rexdb:数据库

    使用Maven添加依赖后,不要忘记将rexdb配置文件拷贝到classpath路径中 全部文档(限于篇幅,下面的正文仅包含简介和快速入门) 简介 概述 Rexdb是一款使用Java语言编写的,开放源代码的持久层框架。提供了查询、更新...

Global site tag (gtag.js) - Google Analytics