延時加載,緩存

1.延遲加載:使用在關聯查詢中
    提高系統性能,減少數據庫壓力。
    
  //查詢訂單信息,延時加載用戶信息
  //全局配置文件
      <settings>
        <!--開啓延遲加載-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--按需延遲加載-->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!-- 開啓二級緩存 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>
    
   //映射文件
      <mapper namespace="com.neuedu.mapper.OrdersMapperCustom">
        <resultMap type="com.neuedu.pojo.Orders" id="OrdersUserLazyLoadingResultMap">
                <!--對訂單信息進行映射配置  -->
                <id column="id" property="id"/>
                <result column="userid" property="userId"/>
                <result column="orderid" property="orderId"/>
                <result column="createtime" property="createtime"/>
                <result column="note" property="note"/>
                
                <association property="user"  javaType="com.neuedu.pojo.User"
                 select="com.neuedu.mapper.OrdersMapperCustom.findUserById" column="userid">
                </association>
                
        </resultMap>
        
        <!-- 查詢訂單關聯查詢用戶,用戶信息需要延遲加載 -->
        <select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
            SELECT * FROM orders
        </select>
        
        <!-- 用戶信息需要延遲加載 -->
        <select id="findUserById" parameterType="int" resultType="user">
          SELECT * FROM T_USER WHERE id=#{value}
        </select>
    
    </mapper>
    //接口
    public interface OrdersMapperCustom {
    
    //查詢訂單關聯查詢用戶,用戶信息是延遲加載
    public List<Orders> findOrdersUserLazyLoading() throws Exception;
    //根據id查詢用戶信息
    public User findUserById(int id) throws Exception;
   }
   //測試類
   

 @Test
    public void testFindOrdersUserLazyLoading() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();// 創建代理對象
        OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
        // 查詢訂單信息(單表)
        List<Orders> list = ordersMapperCustom.findOrdersUserLazyLoading();
     
        for (Orders orders : list) {
            // 執行getUser()去查詢用戶信息,這裏實現按需加載,通過debug調試可以查看
            User user = orders.getUser();
            System.out.println(user);
        }
    }


2、緩存
    查詢時先找緩存中是否有需要的對象,如果沒有再去數據庫中查詢,並將結果存放到緩存中。
    提高系統性能。
    
     一級緩存:默認是開啓的,作用域一次session會話
     
     @Test
    public void getUserById() throws Exception{
        SqlSession sqlSession = sqlSessionFactory.openSession();// 創建代理對象
        OrdersMapperCustom dao = sqlSession.getMapper(OrdersMapperCustom.class);

        User u1=dao.findUserById(6);
        
        User u2=dao.findUserById(6)
        sqlSession.close();     
        
        System.out.println(u1==u2);//true   執行一次sql語句
        
    }
     二級緩存:默認關閉的,作用域是一個命名空間,也就是一個命名空間共享一份緩存
     
     二級緩存的使用:
        (1)在全局配置文件中
         <settings>
            <setting name="cacheEnabled" value="true"/>
         </settings>
        (2)在映射文件中
           <cache/>
        (3)pojo類序列化
           public class User implements Serializable {}
           
           
    @Test
    public void getUserById() throws Exception{
        SqlSession sqlSession1 = sqlSessionFactory.openSession();// 創建代理對象
        OrdersMapperCustom dao1 = sqlSession1.getMapper(OrdersMapperCustom.class);
        SqlSession sqlSession2 = sqlSessionFactory.openSession();// 創建代理對象
        OrdersMapperCustom dao2 = sqlSession2.getMapper(OrdersMapperCustom.class);
        User u1=dao1.findUserById(6);
        sqlSession1.close();
        
        User u2=dao2.findUserById(6)   
        sqlSession2.close();
        
        System.out.println(u1==u2);//false   sql也執行一次Cache Hit Ratio [com.neuedu.mapper.OrdersMapperCustom]: 0.5
        
    }
     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章