一、抓取策略。
1.hibernate中提供了三种抓取策略。
(1)连接抓取(Join Fetch):这种抓取方式是默认的抓取方式。使用这种抓取方式hibernate会在select中内连接的方式获取对象的关联对象或者关联集合。
(2)查询抓取(select Fetch):这种抓取方式会另外发送一条select语句抓取当前对象的关联实体或者集合。除非指定lazy=false,否则只有在真正访问关联关系的时候才会执行第二条select语句。
(3)子查询抓取(subselect Fetch):另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合。除非指定lazy=false,否则只有在真正访问关联关系的时候才会执行第二条select语句。
2.案例,获取选修了课程号为1或者2的所有学生信息。
结果表明,如果使用select或者join,则效率相同,发送的sql语句完全相同;如果使用subselect的话,效率要高很多,只需要两条sql语句。
1 package com.kdyzm.fetchtest; 2 3 import java.util.List; 4 import java.util.Set; 5 6 import org.hibernate.Session; 7 import org.hibernate.SessionFactory; 8 import org.hibernate.cfg.Configuration; 9 import org.junit.Test; 10 11 import com.kdyzm.hibernate.domain.Course; 12 import com.kdyzm.hibernate.domain.Student; 13 14 public class FetchTest { 15 private static SessionFactory sessionFactory; 16 static{ 17 Configuration configuration=new Configuration(); 18 configuration.configure(); 19 sessionFactory=configuration.buildSessionFactory(); 20 } 21 /* 22 * n+1条查询是显著的特点。 23 */ 24 @Test 25 public void baseTest(){ 26 Session session=sessionFactory.openSession(); 27 List<Student>students=session.createQuery("from Student").list(); 28 for(Student student:students){ 29 Set<Course>courses=student.getCourses(); 30 for(Course course:courses){ 31 System.out.println(course); 32 } 33 } 34 session.close(); 35 } 36 37 /* 38 * 查询班级cid为1,3的所有学生 39 * 40 * 如果需要用到子查询一般就是用subselect(fetch属性值) 41 * 使用subselect只需要两条SQL语句。 42 * 43 */ 44 @Test 45 public void test2(){ 46 Session session=sessionFactory.openSession(); 47 List<Course>courses=session.createQuery("from Course where cid in(1,3)").list(); 48 for(Course course:courses){ 49 Set<Student>students=course.getStudents(); 50 for(Student student:students){ 51 System.out.println(student); 52 } 53 } 54 session.close(); 55 } 56 57 /* 58 * 总结:以上的需求中,使用select和join方法效率相同,使用子查询subselect效率最高。 59 */ 60 61 62 }
FetchTest.java
二、二级缓存
1.二级缓存并没有被Hibernate实现,必须借助第三方插件实现。
2.二级缓存常见的缓存策略提供商:
Cache |
Provider class |
Type |
Cluster Safe |
Query Cache Supported |
Hashtable (not intended for production use) |
org.hibernate.cache.HashtableCacheProvider |
memory |
yes |
|
EHCache |
org.hibernate.cache.EhCacheProvider |
memory,disk |
yes |
|
OSCache |
org.hibernate.cache.OSCacheProvider |
memory,disk |
yes |
|
SwarmCache |
org.hibernate.cache.SwarmCacheProvider |
clustered (ip multicast) |
yes (clustered invalidation) |
|
JBoss Cache 1.x |
org.hibernate.cache.TreeCacheProvider |
clustered (ip multicast), transactional |
yes (replication) |
yes (clock sync req.) |
JBoss Cache 2 |
org.hibernate.cache.jbc.JBossCacheRegionFactory |
clustered (ip multicast), transactional |
yes (replication or invalidation) |
yes (clock sync req.) |
时间: 2024-10-06 01:18:58