SpringBoot 、Mybatis 与 Websocket 之间的一些问题

SpringBoot 、Mybatis 与 websocket 之间的一些问题,欢迎交流,指正错误。

最近在做一个小项目,用到了SpringBoot 和 websocket,先大概讲一下所遇到的问题。

问题:

前端JS通过websocket和和服务器中的WebSocketServlet 连接,在WebSocketServlet中注入HeatMapService,这时候出现第一个问题,发现注入的HeatMapService为null,也就是说这个时候Spring容器无法将HeatMapService注入;当时没太在意,想着既然Spring无法注入,那就自己实例化 HeatMapService 就好了,然后就傻乎乎的自己实例化了HeatMapService,到这没啥大问题,至少代码跑起来了。下午准备把数据存到数据库时,出现了第二个问题,在HeatMapServiceImpl中想要注入HeatMapMapper时,发现此时注入的HeatMapMapper居然也为null,自己的第一反应是Mybatis和SpringBoot整合时可能出问题了,检查MainApplication.java上有添加@MapperScanner,对应路径也没有写错,那这是为什么无法注入Mapper呢?

服务端websocket中的部分错误代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@ServerEndpoint(value = "/websocket")
@Component
public class WebSocketServlet {
    
    @Autowired
    private HeatMapService heatMapService;

    private boolean flag = false;

    //用来存放每个客户端对应的webSocketSet对象。
    private static CopyOnWriteArraySet<WebSocketServlet> webSocketSet = new CopyOnWriteArraySet<WebSocketServlet>();
    private  Session session=null;

    /**
     * @ClassName: onOpen
     * @Description: 开启连接的操作
     */
    @OnOpen
    public void onOpen(Session session) throws IOException {
       //TODO
    }

}

先解决第二个问题:

FastDFS 无法获取服务端连接资源问题

FastDFS 无法获取服务端连接资源问题 mark~

“com.github.tobato.fastdfs.exception.FdfsConnectException: 无法获取服务端连接资源:can’t create connection to/ip:22122” 的解决方案。

之前在Github上clone了一个微人事项目,然后在本地虚拟机上安装了FastDFS,之前是测试通过了。但是今天再次使用FastDFS时,却报如下错误: 自己在本地搭建FastDFS项目,项目源码在我的GitHub上。

com.github.tobato.fastdfs.exception.FdfsConnectException: 无法获取服务端连接资源:can’t create connection to/192.168.xxx.xxx:22122

现在提供以下3种解决办法:

1. 检查项目application.yml配置文件中的IP地址是否正确(虚拟机的IP地址可能会发生改变)。

application.yml中关于FastDFS的配置:

HTTPS知识积累

HTTPS相关知识小结,欢迎交流,指正错误。

1. HTTP协议中所存在的问题

  • 数据是明文传输,容易被窃听截取
  • 数据的完整性未校验,容易被篡改
  • 没有验证对方身份,存在冒充危险

2. HTTPS协议

为了解决上述HTTP存在的问题,就用到了HTTPS。

LRU算法的实现

LRU算法的实现,欢迎交流,指正错误。

LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。

LRU 算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。

实现方案:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129

import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

/**
 * LRU 手动实现
 * LRU 每次淘汰最近最少使用的缓存value
 *
 * 思路:
 * 1、用HashMap作为缓存,实现添加缓存值和更新值
 * 2、通过一个双向链表记录缓存值的使用记录, 最近有使用的放入表头,最近最少使用的放在表尾
 * 3、HashMap中 key 即为搜索查询使用的 key ; value 是双向链表的结点 node
 */
public class LRUCache {

    private static class Node{
        int key;
        int value;
        Node pre;
        Node next;

        public Node(){

        }

        public Node(int key, int value){
            this.key = key;
            this.value = value;
        }

    }

    private Map<Integer, Node> cache = new HashMap<>();
    private int capacity;
    private int count;
    private Node head, tail;

    public LRUCache(int capacity){
        this.capacity = capacity;
        this.count = 0;
        this.head = new Node();
        this.tail = new Node();

        head.pre = null;
        head.next = tail;
        tail.pre = head;
        tail.next = null;
    }

    /**
     * 从缓存中取值
     * @param key 取值的key
     * @return 若key所对应的值存在则返回,否则返回-1
     */
    public int get(int key){
        Node node = cache.get(key);
        if(node != null){
            moveToHead(node);
            return node.value;
        }else{
            return -1;
        }
    }

    /**
     * 往缓存中添加(更新)值
     * @param key 值对的key
     * @param value 缓存值
     */
    public void put(int key, int value){
        Node node = cache.get(key);
        // 未在缓存中,添加至缓存
        if(node == null){
            node = new Node(key, value);
            cache.put(key, node);
            addNode(node);
            ++count;
            if(count > capacity){ //超出容量
                popTail();
                --count;
            }
        }else{ // 在缓存中, 更新缓存值
            node.value = value;
            moveToHead(node);
        }

    }

    /**
     * 将链表中最后一个节点移除。同时也从缓存中移除
     */
    private void popTail() {
        Node node = tail.pre;
        removeNode(node);
        cache.remove(node.key);
    }

    /**
     * 将节点移动至链表的头部,表示该节点刚添加 或 刚更新 。
     * @param node 节点
     */
    private void moveToHead(Node node) {
        removeNode(node);
        addNode(node);
    }

    /**
     * 添加节点
     * @param node 节点
     */
    private void addNode(Node node) {
        node.pre = head;
        node.next = head.next;
        head.next = node;
        node.next.pre = node;
    }

    /**
     * 移除指定节点
     * @param node 节点
     */
    private void removeNode(Node node) {
        node.pre.next = node.next;
        node.next.pre = node.pre;
    }

}

MySQL 索引(二)

MySQL索引相关知识小结,欢迎交流,指证错误。

0. 前言

MyISAM和InnoDB是MySQL最常用的两个存储引擎,本文将进行详尽的介绍和对比。

0%