hibernate抓取策略,,batch-szie在<class>上的应用
batch-size属性,可以批量加载实体类。
MyClass.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.org.model"> <class name="MyClass" table="class" batch-size="3"> <id name="id"> <generator class="native"/> </id> <property name="name" not-null="true"/> <!-- set标签中的name为MyClass类中多方对应的属性名 key标签中的column为多方数据库表中的外键字段--> <set name="students" cascade="save-update" inverse="true"> <key column="class_id" not-null="true"></key> <one-to-many class="Student"/> <!-- class表明set中放的是什么类型的集合 --> </set> </class> </hibernate-mapping>
Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.org.model"> <class name="Student" table="student"> <id name="id"> <generator class="native"/> </id> <property name="name" column="name" not-null="true"/> <!-- name指Student类中对应一方的属性名 cascade属性指定级联操作 class指一方的类名 column中的name表示关联的外键 not-null表示此外键不能为空 --> <many-to-one name="classes" class="MyClass" cascade="save-update"> <column name="class_id" not-null="true"></column> </many-to-one> </class> </hibernate-mapping>
测试用例:
List<Student> students = session.createQuery("from Student s where s.id in (:ids) ") .setParameterList("ids", new Object[]{43,46}).list(); Iterator<Student> iterator = students.iterator(); while(iterator.hasNext()){ Student student = iterator.next(); System.out.println("学生姓名:"+student.getName()); System.out.println("该学生所在班级"+student.getClasses().getName()); }
1)若没配batch-size,即<class name="MyClass" table="class">
执行结果:总共执行三条查询语句,其中执行1条学生查询语句,2条班级查询语句
Hibernate: select student0_.id as id1_, student0_.name as name1_, student0_.class_id as class3_1_ from student student0_ where student0_.id in (? , ?) 学生姓名:ccc Hibernate: select myclass0_.id as id0_0_, myclass0_.name as name0_0_ from class myclass0_ where myclass0_.id=? 该学生所在班级09003 学生姓名:aaa Hibernate: select myclass0_.id as id0_0_, myclass0_.name as name0_0_ from class myclass0_ where myclass0_.id=? 该学生所在班级09004
2)若配batch-size,即<class name="MyClass" table="class" batch-size="3">
执行结果:总共执行2跳查询语句,其中执行1条学生查询语句,执行1条班级查询语句(每3个班级,发一条sql语句)
Hibernate: select student0_.id as id1_, student0_.name as name1_, student0_.class_id as class3_1_ from student student0_ where student0_.id in (? , ?) 学生姓名:ccc Hibernate: select myclass0_.id as id0_0_, myclass0_.name as name0_0_ from class myclass0_ where myclass0_.id in (?, ?) 该学生所在班级09003 学生姓名:aaa 该学生所在班级09004
hibernate抓取策略,batch-szie在集合上的应用
batch-size属性,可以批量加载实体类,
<set name="students" batch-size="3">
MyClass.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.org.model"> <class name="MyClass" table="class" > <id name="id"> <generator class="native"/> </id> <property name="name" not-null="true"/> <!-- set标签中的name为MyClass类中多方对应的属性名 key标签中的column为多方数据库表中的外键字段--> <set name="students" cascade="save-update" inverse="true" batch-size="3"> <key column="class_id" not-null="true"></key> <one-to-many class="Student"/> <!-- class表明set中放的是什么类型的集合 --> </set> </class> </hibernate-mapping>
测试用例:
List<MyClass> classes = session.createQuery("from MyClass ").list(); Iterator<MyClass> iterator1 = classes.iterator(); while(iterator1.hasNext()){ MyClass class1 = iterator1.next(); System.out.println("班级名:" + class1.getName()); Set<Student> students = class1.getStudents(); System.out.println("班级人数:" + students.size()); if (students != null && !students.isEmpty()) { Iterator<Student> iterator = students.iterator(); System.out.print("学生姓名:"); while (iterator.hasNext()) { Student student = iterator.next(); System.out.println(student.getName()); } } }
1)若配batch-size,即:<set name="students" batch-size="3"> 使用set的batch-size属性,这个属性可以明显的减少执行SQL语句数目,因为它执行的是这样的语句:
如果batch-size=10,而集合有13个关联对象,那么它会执行如下语句:
select id,... from table where id in (?,?,?,?,?,?,?,?,?,?)
select id,... from table where id in (?,?,?)
总共2条语句,如果不设置batch-size,就要执行13条SQL语句
执行结果:总共执行2条sql语句,1条班级查询语句,总共三个关联集合或对象,所以1条关联对象查询语句
Hibernate: select myclass0_.id as id0_, myclass0_.name as name0_ from class myclass0_ 班级名:09002 Hibernate: select students0_.class_id as class3_0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student students0_ where students0_.class_id in (?, ?, ?) 班级人数:0 班级名:09003 班级人数:3 学生姓名:bbb ccc aaa 班级名:09004 班级人数:3 学生姓名:aaa ccc bbb
1)若不配batch-size,即:<set name="students">
执行结果:
Hibernate: select myclass0_.id as id0_, myclass0_.name as name0_ from class myclass0_ 班级名:09002 Hibernate: select students0_.class_id as class3_0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student students0_ where students0_.class_id=? 班级人数:0 班级名:09003 Hibernate: select students0_.class_id as class3_0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student students0_ where students0_.class_id=? 班级人数:3 学生姓名:ccc aaa bbb 班级名:09004 Hibernate: select students0_.class_id as class3_0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student students0_ where students0_.class_id=? 班级人数:3 学生姓名:ccc aaa bbb
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
hibernate.jdbc.fetch_size 50 //读
hibernate.jdbc.batch_size 30 //写
hiberante.cfg.xml(Oracle ,sql server 支持,mysql不支持)
<property name="hibernate.jdbc.fetch_size">50</property> <property name="hibernate.jdbc.batch_size">30</property>
这两个选项非常非常非常重要!!!将严重影响Hibernate的CRUD性能!
C = create, R = read, U = update, D = delete
Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。
例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会1次性把1万条取出来的,而只会取出Fetch Size条数,当纪录集遍历完了这些记录以后,再去数据库取Fetch Size条数据。因此大大节省了无谓的内存消耗。当然Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。这有点像平时我们写程序写硬盘文件一样,设立一个Buffer,每次写入Buffer,等Buffer满了以后,一次写入硬盘,道理相同。
Oracle数据库的JDBC驱动默认的Fetch Size=10,是一个非常保守的设定,根据我的测试,当Fetch Size=50的时候,性能会提升1倍之多,当Fetch Size=100,性能还能继续提升20%,Fetch Size继续增大,性能提升的就不显著了。
因此我建议使用Oracle的一定要将Fetch Size设到50。
不过并不是所有的数据库都支持Fetch Size特性,例如MySQL就不支持。
MySQL就像我上面说的那种最坏的情况,他总是一下就把1万条记录完全取出来,内存消耗会非常非常惊人!这个情况就没有什么好办法了 :(
Batch Size是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。
Batch Size越大,批量操作的向数据库发送sql的次数越少,速度就越快。我做的一个测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size = 50的时候,删除仅仅需要5秒!!!
相关推荐
hibernate的类级别检索策略和检索策略的lazy、fetch、batch-size属性使用
Hibernate hibernate.jdbc.batch_size 测试带有 MySQL JDBC 驱动程序的 Hibernate 批量插入示例。 에 관한 설명
本文主要讲解:使用灰狼算法优化LSTM超参数-神经元个数-dropout-batch_size 主要思路: 灰狼算法 Parameters : 迭代次数、狼的寻值范围、狼的数量 LSTM Parameters 神经网络第一层神经元个数、神经网络第二层神经...
中取出的记录条数,一般设置为30、50、100.Oracle数据库的JDBC驱动默认的Fetch Size=15,...<prop key="hibernate.jdbc.batch_size">100</prop> --> <prop key="hibernate.jdbc.batch_size">50 </property>
本文主要讲解:使用SSA麻雀算法-LSTM-优化神经网络神经元个数-dropout-batch_size 主要思路: SSA Parameters :优化函数、粒子数量、搜索维度、迭代次数 LSTM Parameters 神经网络第一层神经元个数、神经网络第二...
PSO粒子群优化-BP神经网络-优化神经元个数dropout和batch_size https://data-mining.blog.csdn.net/article/details/126433210 1、摘要 本文主要讲解:PSO粒子群优化-BP神经网络-优化神经网络神经元个数dropout和...
spring-batch-admin-1.3.0.RELEASE,很多小朋友找不到 ,所以上传下
spring batch 3.0.5,官方下载包。
gs-batch-processing-master2 guide and quick start
spring-batch-2.2.0.RELEASE-no-dependencies
spring-boot-starter-batch-web.zip,批量web应用程序的启动程序
batch-cn命令行工具包管理器-命令大全. 可以像linux之类的apt-get命令一样方便地给windows下载命令行工具. 部分工具可能是用户upx之类的加壳,杀毒软件可能会报警,正常现象。如果不放心,删除对应的命令即可。
赛多利斯BATCH-X5 控制器在香料配料过程中的应用pdf,赛多利斯BATCH-X5 控制器在香料配料过程中的应用
How to perform batch processing and use native SQL, criteria queries, caching objects, and more How to enable Hibernate in web applications with e-commerce How to use Hibernate for heavy-duty ...
资源分类:Python库 所属语言:Python 资源全名:pg_batch-1.0.7-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
SpringBoot 整合SpringBatch所使用的jar包。
matlab_LSTM-CNN网络模型的训练过程matlab仿真,输出Minibatch-error和Minibatch-loss_源码
德国赛多利斯BATCH-X5型控制器在VIVIL公司定量设备中的应用pdf,德国赛多利斯BATCH-X5型控制器在VIVIL公司定量设备中的应用
Batch-File-Programming.rar