一,读取缓存(一级缓存,二级缓存)一级缓存可以理解为session对象的一个map
有很多方法可以往缓存中添加数据,
往二级缓存添加数据时,save方法不适合native生成方式的主键
但只有get,load和Iterator能从缓存中读取数据,其他的方法不可以(Query 不能从缓存里去对象)
Query,Criteria(查询缓存)由于命中率较低,所以hibernate缺省是关闭;修改cache.use_query_cache 为true 打开对查询的缓存,并且调用query.setCacheable(true) 或criteria.setCacheable(true) 。
二,清除缓存(防止内存溢出)
session.evict(obj); ----一条记录(在使用uuid生成策略时。你手动调用该方法会报错 )
session.clear();----所有的
sessionFactory.evict(User.class); ----所有的该类型对象
sessionFactory.evict(User.class,12); ----一条记录
session.flush() --------会发uuid没发的sql语句(在调用evict或clear方法前,先调用该方法)
作用:可以改变sql语句的执行顺序 (hibernate默认是save,update,delete )
三,判断对象是否在数据库中存在
由hbm文件的id配置unsaved-value 決定
四,二级缓存
1.hibernate.cfg.xml里配置
<property name="cache.use_query_cache">true
</property>
<property name="cache.provider_class">org.hibernate.cache.OSCacheProvider
</property>
<class-cache class="yangzhibin.User" user="read-only "/>
usage(策略)取值:
read-only
:
效率最高,但是对象不能修改,修改了会报异常(如:省市表)
read-write:严格的读写(如:银行)
nonstrict-read-write:不严格的读写(如:帖子的回帖量)效率高点
transactional:一般缓存没这个功能(jboss-cache实现了,oscache不提供这个功能)
2.User.hbm.xml里配置
<cache usage="read-write "/>
五,hibernate参数
1.hibernate.generate_statistics :产生统计信息
取值:false(默认) ,true
查看:
Statistics st = sessionFactory.getStatistics();
System.out.println(st);//查询全部
//查看二级缓存统计信息
System.out.println("put(放入):" + st.getSecondLevelCachePutCount());
System.out.println("hit(命中):" + st.getSecondLevelCacheHitCount());
System.out.println("miss(丢失):" + st.getSecondLevelCacheMissCount());
六,Session和StatelessSession的区别:StatelessSession 不跟缓存打交道
七,Query接口的executeUpdate()(3.0中增加的方法,用于进行批量处理,会把缓存中数据都清空了)
八,HQL和Criteria
1,Criteria查询
1.1 DetachedCriteria查询 :离线查询 (在处理动态查询时很有用)
为什么离线呢? 因为它的创建跟session无关,而Criteria的创建跟session有关
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
String name = request.getParameter("name");
if (name != null)
{
dc.add(Restrictions.eq("name", name));
}
int age = request.getParameter("age");
if(age > 0)
{
dc.add(Restrictions.eq("age", age));
}
Criteria c = dc.getExecutableCriteria(session);//操作还是要通过Criteria来实现
1.2 Example 查询 :根据例子查询
Example.create(obj);
criteria.add(example)
九,Iterator查询(先把id都查询出来,再根据id来查询)N+1次查询
十,SQL和命名查询
Query q = session.createQuery(hql);
//sql查询
Query q = session.createSQLQuery("select * from user");//返回对象数组
Query q = session.createSQLQuery("select * from user").addEntity(User.class);//返回User对象list
//命名查询
Query q = session.getNamedQuery("queryUserById");