发表于: 2019-11-27 21:47:15

1 1126


mybatis一二级缓存

mybatis的一级缓存,一级缓存是SqlSession级别的缓存。

查询缓存

mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。

mybaits提供一级缓存,和二级缓存。

一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

为什么要用缓存?

如果缓存中有数据就不用从数据库中获取,大大提高系统性能。

一级缓存

一级缓存工作原理

一级缓存工作原理

第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。

如果sqlSession去执行commit操作(执行插入、更新、删除),清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。

第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。

一级缓存测试

mybatis默认支持一级缓存,不需要在配置文件去配置。

按照上边一级缓存原理步骤去测试。

测试代码

1.不执行更新操作,输出:

2.取消测试代码中更新的的注释,输出:

一级缓存应用

正式开发,是将mybatis和spring进行整合开发,事务控制在service中。

一个service方法中包括 很多mapper方法调用。

service{

//开始执行时,开启事务,创建SqlSession对象

//第一次调用mapper的方法findUserById(1)

//第二次调用mapper的方法findUserById(1),从一级缓存中取数据

//方法结束,sqlSession关闭

}

如果是执行两次service调用查询相同的用户信息,不走一级缓存,因为session方法结束,sqlSession就关闭,一级缓存就清空。



batis的二级缓存,二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

二级缓存原理

二级缓存原理

首先开启mybatis的二级缓存.

sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到二级缓存中。

如果SqlSession3去执行相同mapper下sql,执行commit提交,清空该mapper下的二级缓存区域的数据。

sqlSession2去查询用户id为1的用户信息,去缓存中找是否存在数据,如果存在直接从缓存中取出数据。

二级缓存与一级缓存区别,二级缓存的范围更大,多个sqlSession可以共享一个UserMapper的二级缓存区域。

UserMapper有一个二级缓存区域(按namespace分),其它mapper也有自己的二级缓存区域(按namespace分)。每一个namespace的mapper都有一个二缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同的二级缓存区域中。

开启二级缓存

mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓存。

在核心配置文件SqlMapConfig.xml中加入<setting name="cacheEnabled" value="true"/>

测试类

useCache配置

在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。

<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">

总结:针对每次查询都需要最新的数据sql,要设置成useCache=false,禁用二级缓存。



springmvc增加了一个上传图片的功能

springmvc中对多部件类型解析

在修改商品页面,添加上传商品图片功能。

在页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对multipart类型的数据进行解析。

在springmvc.xml中配置multipart类型解析器。

<!-- 文件上传 -->

<bean id="multipartResolver"

      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

    <!-- 设置上传文件的最大尺寸为5MB -->

    <property name="maxUploadSize">

        <value>5242880</value>

    </property>

</bean>

加入上传图片的jar

添加依赖

<!-- 文件上传 -->

<dependency>

    <groupId>commons-fileupload</groupId>

    <artifactId>commons-fileupload</artifactId>

    <version>1.3.1</version>

</dependency>

依赖树

[INFO] \- commons-fileupload:commons-fileupload:jar:1.3.1:compile

[INFO]    \- commons-io:commons-io:jar:2.2:compile

可以看到,其实还间接依赖了commons-io:commons-io:jar

创建图片虚拟目录存储图片

也可以直接修改tomcat的配置,在conf/server.xml文件,添加虚拟目录.

注意:在图片虚拟目录中,一定将图片目录分级创建(提高i/o性能),一般我们采用按日期(年、月、日)进行分级创建。

上传图片代码

页面

<tr>

<td>商品图片</td>

<td>

<c:if test="${items.pic !=null}">

<img src="/pic/${items.pic}" width=100 height=100/>

<br/>

</c:if>

<input type="file"  name="items_pic"/>

</td>

</tr>

controller方法

修改:商品修改controller方法:

@RequestMapping("/editItemsSubmit")

    public String editItemsSubmit(

            Model model,

            HttpServletRequest request,

            Integer id,

            @ModelAttribute("items")

            @Validated(value = ValidGroup1.class)ItemsCustom itemsCustom,

            BindingResult bindingResult,

            MultipartFile items_pic

    )throws Exception {

 //原始名称

String originalFilename = items_pic.getOriginalFilename();

//上传图片

if(items_pic!=null && originalFilename!=null && originalFilename.length()>0){

    //存储图片的物理路径

    String pic_path = "D:\\tmp\\";

    //新的图片名称

    String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));

    //新图片

    File newFile = new File(pic_path+newFileName);

    //将内存中的数据写入磁盘

    items_pic.transferTo(newFile);

    //将新图片名称写到itemsCustom中

    itemsCustom.setPic(newFileName);

}

明天计划

mybatis整合ehcache 就算把mybatis整完了

springmvc注解开发 拦截器 jason交互等。。。

问题

请求参数乱码

在web.xml添加post乱码filter

GKDGKD


返回列表 返回列表
评论

    分享到