一、什么是延迟加载

为了节省Hibernate加载对象的性能节销,在Hibernate中真正需要用到这个对象时,才会发出
    
    SQL语句来抓取这个对象。这一个过程称为延迟加载。

二、延迟加载的分类

A:实体对象的延迟加载
    
    B:一对多|多对多的延迟加载
    
    C:多对一|一对一的延迟加载
    
    D:属性的延迟加载

  • A:实体对象的延迟加载:使用session.get()和session.load()获取对象的区别就是是否开启延迟加载。

Hibernate只加载实体对象的ID,需要其他属性,才真正的发出SQL来加载这个对象。
    
    Load:采用延迟加载                    加载到的是一个代理对象
    
    Get:没有采用延迟加载                加载到的是一个实体对象。

  • 案例:

User user=(User)session.load(clazz, id);//直接返回的是代理对象

System.out.println(user.getId());//没有发送sql语句到数据库加载

user.getName();//创建真实的User实例,并发送sql语句到数据库中

  • 注意:1.不能判断User=null;代理对象不可能为空

      2.代理对象的限制:和代理关联的session对象,如果session关闭后访问代理则抛异常。session关闭之前访问数据库

  • B:一对多|多对多的延迟加载

fetch = FetchType.Lazy:表示开启延迟加载。读取班级时,不会发出读取学生的SQL语句。等真正使用学生数据时,才会发出一条SQL语句读取学生
    
    fetch = FetchType.EAGER:取消延迟加裁。读取班级会左关联读取学生。
    
    @OneToMany(cascade = { CascadeType.REMOVE },fetch=FetchType.EAGER)
    @JoinColumn(name = "classes_id")
    @OrderBy(value = " studentID desc")
    public List<StudentBean> getStuList() {
        return stuList;
    }

  • C : 多对一|一对一的延迟加裁

    默认是取消延迟加载的。
        
        @ManyToOne(fetch=FetchType.LAZY)
        @JoinColumn(name = "group_id")
        private GroupBean groupBean;

  • 延迟加载带来的问题: session关闭之后,再访问代理对象(延迟加载获取的是代理对象)会抛出“no session”异常。
  1. package action;
  2.  
  3. import java.util.Set;
  4.  
  5. import javassist.compiler.ast.IntConst;
  6.  
  7. import org.hibernate.Session;
  8. import org.hibernate.Transaction;
  9.  
  10. import bean.ClassBean;
  11. import bean.StudentBean;
  12. import util.HibernateSessionUtil;
  13.  
  14. public class Test {
  15. public static void main(String[] args) {
  16.  
  17. ClassBean cla=Test.load(); //当Test.load()执行完毕之后,session就被关闭,这时候再访问代理对象则会抛出异常。 使用session。get就不会出现这个问题
  18. System.out.println(cla.getClassName());
  19. }
  20.  
  21. private static ClassBean load() {
  22.  
  23. ClassBean cla = null;
  24. Session session = null;
  25. Transaction tran = null;
  26.  
  27. try {
  28. session = HibernateSessionUtil.getSession();
  29. tran = session.beginTransaction();
  30.  
  31. cla = (ClassBean) session.load(ClassBean.class, new Integer(2)); //使用延迟加载,获得的是代理对象
  32.  
  33. tran.commit();
  34. return cla;
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. tran.rollback();
  38. } finally {
  39.  
  40. HibernateSessionUtil.closeSession(); //关闭session
  41. }
  42.  
  43. return null;
  44. }
  45. }
  • 橙色字体处代码会出现“no session”异常。
  • 解决延迟加载带来的问题:

    1. 在后台,把前台要显示的数据准备好。(适用于非WEB程序和WEB程序)

    2. 使用延迟加载,又要把Session关掉。而且是前台展现数据的时候,才发给SQL语句。(仅限于WEB程序) 原理:将Session的关闭延迟到页面加载完成之后,才关闭。

3. 在2的的基础上面,将在页面中手工关闭的Session代码,改为自动调用关闭。  过滤器来实现。

    1. 使用第一种方法解决延迟加载带来的问题(在后台,把前台要显示的数据准备好)
  1. package action;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.Set;
  6.  
  7. import javassist.compiler.ast.IntConst;
  8.  
  9. import org.hibernate.Session;
  10. import org.hibernate.Transaction;
  11.  
  12. import bean.ClassBean;
  13. import bean.StudentBean;
  14. import util.HibernateSessionUtil;
  15.  
  16. public class Test {
  17. public static void main(String[] args) {
  18. Map<String, Object> dataMap = Test.load(); // Test.load()方法不再直接返回一个ClassBean对象然后再由这个对象得到StudentBean对象,而是
  19. // Test.load()方法里直接把ClassBean和StudentBean对象直接返回
  20.  
  21. ClassBean classBean = (ClassBean) dataMap.get("classBean");
  22. Set<StudentBean> stuSet=(Set<StudentBean>)dataMap.get("stuSet");
  23. System.out.println(stuSet.size());
  24. }
  25.  
  26. private static Map<String, Object> load() {
  27. Map<String, Object> dataMap = new HashMap<String, Object>();
  28. Session session = null;
  29. Transaction tran = null;
  30.  
  31. try {
  32. session = HibernateSessionUtil.getSession();
  33. tran = session.beginTransaction();
  34.  
  35. ClassBean classBean = (ClassBean) session.get(ClassBean.class,
  36. new Integer(1));
  37. Set<StudentBean> stuSet = classBean.getStuSet();
  38. dataMap.put("classBean", classBean);
  39. stuSet.size(); //这行不能省略,因为classBean.getStuSet();并不会发出sql语句。
  40. dataMap.put("stuSet", stuSet);
  41.  
  42. tran.commit();
  43.  
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. tran.rollback();
  47. } finally {
  48.  
  49. HibernateSessionUtil.closeSession(); // 关闭session
  50. }
  51.  
  52. return dataMap;
  53. }
  54. }

  2.使用第二种方法解决延迟加载带来的问题(是前台展现数据的时候,才发给SQL语句。(仅限于WEB程序))

  • index.jsp
  1. <body>
  2. <a href="<%=path%>/servlet/session_1">1:解决延迟加载,将Session的关闭延迟到jsp页面中</a>
  3. </body>
  • SessionServlet .java
  1. package servlet;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4.  
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. import org.hibernate.Session;
  11.  
  12. import bean.ClassBean;
  13. import util.HibernateSessionUtil;
  14.  
  15. public class SessionServlet extends HttpServlet {
  16.  
  17. public SessionServlet() {
  18. super();
  19. }
  20.  
  21. public void doGet(HttpServletRequest request, HttpServletResponse response)
  22. throws ServletException, IOException {
  23.  
  24. this.doPost(request, response);
  25. }
  26.  
  27. public void doPost(HttpServletRequest request, HttpServletResponse response)
  28. throws ServletException, IOException {
  29.  
  30. request.setCharacterEncoding("UTF-8");
  31. response.setContentType("html;charset=UTF-8");
  32.  
  33. Session session = null;
  34. ClassBean classBean = null;
  35. try {
  36.  
  37. session = HibernateSessionUtil.getSession();
  38. classBean = (ClassBean) session.load(ClassBean.class,
  39. new Integer(1));
  40.  
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. } finally {
  44. //这里不能关闭session,在view1,jsp页面关闭seession
  45. }
  46.  
  47. request.setAttribute("classBean", classBean);
  48.  
  49. request.getRequestDispatcher("/view1.jsp").forward(request, response);
  50.  
  51. }
  52.  
  53. }
  • view1.jsp
  1. <body>
  2. <pre>
  3. <h2>班级信息:</h2>
  4. 班级id:${requestScope.classBean.classId}
  5. 班级名称:${requestScope.classBean.className}
  6.  
  7. <h2>学生信息信息:</h2>
  8. <c:forEach var="student" items="${requestScope.classBean.stuSet}">
  9. 学生id:${student.stuId}
  10. 学生名:${student.stuName}
  11. 班级id:${student.classId}
  12. </c:forEach>
  13. </pre>
  14. <%
  15. HibernateSessionUtil.closeSession(); //在这里关闭session,确保页面取到所需要的数据后再关闭session。
  16. %>
  17. </body>

结果:



  3. 案例三(在2的的基础上面,将在页面中手工关闭的Session代码,改为自动调用关闭。  过滤器来实现。)

  • index.jsp
  1. <body>
  2. <a href="<%=path%>/servlet/session_1">1:在过滤器中统一关闭session</a>
  3. </body>
  • SessionServlet.java
  1. public void doPost(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3.  
  4. request.setCharacterEncoding("UTF-8");
  5. response.setContentType("html;charset=UTF-8");
  6.  
  7. Session session = null;
  8. ClassBean classBean = null;
  9. try {
  10.  
  11. session = HibernateSessionUtil.getSession();
  12. classBean = (ClassBean) session.load(ClassBean.class,
  13. new Integer(1));
  14.  
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. } finally {
  18. //这里不能关闭session,在view1,在过滤器中关闭seession
  19. }
  20.  
  21. request.setAttribute("classBean", classBean);
  22.  
  23. request.getRequestDispatcher("/view1.jsp").forward(request, response);
  24.  
  25. }
  • HibernateFilter.java
  1. package filter;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.Filter;
  6. import javax.servlet.FilterChain;
  7. import javax.servlet.FilterConfig;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.ServletRequest;
  10. import javax.servlet.ServletResponse;
  11.  
  12. import org.hibernate.HibernateException;
  13. import org.hibernate.Session;
  14. import org.hibernate.cfg.Configuration;
  15. import org.hibernate.service.ServiceRegistry;
  16. import org.hibernate.service.ServiceRegistryBuilder;
  17.  
  18. public class HibernateFilter implements Filter {
  19.  
  20. private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
  21. private static org.hibernate.SessionFactory sessionFactory;
  22.  
  23. private static Configuration configuration = new Configuration();
  24. private static ServiceRegistry serviceRegistry;
  25.  
  26. @Override
  27. public void init(FilterConfig arg0) throws ServletException {
  28. try {
  29. configuration.configure();
  30. serviceRegistry = new ServiceRegistryBuilder().applySettings(
  31. configuration.getProperties()).buildServiceRegistry();
  32. sessionFactory = configuration.buildSessionFactory(serviceRegistry);
  33. } catch (Exception e) {
  34. System.err.println("%%%% Error Creating SessionFactory %%%%");
  35. e.printStackTrace();
  36. }
  37. }
  38.  
  39. @Override
  40. public void doFilter(ServletRequest req, ServletResponse res,
  41. FilterChain chain) throws IOException, ServletException {
  42.  
  43. try {
  44. System.out.println("hello");
  45. chain.doFilter(req, res);
  46. } catch (Exception e) {
  47. e.printStackTrace();
  48. } finally {
  49. HibernateFilter.closeSession(); // 在过滤器中统一关闭session
  50. }
  51.  
  52. }
  53.  
  54. @Override
  55. public void destroy() {
  56.  
  57. }
  58.  
  59. public static Session getSession() throws HibernateException {
  60. Session session = (Session) threadLocal.get();
  61.  
  62. if (session == null || !session.isOpen()) {
  63. if (sessionFactory == null) {
  64. rebuildSessionFactory();
  65. }
  66. session = (sessionFactory != null) ? sessionFactory.openSession()
  67. : null;
  68. threadLocal.set(session);
  69. }
  70.  
  71. return session;
  72. }
  73.  
  74. public static void rebuildSessionFactory() {
  75. try {
  76. configuration.configure();
  77. serviceRegistry = new ServiceRegistryBuilder().applySettings(
  78. configuration.getProperties()).buildServiceRegistry();
  79. sessionFactory = configuration.buildSessionFactory(serviceRegistry);
  80. } catch (Exception e) {
  81. System.err.println("%%%% Error Creating SessionFactory %%%%");
  82. e.printStackTrace();
  83. }
  84. }
  85.  
  86. public static void closeSession() throws HibernateException {
  87. Session session = (Session) threadLocal.get();
  88. threadLocal.set(null);
  89.  
  90. if (session != null) {
  91. session.close();
  92. }
  93. }
  94.  
  95. }
  • view1.jsp
  1. <body>
  2. <pre>
  3. <h2>班级信息:</h2>
  4. 班级id:${requestScope.classBean.classId}
  5. 班级名称:${requestScope.classBean.className}
  6.  
  7. <h2>学生信息信息:</h2>
  8. <c:forEach var="student" items="${requestScope.classBean.stuSet}">
  9. 学生id:${student.stuId}
  10. 学生名:${student.stuName}
  11. 班级id:${student.classId}
  12. </c:forEach>
  13. </pre>
  14.  
  15. </body>

结果与上例差不多。


总结:一般使用第二种解决方式来解决延迟加载带来的问题。


D.  属性的延迟加载

  • 大字段的属性上面(Oracle中的Clob和Blog,SQLServer中的TExt和Image2种字段),String,int属性没有必要延迟加载。

1:设定延迟加载的注解  
            // Text映射为string类型
            @Lob
            @Basic(fetch = FetchType.LAZY)
            
            private String content;
            // image映射为字节数组。
            @Lob
            @Basic(fetch = FetchType.LAZY)
            
            private byte[] filedata;

2:要对对象实现类增强机制。
      使用Ant来完成。

  • build.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project name="Hibernate_Project_7" default="instrument" basedir=".">
  3. <property name="lib.dir" value="./WebRoot/WEB-INF/lib" />
  4. <property name="classes.dir" value="./WebRoot/WEB-INF/classes" />
  5.  
  6. <path id="lib.class.path">
  7. <fileset dir="${lib.dir}">
  8. <include name="**/*.jar" />
  9. </fileset>
  10. </path>
  11. <target name="one"></target>
  12. <target name="two"></target>
  13. <target name="instrument">
  14. <taskdef name="instrument"
  15. classname="org.hibernate.tool.instrument.javassist.InstrumentTask">
  16. <classpath path="${classes.dir}" />
  17. <classpath refid="lib.class.path" />
  18. </taskdef>
  19. <instrument verbose="true">
  20. <fileset dir="${classes.dir}/com/bean">
  21. <include name="LobBean.class" /> <!-- 每次修改LobBean的代码后都需要重新运行ant,否则这个ant会失效 -->
  22. </fileset>
  23. </instrument>
  24. </target>
  25. </project>
  • 案例
    1. BlobBEAN.java
  1. package bean;
  2.  
  3. import java.io.Serializable;
  4.  
  5. import javax.persistence.Basic;
  6. import javax.persistence.Column;
  7. import javax.persistence.Entity;
  8. import javax.persistence.FetchType;
  9. import javax.persistence.Id;
  10. import javax.persistence.Lob;
  11. import javax.persistence.Table;
  12.  
  13. @Entity
  14. @Table(name = "t_blob")
  15. public class BlobBEAN implements Serializable {
  16. @Id
  17. @Column(name = "blodid")
  18. private Integer blobId;
  19.  
  20. private String name;
  21.  
  22. // String类型映射为文本大字段
  23.  
  24. @Basic(fetch=FetchType.LAZY)
  25. @Lob
  26. private String content;
  27. // 视频/图片等大字段映射为字节数组
  28.  
  29. @Basic(fetch=FetchType.LAZY)
  30. @Lob
  31. private byte[] image;
  32.  
  33. public String getName() {
  34. return name;
  35. }
  36.  
  37. public void setName(String name) {
  38. this.name = name;
  39. }
  40.  
  41. public BlobBEAN(Integer blobId, String name, String content, byte[] image) {
  42. super();
  43. this.blobId = blobId;
  44. this.name = name;
  45. this.content = content;
  46. this.image = image;
  47. }
  48.  
  49. public BlobBEAN() {
  50. super();
  51. // TODO Auto-generated constructor stub
  52. }
  53.  
  54. public Integer getBlobId() {
  55. return blobId;
  56. }
  57.  
  58. public void setBlobId(Integer blobId) {
  59. this.blobId = blobId;
  60. }
  61.  
  62. public String getContent() {
  63. return content;
  64. }
  65.  
  66. public void setContent(String content) {
  67. this.content = content;
  68. }
  69.  
  70. public byte[] getImage() {
  71. return image;
  72. }
  73.  
  74. public void setImage(byte[] image) {
  75. this.image = image;
  76. }
  77.  
  78. }
  • build.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <project name="hibernate_lazy" default="instrument" basedir="."> <!--default指默认执行的arget -->
  4. <property name="lib.dir" value="./WebRoot/WEB-INF/lib" /> <!--设置lib文件夹的路径 -->
  5. <property name="classes.dir" value="./WebRoot/WEB-INF/classes" /> <!--设置classes文件夹的路径 -->
  6.  
  7. <path id="lib.class.path">
  8. <fileset dir="${lib.dir}">
  9. <include name="**/*.jar" /> <!-- 引用${lib.dir}路径中所有的jar包-->
  10. </fileset>
  11. </path>
  12. <target name="instrument">
  13. <taskdef name="instrument"
  14. classname="org.hibernate.tool.instrument.javassist.InstrumentTask">
  15. <classpath path="${classes.dir}" />
  16. <classpath refid="lib.class.path" />
  17. </taskdef>
  18. <instrument verbose="true">
  19. <fileset dir="${classes.dir}/bean">
  20. <include name="BlobBEAN.class" /> <!-- 每次修改BlobBEAN的代码后都需要重新运行ant,否则这个ant会失效 -->
  21. </fileset>
  22. </instrument>
  23. </target>
  24. </project>
  • Test.java
  1. package action;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8.  
  9. import org.apache.commons.io.IOUtils;
  10. import org.hibernate.Session;
  11. import org.hibernate.Transaction;
  12.  
  13. import bean.BlobBEAN;
  14. import util.HibernateSessionUtil;
  15.  
  16. public class Test {
  17. public static void main(String[] args) {
  18. // Test.save();
  19. Test.load();
  20. }
  21.  
  22. private static void save() {
  23. Session session = null;
  24. Transaction tran = null;
  25.  
  26. try {
  27. session = HibernateSessionUtil.getSession();
  28. tran = session.beginTransaction();
  29.  
  30. BlobBEAN blobBean = new BlobBEAN();
  31. blobBean.setBlobId(1);
  32.  
  33. // Text类型
  34. StringBuffer str = new StringBuffer();
  35. for (int i = 0; i < 10000; i++) {
  36. str.append("abcabc");
  37. }
  38. blobBean.setContent(str.toString());
  39.  
  40. // Image类型
  41. String path = "F:\\123.jpg";
  42. InputStream inputStream = new FileInputStream(new File(path));
  43. byte[] imaBytes = IOUtils.toByteArray(inputStream);
  44. blobBean.setImage(imaBytes);
  45.  
  46. session.save(blobBean);
  47.  
  48. tran.commit();
  49. } catch (Exception e) {
  50. e.printStackTrace();
  51. tran.rollback();
  52. } finally {
  53. HibernateSessionUtil.closeSession();
  54. }
  55.  
  56. }
  57.  
  58. private static void load() {
  59.  
  60. Session session = null;
  61. Transaction tran = null;
  62.  
  63. try {
  64. session = HibernateSessionUtil.getSession();
  65. tran = session.beginTransaction();
  66.  
  67. BlobBEAN blob=(BlobBEAN)session.get(BlobBEAN.class, new Integer(1));
  68. System.out.println(blob.getName());
  69.  
  70. //属性的延迟加载,加载任意一个大字段时,会加载所有的属性延迟字段。
  71. String content=blob.getContent();
  72. OutputStream out=new FileOutputStream(new File("F:\\123.txt"));
  73. IOUtils.write(content, out);
  74.  
  75. out.flush();
  76. out.close();
  77.  
  78. tran.commit();
  79. } catch (Exception e) {
  80. e.printStackTrace();
  81. tran.rollback();
  82. } finally {
  83. HibernateSessionUtil.closeSession();
  84. }
  85.  
  86. }
  87.  
  88. }

(十六)Hibernate中的延迟加载的更多相关文章

  1. J2EE进阶(十六)Hibernate 中getHibernateTemplate()方法使用

    J2EE进阶(十六)Hibernate 中getHibernateTemplate()方法使用   spring 中获得由spring所配置的hibernate的操作对象,然后利用此对象进行,保存,修 ...

  2. Hibernate中的延迟加载及fetch

    Hibernate中的延迟加载 1.类级别的查询策略: lazy  :  true(默认值) false(立即加载) 2.多对一关联的查询策略: lazy:  proxy(默认值) no-proxy ...

  3. 【Hibernate】浅析hibernate中的延迟加载

    1 简介 在使用一些查询方法时,方法执行了,但是并没有立刻发送SQL语句查询数据库.而是在访问对象的getXxx方法时候才触发SQL执行加载对象数据.这种机制就称为延迟加载. 2 优点 延迟加载主要是 ...

  4. 《C++游戏开发》十六 游戏中的寻路算法(二):迷宫&A*算法基础

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/10289253 作者:七十一雾央 新浪微博:http: ...

  5. WPF入门教程系列十六——WPF中的数据绑定(二)

    三.绑定模式 通过上一文章中的示例,学习了简单的绑定方式.在这里的示例,要学习一下绑定的模式,和模式的使用效果. 首先,我们来做一个简单示例,这个示例是根据ListBox中的选中项,去改变TextBl ...

  6. (十六)WebGIS中偏移补偿量引发的问题之探讨

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在上一章里讲解地图平移功能的实现时,我在最后提出了两个问题: ...

  7. JavaWeb学习 (十六)————JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  8. Java学习笔记十六:Java中的构造方法

    Java中的构造方法 1.使用new+构造方法 创建一个新的对象: 2.构造方法是定义在Java类中的一个用来初始化对象的方法: 3.构造方法与类同名且没有返回值: 4.语法格式: public 构造 ...

  9. Android之旅十六 android中各种资源的使用

    android中各种资源的使用: 在android开发中,各种资源的合理使用应该在各自的xml中进行定义,以便反复使用; 字符串资源:strings.xml,xml中引用:@string/XXX,ja ...

随机推荐

  1. markdown文件的基本常用编写语法

    .md即markdown文件 1.标题的几种写法: 第一种:     前面带#号,后面带文字,分别表示h1-h6,上图可以看出,只到h6,而且h1下面会有一条横线,注意,#号后面有空格 第二种:   ...

  2. 使用多个tomcat如何修改端口号

    一.找到tomcat下conf文件夹下server.xml: 二.修改8080端口 三.修改8009端口 四.修改8005端口 修改后同时启动多个tomcat成功.

  3. Flutter移动电商实战 --(39)路由_Fluro的路由配置和静态化

    handler只是单个路由的配置,这节课我们要学习路由的整体配置 整体配置 新建routers.dart文件来做整体配置 detailsHandler就是我们在router_handler里面定义的d ...

  4. SQL-W3School-函数:SQL MID() 函数

    ylbtech-SQL-W3School-函数:SQL MID() 函数 1.返回顶部 1. MID() 函数 MID 函数用于从文本字段中提取字符. SQL MID() 语法 SELECT MID( ...

  5. 不是springboot项目怎么使用内置tomcat

    不是springboot项目怎么使用内置tomcat   解决方法: 1.pom.xml中添加以下依赖 <properties>  <tomcat.version>8.5.23 ...

  6. python中pop(),popitem()的整理

    在python中,列表,字典,有序字典的删除操作有些凌乱,所以决定记录下,以便以后用乱了. 列表: 列表删除有三种方式: l.pop() l.remove() del l[3:8] 已下面的code为 ...

  7. 配置Apache控制浏览器端的缓存的有效期

    这个非常有用的优化,mod_expires可以减少20-30%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求.但要注意更新快的文件不要这么做.这个模块控制服 ...

  8. 【Leetcode_easy】1103. Distribute Candies to People

    problem 1103. Distribute Candies to People solution:没看明白代码... class Solution { public: vector<int ...

  9. 學校 iPad 使用學校google帳號登入Google Drive 提示"裝置政策提醒"的解決方法

    因爲學校iPad 是給學生和老師使用,大多數是不需要設置鎖屏密碼的,然後 Gsuite 默認是開啓 “行動管理服務” 的策略為基本,就是需要設備設置鎖屏密碼以保障資料安全,不那麽容易被竊取. 然後就出 ...

  10. WebGL学习之纹理盒

    原文地址:WebGL学习之纹理盒 我们之前已经学习过二维纹理 gl.TEXTURE_2D,而且还使用它实现了各种效果.但还有一种立方体纹理 gl.TEXTURE_CUBE_MAP,它包含了6个纹理代表 ...