Hibernate中的优化
查询提示
优化这东西更多的在于意,而不是技。而意的增长,是需要不断的磨练技才行,绝不是看了几页书能够完成的。
书上讲的优化,大致分为3个大类。
第一部分是lazy,延迟加载。延迟加载就其目的来说,为了减少数据库的操作而出现。因为在Hibernate中,一个对象被加载之后,其中的一些指向的实体对象是在使用的时候被加载的。这也就涉及了一定的问题。比方说一个对象从持久化变成脱管后,失去了Hibernate管理,以前脱管时候的代理类在使用的时候就无法抽取数据库中的值。
第二部分是fetch。简单的说也是和上面一样的问题。就是在n+1和笛卡尔集之间取得一个平衡
第三部分,2级缓存。大型仓库。更加的抽象。用它有两个条件。第一,不用的时候要有一定的性能,其次,使用了之后效果不能不明显。
总说
其实HQL语句和SQL语句的基本理念几乎完全相同。所以也就介绍一些简单的操作
分页
setMaxresult()和setFirstResult()这没有什么好说的。
参数绑定
这也没什么好多说的,就是:变量名
就是记住,如果有参数是一个对象的话,可以用以下两种方式来处理。看具体代码吧
/* 方法一
* Query queryitem = session1.createQuery(queryString)
.setEntity("seller", seller);*/
/**
* 这里觉得方法二比较清楚一点。因为可以通过代码看到类型
* 这种绑定的方式可以提供很大的灵活性。因为你不必把查询的条件降解到基本数据类型,
* 可以用ADT的方式来处理。
*/
Query queryitem =session1.createQuery(queryString) //方法二
.setParameter("seller", seller, Hibernate.entity(User.class));
主要是以下几点,
一个是关闭自动清理缓存,因为在Hibernate中,Query的执行之前,Hibernate会让缓存和数据库同步一次。但是有时候却不需要这么来做。
这时候,可以通过setFlushMode为commit来处理
如果有二级缓存,
setCacheMode为CacheMode.IGNORE或者setHit(”org.hibernate.cachemode“,"org.hibernate.Cachemode.ignore")
二,返回readonly
setreadonly(true),或者setHint("org.hibernate.readonly",true)
三,超时
setTimeout(60) //60秒,单位为秒
setHint("org.hibernate.timeout",60)
四,fetchsize
setfetchsize(50)或者setHint("org.hibernate.fetchsize",50)
五.comment
setComment 或者setHint("org.hibernate.comment",” “)
六,LOCKMODE
setLockMode()
游标
记住query.scroll这个方法,然后查api就好
最后就是连接查询。
我直接给代码吧。因为没什么好多说的
/**
* 隐式查询
* Hibernate:
select
bid0_.BID_ID as BID1_39_,
bid0_.BID_NAME as BID2_39_,
bid0_.TYPE_ID as TYPE3_39_
from
SESSION_BID bid0_,
SESSION_ITEM item1_,
SESSION_USER user2_
where
item1_.seller=user2_.USERID
and bid0_.TYPE_ID=item1_.TYPE_ID
and (
user2_.USER_NAME like '%USER1%'
)
*/
public void testLinkQuery1(){
Session session1 = HibernateUtil.getSessionFactory().openSession();
Transaction tx1 = session1.beginTransaction();
Query query = session1.createQuery("from Bid bid where bid.item.seller.name like '%USER1%'");
List<?> bids = query.list();;
Bid bid = (Bid) bids.get(0);
System.out.println(bid.getName());
tx1.commit();
session1.close();
}
/**
* 显示查询
* Hibernate:
select
bid0_.BID_ID as BID1_39_,
bid0_.BID_NAME as BID2_39_,
bid0_.TYPE_ID as TYPE3_39_
from
SESSION_BID bid0_
inner join
SESSION_ITEM item1_
on bid0_.TYPE_ID=item1_.TYPE_ID,
SESSION_USER user2_
where
item1_.seller=user2_.USERID
and (
user2_.USER_NAME like '%USER1%'
)
*
*/
public void testLinkQuery2(){
Session session1 = HibernateUtil.getSessionFactory().openSession();
Transaction tx1 = session1.beginTransaction();
/**
* 如果这里会更具select语句中选中的来改变。
* 如果没有,则是返回为一个包含object[]数组的链表
*/
Query query = session1.createQuery("select bid from Bid bid join bid.item i where i.seller.name like '%USER1%'");
List<?> bids = query.list();;
Bid bid = (Bid)bids.get(0);
System.out.println(bid.getName());
tx1.commit();
session1.close();
}
/**
* fetch的连接查询
*/
public void testLinkQuery3(){
Session session1 = HibernateUtil.getSessionFactory().openSession();
Transaction tx1 = session1.beginTransaction();
/**
* 如果这里会更具select语句中选中的来改变。
* 如果没有,则是返回为一个包含object[]数组的链表
*/
Query query = session1.createQuery("select bid from Bid bid join fetch bid.item i where i.seller.name like '%USER1%'");
List<?> bids = query.list();;
Bid bid = (Bid)bids.get(0);
System.out.println(bid.getName());
tx1.commit();
session1.close();
}