2021/7/2 梳理总结

MySQL
1.建表时字段的属性最好带上not null,因为null值很容易在我们对数据的统计中产生错误,而且在表中NULL值是需要额外的空间来存储该值是否为空的信息,不过not null对于性能的提升几乎可以忽略不计。

2.批量插入可以大量减少大数据插入时的时间消耗。
但数据量过大时可能会爆出以下错误。
报错信息:Mysql You can change this value on the server by setting the max_allowed_packet’ variable. Packet for query is too large (6832997 > 1048576). You can change this value on the server by setting the max_allowed_packet’ variable.
用于查询的数据包太大(6832997> 1048576)。 您可以通过设置max_allowed_packet的变量来更改服务器上的这个值。
如果这样还是插入很慢的话可以在插入前先关闭索引,等插入完毕后在打开索引。
关闭表索引:ALTER TABLE user_info DISABLE KEYS;
开启表索引:ALTER TABLE user_info ENABLE KEYS;

排序算法复习以及一道LeetCode全排列题:

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
class Solution {


    public static void main(String[] args) {
        int arr[] = new int[8];
        for(int i = 0; i<arr.length; i++){
            int ranDom = (int)(Math.random()*100);
            arr[i] = ranDom;
        }
        insertSort(arr);
        for(int i:arr){
            System.out.println(i);
        }
    }

    //全排列
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        List<Integer> output = new ArrayList<Integer>();
        for (int num : nums) {
            output.add(num);
        }
        int n = nums.length;
        backtrack(n, output, res, 0);
        return res;
    }

    public void backtrack(int n, List<Integer> output, List<List<Integer>> res, int first) {
        // 所有数都填完了
        if (first == n) {
            res.add(new ArrayList<Integer>(output));
        }
        for (int i = first; i < n; i++) {
            // 动态维护数组
            Collections.swap(output, first, i);
            // 继续递归填下一个数
            backtrack(n, output, res, first + 1);
            // 撤销操作
            Collections.swap(output, first, i);
        }
    }

    //冒泡排序
    public static int[] bubbleSort(int[] arr){
        for(int i = 0 ; i<arr.length ; i++){
            for(int j = 0 ; j<arr.length-1-i ; j++){
                if(arr[j]>arr[j+1]){
                    arr[j+1] = arr[j+1]^arr[j];
                    arr[j] = arr[j+1]^arr[j];
                    arr[j+1] = arr[j]^arr[j+1];
                }
            }
        }
        return arr;
    }

    //选择排序
    public static int[] selectSort(int[] arr){
        for(int i = 0 ; i<arr.length ; i++){
            int minIndex = i;
            for(int j = 0 ; j<arr.length ; j++){
                if(arr[minIndex]>arr[j]){
                    minIndex=j;
                }
                if(minIndex!=i){
                    arr[minIndex] = arr[minIndex]^arr[i];
                    arr[i] = arr[minIndex]^arr[i];
                    arr[minIndex] = arr[i]^arr[minIndex];
                }
            }
        }
        return arr;
    }

    //插入排序
    public static int[] insertSort(int[] arr){
        int temp = 0;
        int index = 0;
        for(int i = 0 ; i<arr.length-1 ; i++){
            temp = arr[i+1];
            index = i;
            while (index>=0&&temp<arr[index]){
                arr[index+1] = arr[index];
                index--;
            }
            arr[index+1] = temp;
        }
        return arr;
    }
    }

EntityManager对象的merge()方法:
1.当保存的是一个瞬时状态的对象(没有id)

那么会创建一个新的对象,将瞬时状态的属性复制给新的对象,
然后持久化这个新的对象,并且返回这个持久话对象的引用。
该持久化对象包含id

2.如果保存的是一个有ID的游离状态的对象,并且上下文session缓存中,和数据库当中都没有 与它id相同的对象。

创建一个新的对象
将改游离对象的属性复制给新对象
持久化该新创建的对象
返回持久化对象的索引

3.如果是拥有id的游离对象,并且session缓存中没有 但数据库中有与之id相同的持久化对象。

将数据库该id的持久化对象查询出来
将改游离对象的属性复制给数据库查询出来的持久化对象
执行update 操作,将改持久化对象更新到数据库
返回持久化对象的索引

4.如果是拥有id的游离对象,并且session缓存中有

将改游离对象的属性复制到缓存当中的持久化对象中
执行update 操作,将改持久化对象更新到数据库
返回持久化对象的索引

***ORM缓存的一些基础知识:***(此处引用于mybatis缓存机制 - 吴振照 - 博客园)

一级缓存的生命周期有多长? MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象,Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用;
如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用;
SqlSession中执行了任何一个update操作(update()、delete()、insert())
,都会清空PerpetualCache对象的数据,但是该对象可以继续使用;

SqlSession 一级缓存的工作流程: 对于某个查询,根据statementId,params,rowBounds来构建一个key值,根据这个key值去缓存Cache中取出对应的key值存储的缓存结果​
判断从Cache中根据特定的key值取的数据数据是否为空,即是否命中;​ 如果命中,则直接将缓存结果返回;​ 如果没命中:
去数据库中查询数据,得到查询结果; 将key和查询到的结果分别作为key,value对存储到Cache中; 将查询结果返回;

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值