`
gaosililn
  • 浏览: 70497 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

  • 大小: 18.2 KB
分享到:
评论

相关推荐

    ssh(structs,spring,hibernate)框架中的上传下载

     LobHandler必须注入到Hibernate会话工厂sessionFactory中,因为sessionFactory负责产生与数据库交互的Session。LobHandler的配置如代码 5所示:  代码 5 Lob字段的处理句柄配置 1. 2. … 3. 4. class="org....

    基于SSH模拟当当网项目(电子商务平台)

    --------当当网SSH重构---------- 1.DAO需要根据原有接口全部重构. 采用Spring+Hibernate方式实现 2.Service改造工作 采用Spring的IoC注入方式使用DAO 3.Action改造工作 采用整合插件注入方式使用Spring容器中的...

    低清版 大型门户网站是这样炼成的.pdf

    6.4.3 ssh 2组合框架的基本开发步骤—eportal启程 414 6.5 小结 423 第2篇 实践篇 第7章 ssh 2热身——构建新闻发布系统 427 7.1 门户网站新闻资讯基本分类 427 7.2 新闻发布系统需求分析 429 7.3 新闻发布...

    spring-boot-demo:BootSpring Boot演示入门样例,包括属性(配置),JDBC模板(数据库CRUD),JPA(Hibernate数据库CRUD),Mybatis(数据库CRUD),Mybatis(Mybatis数据库CRUD),thymeleaf(模板解析),beetl(模板)解析),freemarker(模板解析),享受(模板解析),logback(日志),log-aop(AOP方式日志),ehcache(ehcache缓存),执行器(监控),admin(监控),swagger

    常用功能:会话(session),安全性(rbac权限框架),shiro(rbac权限框架),oauth(第三方登录),logback(日志),log-aop(AOP方式日志),ehcache(ehcache缓存),异常(统一异常处理),Async(异步

    java面试题

    二级缓存: 56 71.4.3. 缓存管理 56 71.5. Hibernate 中Java对象的状态 58 71.5.1. 临时状态 (transient) 58 71.5.2. 持久化状态(persisted) 58 71.5.3. 游离状态(detached) 58 71.5.4. hibernate的三种状态之间...

    千方百计笔试题大全

    99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101、如何优化Hibernate? 23 102、Struts工作机制?为什么要使用Struts? 23 103、Struts的validate框架是如何验证的? 24 104、说下Struts的设计模式...

    java面试宝典

    99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101、如何优化Hibernate? 23 102、Struts工作机制?为什么要使用Struts? 23 103、Struts的validate框架是如何验证的? 24 104、说下Struts的设计模式...

    Java学习笔记-个人整理的

    {13.3}连接Oracle数据库及操作}{192}{section.13.3} {13.4}批处理模式}{195}{section.13.4} {13.5}分页查询}{196}{section.13.5} {13.5.1}MySQL}{198}{subsection.13.5.1} {13.6}连接池}{199}{section.13.6} {...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java面试题大全(2012版)

    9、hibernate中的update()和saveOrUpdate()的区别,session的load()和get()的区别。 122 10、简述 Hibernate 和 JDBC 的优缺点? 如何书写一个 one to many 配置文件. 122 11、iBatis与Hibernate有什么不同? 122 12、...

    java开源包1

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包11

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包2

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包3

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包6

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包5

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包10

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包4

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

Global site tag (gtag.js) - Google Analytics