mybatis的一级缓存和二级缓存


说一下 mybatis 的一级缓存和二级缓存?

Mybatis的一级缓存是默认开启的,它只相对于同一个SqlSession有效,所以也称之为SqlSession缓存。当参数和SQL完全相同的情况下,使用同一个SqlSession对象调用同一个Mapper方法,当第1次执行SQL语句后,MyBatis会自动将其放在缓存中,后续再次查询时,如果没有声明需要刷新,且缓存没有超时,会直接取出此前缓存的数据,而不会再次发送SQL到数据库。
Mybatis的二级缓存是默认未开启的,如果希望开启,需要在配置SQL的XML文件中配置<cache>节点,由于每个XML都通过根节点的namespace属性对应一个Mapper接口,所以,二级存储也称之为namespace缓存!在使用二级存储时,查询数据的<select>节点需要配置useCache="true",并且,查询返回的结果类型必须是实现了Serializable接口的!另外,当缓存 了数据后,如果执行了当前XML中配置的增、删、改操作,会自动刷新此前的缓存数据!
关于二级缓存的特点还有许多,例如Mybatis使用了LRU算法来管理缓存的数据,但是,由于Mybatis的缓存在一定程度上是不可控的,所以,在实际应用中,一般并不使用Mybatis的缓存机制来实现数据缓存,而是使用自定义的缓存机制,或第3方缓存服务器,例如Redis、MemCache等!
例如Mybatis会在删除数据后自动刷新缓存数据,其目的是为了保证缓存的数据是有效的,但是,在一些高频率的访问中,刚刚缓存数据就被刷新,再次缓存又再次被刷新,其实是非常浪费性能和资源的,而且,在实际应用中,也不一定真的需要数据是非常精准的,就好比在电商平台购买一部手机,手机的库存值是8000还是6000,都不影响用户的购买,没有必要因为某用户购买成功后就更新手机的库存值!


java中如何构建缓存?在java中的缓存有什么优点和缺点?为什么大家都使用第三方缓存?

正在执行的程序和数据都是在内存中的,由于内存的特点包括“一旦断电数据就会全部丢失”通常,为了保证数据的永久可用,会将数据作“持久化”处理,也就是将数据保存在“可以永久存储数据”的存储介质中,最常见的就是硬盘,而数据在硬盘上必须以“文件”的形式存在,所以,结合程序读写文件的操作手段,持久化处理的常见表现有:
- 将数据保存在文本文件中,由于文本文件通常是使用IO流读取的,通常仅适合“追加写入”、“全文写入”和“全文读取”这几种需求,如果存在其它需求,例如删除其中的某些数据,或修改局部的数据,则不适用于这种做法(可以实现,但成本较高),常见的应用场景例如:保存日志信息。
- 将数据存储在XML文件中,基于XML的解析特点,使用的前提必须是“数据量偏小”,并且只涉及“全文写入”、“全文读取”这样的需求,同样不适用于删除其中的某些数据,或修改局部的数据的应用场景,常见的应用场景例如:作为配置文件保存一些配置信息。
- 将数据存储在数据库中,这是一种适用于增、删、改、查这4种操作的存储方式,并且可以存储海量数据。
无论使用以上哪种存储方式,都是将数据保存到了硬盘上,而硬盘的读写效率是偏低的,这些数据都必须先加载到内存中才可以被处理!为了提高数据的访问效率,将数据保存在硬盘的同时,还可以将数据也保存在内存中!在硬盘的数据不会丢失,保证了数据的可靠性,在内存中的数据访问效率高,提高了处理效率!
以上保存到内存中的数据就是“缓存”的数据,原则上来说,只要是将数据保存到了更加易于访问的位置,都可以称之为“缓存”,由于占用了额外的存储空间才可以提高访问效率,所以缓存是一种“牺牲空间,换取时间”的做法。
关于缓存的构建,可以有多种做法。
如果使用内存缓存,可以使用static修饰全局的量来存储需要缓存的数据,当需要获取数据时,直接访问这个static量即可!
如果数据是存储在数据库中的,通常,数据库服务器与运行程序的应用服务器并不是同一台服务器,每次访问数据时,需要先从应用服务器通过网络连接将SQL语句发送到数据库服务器,由数据库服务器处理完后再将结果返回到应用服务器,这个过程是很耗时的(涉及:建立连接,传输SQL语句,对SQL语句进行词法分析、语义分析、编译、执行、处理结果、返回结果、接收返回的结果等过程),所以,还可以将数据缓存在应用服务器的硬盘,也是缓存的一种做法。
使用缓存的目的都是为了提高访问效率,但是,如果使用应用服务器来缓存数据,要么占用大量的内存空间,要么占用大量的硬盘空间,在大型应用中,应用服务器的性能大多已经接近负载,并不适合缓存数据,所以,一般会搭建专门的缓存服务器。
搭建专门的缓存服务器时,需要在缓存服务器上处理网络连接的问题、数据查找的问题、多线程更新数据的安全问题、批处理的事务等等许多细节的问题,所以,一般使用专门的服务器端软件,典型的例如Redis、MemCache等。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值