ssh学习:hibernate中 Session缓存及基本操作
Session的缓存及基本操作
Session缓存原理:
Session缓存被称为Hibernate的一级缓存。
当程序调用session的CRUD方法,以及调用session的查询接口的list()、 iterate()或者filter()方法时。如果缓存中还不存在相应的对象,Hibernate就会把相应的对象缓到一级缓存当中。
当Transaction.commit()/session.flush()等方法缓存清理时,Hibernate就会根据相应的对象的状态改变来同步更新到数据库当中
Session缓存的作用:
1.减少对数据库的访问,提高数据操作的性能。当缓存当中存在下相应的对象时候,程序可以从缓存当中直接获取相应的对象,而不需从数据库当中提取数据对象;当在缓存被清理之前,及时相应的对象有着N次的改变都不会一次一次的立即去更新改变对象,而是等到缓存被清理时候才合并成一条sql去更新数据库操作。
2.保证缓存的相对应对象与数据库同步
3.避免JVM栈堆溢出异常。当相应对象之间存在着死循环的关系,Session缓存保证不会对象之间访问死循环,保证避免JVM栈堆的溢出异常。
数据库更新操作的实例:
//获取configuration对象,默认加载hibernate.cfg.xml文件 Configuration configuration = new Configuration().configure(); StandardServiceRegistryBuilder applySettings = new StandardServiceRegistryBuilder() .applySettings(configuration.getProperties()); ServiceRegistry sRegistry = applySettings.build(); //获取SessionFactory对象,以便获取session对象 SessionFactory buildSessionFactory = configuration.buildSessionFactory(sRegistry); //SessionFactory对象打开session获取session对象 Session openSession = buildSessionFactory.openSession(); //打开事务 Transaction beginTransaction = openSession.beginTransaction(); try { //获取相应的数据对象 User user = (User) openSession.get(User.class, 1); System.out.println("User:" + user); user.setName("usc"); System.out.println("----------"); user.setAge(16); System.out.println("+++++++++++"); //当相应的对象有着N次状态的改变,只有等到缓存清理时候才会同步到数据库当中 //提交事务,清理缓存 beginTransaction.commit(); } catch (Exception e) { //事务回滚 beginTransaction.rollback(); } finally { //关闭session的资源 openSession.close(); }
执行结果:
Session缓存应用:
从代码可以看出,之前修改了2次状态,不是每次修改都会立即的更新数据库,而是等到了缓存清理时候才合并提交更新数据库。
session的应用:
session的缓存的清理一般可以使用session.flush()/Transaction.commit()或者查询等去清理缓存。通过Session.setFlushMode(FlushMode)设置清理缓存的时间点。参数可以根据需求设置
FlushMode.ALWAYS:总是清理,每当有清理缓存时候都会前去清理
FlushMode.AUTO:与FlushMode.ALWAYS没有本质的区别。Hibernate的默认参数
FlushMode.COMMIT:只有commit、flush请求是才清理,请求不清理
FlushMode.MANUAL:只有flush请求才清理,commit不清理
FlushMode.NEVER:忽略所有的清理请求
session的基本操作:
save();将数据封装的相应对象有瞬间状态转为持久化状态。
get()/load();获取相应的对象。但是也有区别:当数据库中没有所需的对象时候,get()获取的对象返回值为null,而load()则会抛出异常。使用load()方法获取持久化对象时候,提取相应对象的非持久化标识符时候才会执行sql。load()方法获取的对应的对象在session生命周期中没有加载持久化标识符,在session的生命周期结束后不能在使用session的对象了。
delete();从数据库中删除对应的数据
update();修改数据
savaOrUpdate()/merge();当相应的对象存在时候,更新数据,数据库中不存在相应的对象时候创建保存数据。即新创建的对象会被持久化到缓存当中,从数据库获取的持久化对象则是修改数据。