22_6mybatis中的缓存
1.mybatis中的延时加载
问题:在一对多中,当我们有一个用户,它有100个账户。
在查询用户的时候,要不要把关联的账户查出来?
在查询账户的时候,要不要把关联的用户查出来?
在查询用户时,用户下的账户信息应该是,什么时候使用,什么时候查询的。
在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来。
什么是延迟加载
在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)
什么是立即加载
不管用不用,只要一调用方法,马上发起查询。
总结:在对应的四种表关系中:一对多,多对一,一对一,多对多
一对多,多对多:通常情况下我们都是采用延迟加载。
多对一,一对一:通常情况下我们都是采用立即加载。
2.实现需求
需求:
查询账户(Account)信息并且关联查询用户(User)信息。如果先查询账户(Account)信息即可满足要求,当我们需要查询用户(User)信息时再查询用户(User)信息。把对用户(User)信息的按需去查询就是延迟加载。
mybatis第三天实现多表操作时,我们使用了resultMap来实现一对一,一对多,多对多关系的操作。主要是通过 association、collection 实现一对一及一对多映射。association、collection 具备延迟加载功能。
3.使用assocation实现延迟加载
3.1账户的持久层DAO接口
- package com.itheima.dao;
- import com.itheima.domain.Account;
- import java.util.List;
- public interface IAccountDao {
- List<Account> findAll();
- }
3.2账户的持久层映射文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.itheima.dao.IAccountDao">
- <!-- 定义封装account和user的resultMap -->
- <resultMap id="accountUserMap" type="account">
- <id property="id" column="id"></id>
- <result property="uid" column="uid"></result>
- <result property="money" column="money"></result>
- <!-- 一对一的关系映射:配置封装user的内容
- select属性指定的内容:查询用户的唯一标识:
- column属性指定的内容:用户根据id查询时,所需要的参数的值
- -->
- <association property="user" column="uid" javaType="user"
- select="com.itheima.dao.IUserDao.findById"></association>
- </resultMap>
- <!-- 查询所有 -->
- <select id="findAll" resultMap="accountUserMap">
- select * from account;
- </select>
- <!-- 根据用户id查询账户列表 -->
- <select id="findAccountByUid" resultType="account">
- select * from account where uid = #{uid}
- </select>
- </mapper>
select : 填写我们要调用的 select 映射的 id
column : 填写我们要传递给 select 映射的参数
3.3用户的持久层接口和映射文件
- package com.itheima.dao;
- import com.itheima.domain.User;
- import java.util.List;
- /**
- * @author 黑马程序员
- * @Company http://www.ithiema.com
- *
- * 用户的持久层接口
- */
- public interface IUserDao {
- /**
- * 查询所有用户,同时获取到用户下所有账户的信息
- * @return
- */
- List<User> findAll();
- /**
- * 根据id查询用户信息
- * @param userId
- * @return
- */
- User findById(Integer userId);
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.itheima.dao.IUserDao">
- <!-- 定义User的resultMap-->
- <resultMap id="userAccountMap" type="user">
- <id property="id" column="id"></id>
- <result property="username" column="username"></result>
- <result property="address" column="address"></result>
- <result property="sex" column="sex"></result>
- <result property="birthday" column="birthday"></result>
- <!-- 配置user对象中accounts集合的映射 -->
- <collection property="accounts" ofType="account">
- <id column="aid" property="id"></id>
- <result column="uid" property="uid"></result>
- <result column="money" property="money"></result>
- </collection>
- </resultMap>
- <!-- 查询所有 -->
- <select id="findAll" resultMap="userAccountMap">
- select * from user u left outer join account a on u.id = a.uid
- </select>
- <!-- 根据id查询用户 -->
- <select id="findById" parameterType="INT" resultType="user">
- select * from user where id = #{uid}
- </select>
- </mapper>
3.4开启 Mybatis的延迟加载策略
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <!-- 配置properties-->
- <properties resource="jdbcConfig.properties"></properties>
- <!--<!–配置参数–>-->
- <settings>
- <!--开启Mybatis支持延迟加载-->
- <setting name="lazyLoadingEnabled" value="true"/>
- <setting name="aggressiveLazyLoading" value="false"></setting>
- </settings>
- <!--使用typeAliases配置别名,它只能配置domain中类的别名 -->
- <typeAliases>
- <package name="com.itheima.domain"></package>
- </typeAliases>
- <!--配置环境-->
- <environments default="mysql">
- <!-- 配置mysql的环境-->
- <environment id="mysql">
- <!-- 配置事务 -->
- <transactionManager type="JDBC"></transactionManager>
- <!--配置连接池-->
- <dataSource type="POOLED">
- <property name="driver" value="${jdbc.driver}"></property>
- <property name="url" value="${jdbc.url}"></property>
- <property name="username" value="${jdbc.username}"></property>
- <property name="password" value="${jdbc.password}"></property>
- </dataSource>
- </environment>
- </environments>
- <!-- 配置映射文件的位置 -->
- <mappers>
- <package name="com.itheima.dao"></package>
- </mappers>
- </configuration>
3.5编写测试只查账户信息不查用户信息
- package com.itheima.test;
- import com.itheima.dao.IAccountDao;
- import com.itheima.domain.Account;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- import java.io.InputStream;
- import java.util.List;
- public class AccountTest {
- private InputStream in;
- private SqlSession sqlSession;
- private IAccountDao accountDao;
- @Before//用于在测试方法执行之前执行
- public void init()throws Exception{
- //1.读取配置文件,生成字节输入流
- in = Resources.getResourceAsStream("SqlMapConfig.xml");
- //2.获取SqlSessionFactory
- SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
- //3.获取SqlSession对象
- sqlSession = factory.openSession(true);
- //4.获取dao的代理对象
- accountDao = sqlSession.getMapper(IAccountDao.class);
- }
- @After//用于在测试方法执行之后执行
- public void destroy()throws Exception{
- //提交事务
- // sqlSession.commit();
- //6.释放资源
- sqlSession.close();
- in.close();
- }
- /**
- * 测试查询所有
- */
- @Test
- public void testFindAll(){
- List<Account> accounts = accountDao.findAll();
- }
- }
如果不配置这个
- <settings>
- <!--开启Mybatis支持延迟加载-->
- <setting name="lazyLoadingEnabled" value="true"/>
- <setting name="aggressiveLazyLoading" value="false"></setting>
- </settings>
4.Mybaits中缓存的概念
什么是缓存
存在于内存中的临时数据。
为什么使用缓存
减少和数据库的交互次数,提高执行效率。
什么样的数据能使用缓存,什么样的数据不能使用
适用于缓存:
经常查询并且不经常改变的。
数据的正确与否对最终结果影响不大的。
不适用于缓存:
经常改变的数据
数据的正确与否对最终结果影响很大的。
例如:商品的库存,银行的汇率,股市的牌价。
Mybatis中的一级缓存和二级缓存
一级缓存:
它指的是Mybatis中SqlSession对象的缓存。
当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中。 该区域的结构是一个Map。
当我们再次查询同样的数据,mybatis会先去sqlsession中查询是否有,有的话直接拿出来用。
当SqlSession对象消失时,mybatis的一级缓存也就消失了。
二级缓存:
它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
二级缓存的使用步骤:
第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)
第二步:让当前的映射文件支持二级缓存(在IUserDao.xml中配置)
第三步:让当前的操作支持二级缓存(在select标签中配置)
4.1证明一级缓存的存在
一级缓存是 SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就存在。
4.2user实体类
- package com.itheima.domain;
- import java.io.Serializable;
- import java.util.Date;
- import java.util.List;
- public class User implements Serializable {
- private Integer id;
- private String username;
- private String address;
- private String sex;
- private Date birthday;
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- // @Override
- // public String toString() {
- // return "User{" +
- // "id=" + id +
- // ", username='" + username + '\'' +
- // ", address='" + address + '\'' +
- // ", sex='" + sex + '\'' +
- // ", birthday=" + birthday +
- // '}';
- // }
- }
4.3编写用户持久层Dao接口
- package com.itheima.dao;
- import com.itheima.domain.User;
- import java.util.List;
- public interface IUserDao {
- /**
- * 查询所有用户,同时获取到用户下所有账户的信息
- * @return
- */
- List<User> findAll();
- /**
- * 根据id查询用户信息
- * @param userId
- * @return
- */
- User findById(Integer userId);
- }
4.4编写用户持久层映射文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.itheima.dao.IUserDao">
- <!-- 查询所有 -->
- <select id="findAll" resultType="user">
- select * from user
- </select>
- <!-- 根据id查询用户 -->
- <select id="findById" parameterType="INT" resultType="user">
- select * from user where id = #{uid}
- </select>
- </mapper>
4.5测试方法
- package com.itheima.test;
- import com.itheima.dao.IUserDao;
- import com.itheima.domain.User;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- import java.io.InputStream;
- import java.util.List;
- /**
- * @author 黑马程序员
- * @Company http://www.ithiema.com
- */
- public class UserTest {
- private InputStream in;
- private SqlSession sqlSession;
- private IUserDao userDao;
- private SqlSessionFactory factory;
- @Before//用于在测试方法执行之前执行
- public void init() throws Exception {
- //1.读取配置文件,生成字节输入流
- in = Resources.getResourceAsStream("SqlMapConfig.xml");
- //2.获取SqlSessionFactory
- factory = new SqlSessionFactoryBuilder().build(in);
- //3.获取SqlSession对象
- sqlSession = factory.openSession(true);
- //4.获取dao的代理对象
- userDao = sqlSession.getMapper(IUserDao.class);
- }
- @After//用于在测试方法执行之后执行
- public void destroy() throws Exception {
- //提交事务
- // sqlSession.commit();
- //6.释放资源
- sqlSession.close();
- in.close();
- }
- /**
- * 测试一级缓存
- */
- @Test
- public void testFirstLevelCache() {
- User user1 = userDao.findById(41);
- System.out.println(user1);
- sqlSession.close();
- sqlSession = factory.openSession();
- userDao = sqlSession.getMapper(IUserDao.class);
- User user2 = userDao.findById(41);
- System.out.println(user2);
- System.out.println(user1 == user2);
- }
- }
如果关闭了sqlSession,可以看出不是同一个对象,并且可以看到数据库查询了两次。如果不关闭sqlSession会怎么样呢?
- package com.itheima.test;
- import com.itheima.dao.IUserDao;
- import com.itheima.domain.User;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- import java.io.InputStream;
- import java.util.List;
- /**
- * @author 黑马程序员
- * @Company http://www.ithiema.com
- */
- public class UserTest {
- private InputStream in;
- private SqlSession sqlSession;
- private IUserDao userDao;
- private SqlSessionFactory factory;
- @Before//用于在测试方法执行之前执行
- public void init() throws Exception {
- //1.读取配置文件,生成字节输入流
- in = Resources.getResourceAsStream("SqlMapConfig.xml");
- //2.获取SqlSessionFactory
- factory = new SqlSessionFactoryBuilder().build(in);
- //3.获取SqlSession对象
- sqlSession = factory.openSession(true);
- //4.获取dao的代理对象
- userDao = sqlSession.getMapper(IUserDao.class);
- }
- @After//用于在测试方法执行之后执行
- public void destroy() throws Exception {
- //提交事务
- // sqlSession.commit();
- //6.释放资源
- sqlSession.close();
- in.close();
- }
- /**
- * 测试一级缓存
- */
- @Test
- public void testFirstLevelCache() {
- User user1 = userDao.findById(41);
- System.out.println(user1);
- // sqlSession.close();
- // sqlSession = factory.openSession();
- // userDao = sqlSession.getMapper(IUserDao.class);
- User user2 = userDao.findById(41);
- System.out.println(user2);
- System.out.println(user1 == user2);
- }
- }
如果不关闭sqlSession,对象时同一个,说明应用了缓存中的对象,并且数据库只被查询了一次。
- package com.itheima.test;
- import com.itheima.dao.IUserDao;
- import com.itheima.domain.User;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- import java.io.InputStream;
- import java.util.List;
- /**
- * @author 黑马程序员
- * @Company http://www.ithiema.com
- */
- public class UserTest {
- private InputStream in;
- private SqlSession sqlSession;
- private IUserDao userDao;
- private SqlSessionFactory factory;
- @Before//用于在测试方法执行之前执行
- public void init() throws Exception {
- //1.读取配置文件,生成字节输入流
- in = Resources.getResourceAsStream("SqlMapConfig.xml");
- //2.获取SqlSessionFactory
- factory = new SqlSessionFactoryBuilder().build(in);
- //3.获取SqlSession对象
- sqlSession = factory.openSession(true);
- //4.获取dao的代理对象
- userDao = sqlSession.getMapper(IUserDao.class);
- }
- @After//用于在测试方法执行之后执行
- public void destroy() throws Exception {
- //提交事务
- // sqlSession.commit();
- //6.释放资源
- sqlSession.close();
- in.close();
- }
- /**
- * 测试一级缓存
- */
- @Test
- public void testFirstLevelCache() {
- User user1 = userDao.findById(41);
- System.out.println(user1);
- sqlSession.clearCache();//此方法也可以清空缓存
- User user2 = userDao.findById(41);
- System.out.println(user2);
- System.out.println(user1 == user2);
- }
- }
4.6 一级缓存的分析
一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。
4.7测试一级缓存的清空
- package com.itheima.dao;
- import com.itheima.domain.User;
- import java.util.List;
- public interface IUserDao {
- /**
- * 查询所有用户,同时获取到用户下所有账户的信息
- * @return
- */
- List<User> findAll();
- /**
- * 根据id查询用户信息
- * @param userId
- * @return
- */
- User findById(Integer userId);
- /**
- * 更新用户信息
- * @param user
- */
- void updateUser(User user);
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.itheima.dao.IUserDao">
- <!-- 查询所有 -->
- <select id="findAll" resultType="user">
- select * from user
- </select>
- <!-- 根据id查询用户 -->
- <select id="findById" parameterType="INT" resultType="user">
- select * from user where id = #{uid}
- </select>
- <!-- 更新用户信息-->
- <update id="updateUser" parameterType="user">
- update user set username=#{username},address=#{address} where id=#{id}
- </update>
- </mapper>
- package com.itheima.test;
- import com.itheima.dao.IUserDao;
- import com.itheima.domain.User;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- import java.io.InputStream;
- import java.util.List;
- /**
- * @author 黑马程序员
- * @Company http://www.ithiema.com
- */
- public class UserTest {
- private InputStream in;
- private SqlSession sqlSession;
- private IUserDao userDao;
- private SqlSessionFactory factory;
- @Before//用于在测试方法执行之前执行
- public void init() throws Exception {
- //1.读取配置文件,生成字节输入流
- in = Resources.getResourceAsStream("SqlMapConfig.xml");
- //2.获取SqlSessionFactory
- factory = new SqlSessionFactoryBuilder().build(in);
- //3.获取SqlSession对象
- sqlSession = factory.openSession(true);
- //4.获取dao的代理对象
- userDao = sqlSession.getMapper(IUserDao.class);
- }
- @After//用于在测试方法执行之后执行
- public void destroy() throws Exception {
- //提交事务
- // sqlSession.commit();
- //6.释放资源
- sqlSession.close();
- in.close();
- }
- /**
- * 测试一级缓存
- */
- @Test
- public void testFirstLevelCache() {
- User user1 = userDao.findById(41);
- System.out.println(user1);
- sqlSession.clearCache();//此方法也可以清空缓存
- User user2 = userDao.findById(41);
- System.out.println(user2);
- System.out.println(user1 == user2);
- }
- /**
- * 测试一级缓存
- */
- @Test
- public void testClearCache() {
- //1.根据id查询用户
- User user1 = userDao.findById(41);
- System.out.println(user1);
- //2.更新用户信息
- user1.setUsername("update user clear cache");
- user1.setAddress("beijing");
- userDao.updateUser(user1);
- //3.再次查询id为41的用户
- User user2 = userDao.findById(41);
- System.out.println(user2);
- System.out.println(user1 == user2);
- }
- }
4.8二级缓存
二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。
4.9开启二级缓存
第一步:在 SqlMapConfig.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <!-- 配置properties-->
- <properties resource="jdbcConfig.properties"></properties>
- <settings>
- <setting name="cacheEnabled" value="true"/>
- </settings>
- <!--使用typeAliases配置别名,它只能配置domain中类的别名 -->
- <typeAliases>
- <package name="com.itheima.domain"></package>
- </typeAliases>
- <!--配置环境-->
- <environments default="mysql">
- <!-- 配置mysql的环境-->
- <environment id="mysql">
- <!-- 配置事务 -->
- <transactionManager type="JDBC"></transactionManager>
- <!--配置连接池-->
- <dataSource type="POOLED">
- <property name="driver" value="${jdbc.driver}"></property>
- <property name="url" value="${jdbc.url}"></property>
- <property name="username" value="${jdbc.username}"></property>
- <property name="password" value="${jdbc.password}"></property>
- </dataSource>
- </environment>
- </environments>
- <!-- 配置映射文件的位置 -->
- <mappers>
- <package name="com.itheima.dao"></package>
- </mappers>
- </configuration>
第二步:配置相关的Mapper映射文
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.itheima.dao.IUserDao">
- <!--开启user支持二级缓存-->
- <cache/>
- <!-- 查询所有 -->
- <select id="findAll" resultType="user">
- select * from user
- </select>
- <!-- 根据id查询用户 -->
- <select id="findById" parameterType="INT" resultType="user" useCache="true">
- select * from user where id = #{uid}
- </select>
- <!-- 更新用户信息-->
- <update id="updateUser" parameterType="user">
- update user set username=#{username},address=#{address} where id=#{id}
- </update>
- </mapper>
4.10测试
- package com.itheima.test;
- import com.itheima.dao.IUserDao;
- import com.itheima.domain.User;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- import java.io.InputStream;
- /**
- * @author 黑马程序员
- * @Company http://www.ithiema.com
- */
- public class SecondLevelCacheTest {
- private InputStream in;
- private SqlSessionFactory factory;
- @Before//用于在测试方法执行之前执行
- public void init() throws Exception {
- //1.读取配置文件,生成字节输入流
- in = Resources.getResourceAsStream("SqlMapConfig.xml");
- //2.获取SqlSessionFactory
- factory = new SqlSessionFactoryBuilder().build(in);
- }
- @After//用于在测试方法执行之后执行
- public void destroy() throws Exception {
- in.close();
- }
- /**
- * 测试一级缓存
- */
- @Test
- public void testFirstLevelCache() {
- SqlSession sqlSession1 = factory.openSession(true);
- IUserDao dao1 = sqlSession1.getMapper(IUserDao.class);
- User user1 = dao1.findById(41);
- System.out.println(user1);
- sqlSession1.close();
- SqlSession sqlSession2 = factory.openSession(true);
- IUserDao dao2 = sqlSession2.getMapper(IUserDao.class);
- User user2 = dao2.findById(41);
- System.out.println(user2);
- sqlSession2.close();
- System.out.println(user1 == user2);
- }
- }
因为两个对象的内存地址不一样,而数据库查询方法只调用了一次,所以可以看出二级缓存存入的不是对象二是数据,所以共享的是数据。
22_6mybatis中的缓存的更多相关文章
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- 清除oracle中的缓存(具体细节未知, 慎用)
oracle中的缓存主要是指SGA中的:1.share pool2.database buffer cache清空命令如下:首先要登录到sqlplus命令下,输入如下命令即可:SQL> alte ...
- AngularJS中的缓存
欢迎大家指导与讨论 : ) 缓存篇 一个缓存就是一个组件,它可以透明地储存数据,以便以后可以更快地服务于请求.多次重复地获取资源可能会导致数据重复,消耗时间.因此缓存适用于变化性不大的一些数据,缓存能 ...
- 如何在 apache 中设置缓存有效时间
今天学习了下如何在 apache 中设置缓存时间,记之以备忘. 在 http 报文头中,与缓存时间有关的两个字段是 Expires 以及 Cache-Control 中的 max-age,Expire ...
- 谈谈MVC项目中的缓存功能设计的相关问题
本文收集一些关于项目中为什么需要使用缓存功能,以及怎么使用等,在实际开发中对缓存的设计的考虑 为什么需要讨论缓存呢? 缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例如数据 ...
- iOS中dyld缓存的实现原理是怎样的?
在iOS开发中,为了提升系统的安全性,很多系统库文件都被打包到一个缓存的文件当中即dyld缓存,那大家对dyld缓存了解多少呢?今天小编将和大家分享的就是一位iOS大神对dyld缓存的使用分析,一起来 ...
- angular中$cacheFactory缓存的使用
最近在学习使用angular,慢慢从jquery ui转型到用ng开发,发现了很多不同点,继续学习吧: 首先创建一个服务,以便在项目中的controller中引用,服务有几种存在形式,factory( ...
- 如何在 Linux 中清除缓存(Cache)
如何在 Linux 中清除缓存(Cache) 方法一: http://mp.weixin.qq.com/s?__biz=MjM5ODAzODgyMQ==&am ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(7)-缓存用户信息
首先讲讲EhCache.在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,EhCache会依据其自身Jar存档包含的ehcache-fails ...
随机推荐
- linux常用命令---------------find
1.find 基本模式 find path -option [ -print ] [ -exec -ok command ] {} \; 2.常用的参数 -name name, -iname name ...
- Hibernate使用中防止SQL注入的几种方案
Hibernate使用中防止SQL注入的几种方案 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数 ...
- element-ui--按需引入
参考链接:https://www.cnblogs.com/qiezuimh/p/10103522.html
- 【Python】【基础知识】【内置函数】【print的使用方法】
原英文帮助文档: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) Print objects to the text ...
- 【LOJ】#3090. 「BJOI2019」勘破神机
LOJ#3090. 「BJOI2019」勘破神机 为了这题我去学习了一下BM算法.. 很容易发现这2的地方是\(F_{1} = 1,F_{2} = 2\)的斐波那契数列 3的地方是\(G_{1} = ...
- localStorage 杂记
localStorage html5标准 Web 存储现在的主流浏览器,包括IE 8+.Chrome 4+.Firefox 3.5+.Opera 10.5+.Safari 4+.iPhone 2+.A ...
- Python编程之注释
一.注释 当你把变量理解透了,你就已经进入了编程的世界.随着学习的深入,用不了多久,你就可以写复杂的上千甚至上万行的代码啦,有些代码你花了很久写出来,过了些天再回去看,发现竟然看不懂了,这太正常了. ...
- OpenCV-图像处理
直方图比较方法-概述 对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间 然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进 而比较图像本身的相似程度.Opencv提供的比 ...
- ale.js 对比其他框架
欢迎!我们相信你来这里的目的就是为了解 Ale 与其他大型框架的区别,这也正是我们想要在此回答的. 客观来说,作为 Ale 的核心开发者,我们肯定会更偏爱 Ale,认为对于某些问题来讲用 Ale 解决 ...
- Vasya and Magic Matrix CodeForces - 1042E (概率dp)
大意:给定n*m矩阵, 初始位置(r,c), 每一步随机移动到权值小于当前点的位置, 得分为移动距离的平方, 求得分期望. 直接暴力dp的话复杂度是O(n^4), 把距离平方拆开化简一下, 可以O(n ...