悲观锁与乐观锁
使用乐观锁在表中加一个version的字段来解决并发性问题
悲观锁:就是多个人同时想修改某个数据,
乐观锁:乐观锁需要在表中加一version(版本)字段,并要在对应的类中配置
一级缓存1、一级缓存很短,和session的生命周期一致,随着session的关闭而消失
*load/get/iterate(查询实体对象)可以使用缓存数据
2、一级缓存它缓存的是实体对象
3、如果管理缓存,如session.clear()/session.evict()
4、如何避免一次性大批量实体数据插入内存溢出的问题?
*先执行flush,在用clear清除缓存
//发出两次load()第一次发一条sql第二次不发,说明它是先在一级缓存找数据,如果没有再到数据库找。
/**
* 发出两次load查询
*
*/
Student student = (Student)session.load(Student.class, 1);
System.out.println("学生姓名:" + student.getName());
//因为有一级缓存,load方法使用一级缓存,所以本次查询不再发出sql
student = (Student)session.load(Student.class, 1);
System.out.println("学生姓名:" + student.getName());
-------------------------------------------------------------------------------------------
//发出两次get() 同上
/**
* 发出两次get查询
*
*/
Student student = (Student)session.get(Student.class, 1);
System.out.println("学生姓名:" + student.getName());
//因为有一级缓存,get方法使用一级缓存,所以本次查询不再发出sql
student = (Student)session.get(Student.class, 1);
System.out.println("学生姓名:" + student.getName());
--------------------------------------------------------------------------------------------
/**
* 发出两次iterate查询实体对象
*
*/
public void testCache3() {
Session session = null;
try {
session = HibernateUtils.getSession();
Student student = (Student)session.createQuery("from Student where id=1").iterate().next();
System.out.println("学生姓名:" + student.getName());
//因为有一级缓存,iterate方法使用一级缓存,发出查询id的sql,不再发出查询实体对象的sql
student = (Student)session.createQuery("from Student where id=1").iterate().next();
System.out.println("学生姓名:" + student.getName());
//发出两次iterate查询实体对象
(iterate 会有n+1问题,如果缓存有发查id那1条)
先从数据库查出所有id,再根据ID查数据,所以会有n+1问题,但查实体对象会先在一级缓存