二级缓存

深入浅出hibernate总结

大城市里の小女人 提交于 2019-12-03 21:23:08
一、总括 1、sessionFactory与session (1)sessionFactory:一个数据库对应一个factory,线程安全、单例,一般随应用开启和关闭。 (2)session:非线程安全,管理connection(池) session对于sessionFactory的关系相当于conn对于jdbc的关系,但session不等同于connection。 (3)另外,一般是一个session对一个事务。 2、hibernate不适合的场景 (1)复杂查询/大批量数据导出 (2)批量修改/删除 (3)实体关系过于复杂 3、连接池与prepareStatement池的原理 连接池,在getConn与closeConn的时候,不是真正的创建和关闭,采用代理拦截,在get的时候,从池中拿,如果有则返回,没有则创建一个返回,归还的时候,如果池没有满,则放入池中,如果满了,则真正关闭。 (补上示例代码) prepareStatement池的原理就是缓存ps语句,不让其随着conn的关闭而失效。步骤就是拦截ps的close方法,然后每次create的时候,从池中查找,如果有则返回,没有则创建,每次close的时候,看池有没有满,如果有满,则关闭,没有则放入池中。 (补上示例代码) 4、hibernate configure的配置 Configuration cfg=new

MyBatis缓存

放肆的年华 提交于 2019-12-03 14:08:28
应用程序和数据库交互的过程是一个相对比较耗时的过程。 缓存存在的意义 :让应用程序减少对数据库的访问,提升程序运行效率。 MyBatis 中默认SqlSession 缓存开启 3.1同一个 SqlSession 对象调用同一个<select>时,只有第一次访问数据库,第一次之后把查询结果缓存到SqlSession 缓存区(内存)中 3.2缓存的是statement 对象.(简单记忆必须是用一个<select>). 注意在myabtis 中是一个<select>对应一个statement 对象 。 3.3有效范围必须是同一个SqlSession 对象 缓存流程 步骤一: 先去缓存区中找是否存在statement 步骤二:返回结果 步骤三:如果没有缓存statement 对象,去数据库获取数据 步骤四:数据库返回查询结果 步骤五:把查询结果放到对应的缓存区中 SqlSessionFactory 缓存 又叫 二级缓存 有效范围 同一个factory 内哪个SqlSession 都可以获取 什么时候使用二级缓存: 当数据频繁被使用,很少被修改 使用二级缓存步骤 1)在mapper.xml 中添加 2)如果不写readOnly=”true”需要把实体类序列化 <cache readOnly="true"></cache> readonly 表示是否允许对二级缓存数据进行读取。

Mybatis中的缓存管理

核能气质少年 提交于 2019-12-03 11:12:04
目录 Mybatis中的缓存管理 查询缓存工作原理: 配置缓存: 默认配置: 使用二级缓存: 刷新缓存过程: 配置EHcache 产生脏数据 使用原则: Mybatis中的缓存管理 查询缓存工作原理: 查询语句 <---> 缓存 <----> DB 缓存内容: Mybatis中存放的是查询的内容; 缓存对比: 类别 作用范围 生命周期 一级缓存 namespace 和sqlsession的生存周期相同 二级缓存 namespace 和整个应用的生命周期相同 一级缓存:默认是开启的,无开关关闭; 二级缓存:默认是开启的,需要手动关闭,二级缓存可以外置第三方的产品。 配置缓存: 默认配置: 一级缓存默认是开启的,无需配置,也不能关闭; 二级缓存也是默认开启状态的,如果想要关闭的话在“全局配置文件”中配置;全局关闭之后后面的配置也就不起作用了; <configuration> <!--二级缓存的全局开关--> <settings> <setting name="cacheEnabled" value="false"/> </settings> </configuration> 局部关闭设置: <!--在查询语句里添加设置:useCache="false"--> <select id="selectStudentById2" resultType="Student" useCache=

java面试小结——框架(hibernate、MyBatis、spring、Spring MVC)

ε祈祈猫儿з 提交于 2019-12-03 08:16:06
Hibernate 什么是ORM 对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术;简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将关系数据库表中的行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种形式。 持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些? 所谓”持久”就是将数据保存到可掉电式存储设备中以便今后使用,简单的说,就是将内存中的数据保存到关系型数据库、文件系统、消息队列等提供持久化支持的设备中。持久层就是系统中专注于实现数据持久化的相对独立的层面。 持久层设计的目标包括: - 数据存储逻辑的分离,提供抽象化的数据访问接口。 - 数据访问底层实现的分离,可以在不修改代码的情况下切换底层实现。 - 资源管理和调度的分离,在数据访问层实现统一的资源调度(如缓存机制)。 - 数据抽象,提供更面向对象的数据操作。 持久层框架有: - Hibernate - MyBatis - TopLink - Guzz - jOOQ - Spring Data - ActiveJDBC Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗

MyBatis动态SQL和缓存

瘦欲@ 提交于 2019-12-03 05:30:49
1. 什么是动态SQL 静态SQL:静态SQL语句在程序运行前SQL语句必须是确定的,SQL语句中涉及的表的字段名必须是存在的,静态SQL的编译是在程序运行前的。 动态SQL:动态SQL语句是在程序运行是被创建和执行的。 2. MyBatis中的动态SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句。 对于一些复杂的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不存在,此时就需要根据用户指定的条件动态生成SQL语句。如果不使用持久层框架我们可能需要自己拼装SQL语句 MyBatis中用于实现动态SQL的元素主要有: if choose / when / otherwise trim where set foreach 3. if标签 4. choose标签 5. trim标签 6. set标签 7. foreach标签 动态SQL的另一个常用的操作是需要对一个集合进行遍历,通常在构建in条件语句的时候 foreach标签还可以用于批量保存数据 <insert id="addEmps"> INSERT INTO tbl_employee(user_name,gender,email,d_id) VALUES <foreach collection="emps" item="emp" separator=","> (#{emp

查询缓存

无人久伴 提交于 2019-12-03 05:29:44
将上一次的查询结果保存在内存中,后面如果是相同的查询,就不再去数据库查询,到内存中获取数据。如果中间进行了增、删、改,需要清空缓存中的数据。 好处: 提高查询速度,减小数据库服务器压力 Mybatis中的查询缓存: 一级查询缓存 如果使用的是同一个SqlSession对象中【没有被关闭过close()】,执行了多次相同的查询语句,第一次查询后会将结果保存到内存中,后面相同的查询会从内存中直接获取数据,而不再去数据中查询,提高查询速度。 当一个SqlSession对象被关闭后,该SqlSession的上一次查询结果缓存中就不存在了。 Mybatis中一级缓存默认就是开启状态,不需要手动启动,而且不能够进行关闭。 一级缓存的验证: 用同一个SqlSession对象执行相同的方法,控制台只有一次查询 控制台 如果使用的不同的SqlSession对象,那么不使用缓存 如果使用的是同一个SqlSession对象,但是中间出现了增删改操作,缓存也不起作用 结果 二级查询缓存 二级缓存与一级缓存,一级缓存当SqlSession关闭,则缓存数据不再存在,二级缓存的缓存数据与SqlSession对象无关。二级缓存延长缓存数据的保存时间。 使用 对查询语句中涉及到的实体类必须实现序列化接口 在对应的映射文件中的mapper标签中添加cache子标签 验证二级缓存的作用

SSH框架面试题(转)

我们两清 提交于 2019-12-03 04:50:38
Hibernate工作原理及为什么要用? 原理: 1. 读取并解析配置文件 2. 读取并解析映射信息,创建SessionFactory 3. 打开Sesssion 4. 创建事务Transation 5. 持久化操作 6. 提交事务 7. 关闭Session 8. 关闭SesstionFactory 为什么要用: * 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 * Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 * hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 * hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 Hibernate是如何延迟加载? * Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) * Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

框架和事务

匿名 (未验证) 提交于 2019-12-03 00:39:02
1**** Hibernate与MyBatis 开发学习 Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。 开发工作量 针对高级查询Mybatis需要手动编写SQL语句,以及ResultMap(映射)Hibernate有良好的映射机制SQL的生成与结果映射,可以更专注于业务流程。 SQL优化方面 Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗,也可以手动Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。 扩展性方面 Hibernate与具体数据库的XMLHQL语句与具体使用的数据库无关,移植性很好。MyBatis项目中所有的SQL语句都是依赖所用的数据库的,所以不同数据库类型的支持不好。 五章 缓存机制对比 Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。 Hibernate的调优方案 制定合理的缓存策略;

mybatis总结

匿名 (未验证) 提交于 2019-12-03 00:09:02
1.JDBC是怎么访问数据库的? 答:JDBC编程有6步,分别是1.加载sql驱动,2.使用DriverManager获取数据库连接,3.使用Connecttion来创建一个Statement对象 Statement对象用来执行SQL语句,4.执行SQL语句,5.操作结果集,6.回收数据库资源 2.MyBatis是怎么访问数据库的? 答:1导入架包; 2创建实体类对象; 3 创建mybatis的配置文件mybatis-config.xml; 4创建上面的TuserMapper.xml(Sql映射文件); 5 创建test类进行测试; 3.MyBatis和JDBC访问数据库有什么区别? 答:MyBatis具有以下一些特点:简单易用、性能高效、保留SQL、开源框架。 2可以自定义SQL、存储过程和高级映射的持久层框架 3. 优化获取和释放;SQL统一管理,对数据库进行存取操作;生成动态SQL语句;能够对结果集进行映射 总结: 一: 当dataSource的类型是POOLED时,还额外有以下常用属性。 poolMaximumActiveConnections,连接池最大活动连接数,默认值10 poolMaximumIdleConnections,连接池最大闲置连接数 poolMaximumCheckoutTime,连接“离开”连接池的最大时间,默认20秒 二:

myBatis深入学习

匿名 (未验证) 提交于 2019-12-02 23:55:01
本文在前一篇文章的基础上记录了对mybatis的表之间的关系映射、延迟加载、缓存等高级功能的学习。 1.表之间的关系映射   既然要明确表之间的关系映射,那么首先要分析数据库中表之间的关系,假设数据库中现在有4张表:user(用户表,记录了购买商品的用户信息)、orders(订单表,记录了用户所创建的订单)、orderdetails(订单明细表,记录了订单的详细信息即购买商品的信息)、items(商品表,记录了商品信息),对数据库中表的分析要重点看表中的 主键、非空字段、外键 ,经过对表的分析,可以得到如下的数据模型分析:    一对一查询   一对一的查询在实现时可以使用resultType和resultMap实现,关于二者的区别如下:   resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。如果没有查询结果的特殊要求建议使用resultType。   resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。resultMap可以实现延迟加载,resultType无法实现延迟加载。 一对多查询