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();当相应的对象存在时候,更新数据,数据库中不存在相应的对象时候创建保存数据。即新创建的对象会被持久化到缓存当中,从数据库获取的持久化对象则是修改数据。

猜你喜欢

转载自gaosililin.iteye.com/blog/2269007
今日推荐