0%

需求

  • 查询数据时只需要实体的部分字段
  • 一对多关联@OneToMany的多端一起查出来,并且One 端只需要部分字段
  • 解决一对多关联的循环依赖
  • one 端依然使用懒加载FetchType.LAZY

解决概要

  1. spring data jpa 投影 Projection : 获取部分属性,包括集合类型的属性
  2. @JsonIgnoreProperties("xxx") 注解 : 解决序列化循环引用
  3. 查询出来的仍然是全部字段,只是通过接口映射了部分字段
  4. 使用@NamedEntityGraph, @EntityGraph注解

注意

  1. 声明@EntityGraph后,定义的projection 接口中忘记写获取集合的方法会报错:

    1
    query specified join fetching, but the owner of the fetched association was not present in the select list
Read more »

为什么需要websocket?

http: 只能是客户端向服务端发送请求,服务器无法主动向客户端发送请求

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用“轮询”:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。

轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。

Read more »

内容来自实验楼

日志文件
常见的日志文件
1
2
$ sudo service rsyslog start
$ ll /var/log
日志名称 信息说明
alternatives.log 系统的更新替代信息
apport.log 应用程序崩溃信息记录
apt/history.log 使用 apt-get 安装卸载软件的信息记录
apt/term.log 使用 apt-get 时的具体操作
auth.log 登录认证的 log 信息
boot.log 系统启动时的日志信息
btmp 记录所有失败启动信息
dmesg 内核缓冲信息,在系统启动时,显示屏幕上的与硬件有关的信息
dpkg.log 安装或 dpkg 命令清除软件包的日志
kern.log 内核产生的日志,有助于在定制内核时解决问题
lastlog 记录所有用户的最近信息。这不是一个 ASCII 文件,因此需要用 lastlog 命令查看内容
faillog 用户登录失败信息。此外,错误登录命令也会记录在本文件中
wtmp 包含登录信息。使用 wtmp 可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等
syslog 系统信息记录
Read more »

内容来自实验楼

内建命令与外部命令

什么是内建命令,什么是外部命令呢?这和帮助命令又有什么关系呢?

因为有一些查看帮助的工具在内建命令与外建命令上是有区别对待的。

内建命令实际上是 shell 程序的一部分,其中包含一些比较简单的 Linux 系统命令,这些命令是写在 Bash 源码的 builtins 里面的,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中,并且解析内部命令 shell 不需要创建子进程,所以其执行速度比外部命令快。比如:history、cd、exit 等等。更多的内部命令可以在推荐阅读的文章中查看到。

外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在 /bin/usr/bin/sbin/usr/sbin 等等。比如:ls、vi等。

简单来说就是一个是天生自带的天赋技能,一个是后天得来附加技能。我们可以使用type 命令来区分命令是内建的还是外部的。例如这两个得出的结果是不同的

1
2
3
type exit

type service

得到的是两种结果,若是对 ls 执行 type 命令,你还能得到第三种结果

1
2
3
4
5
6
7
8
# 得到这样的结果说明是内建命令,正如上文所说内建命令都是在 Bash 源码中的 builtins 的 .def 中
xxx is a shell builtin

# 得到这样的结果说明是外部命令,正如上文所说,外部命令在 /usr/bin or /usr/sbin 等等中
xxx is /usr/sbin/xxx

#若是得到 alias 的结果,说明该指令为命令别名所设定的名称;
xxx is an alias for xx --xxx
Read more »

内容来自实验楼

进程的关系

为了能够在出现异常的时候对一个程序做更准确的控制,为了能够在查看进程信息指标的时候作出更准确的判断,我们需要先了解进程的用途与之间的关系。

Read more »

内容来自实验楼

启动顺序

Linux 启动过程主要包括以下 4 个步骤:

1.BIOS 自检:计算机加电后,系统将自动读取 BIOS 中的硬件信息(如:显卡、内存、主板、CPU 等)。然后查找启动设备并设置优先级。接着系统开始自检(POST,power on selftest),若有问题会给出提示信息,没有问题就启动执行硬件初始化,并设置 PnP (Plug-and-Play,即插即用)设备。最后启动驻留在硬盘主引导记录 MBR (MasterBoot Record,主引导分区)中的引导程序 GRUB 或 lilo。

2.GRUB/lilo 引导启动程序:用户通过 GRUB 或 lilo 引导加载程序启动 Linux 系统。引导程序只是将控制权交给内核,此时操作系统并未装入内存。其中,ubuntu 默认 GRUB 为引导加载程序。

3.装载 Linux 内核:最初的引导过程完成后,引导程序开始加载 Linux 内核。ubuntu 的 Linux 内核在 /boot 目录下。

4.系统初始化:Ubuntu 采用的是基于事件的启动管理器 —— Upstart,主要包括 3 个程序(inittelinitrunlevel)和相应配置文件目录(/etc/init/etc/rcN.d/etc/init.d)组成。系统内核首先会启动 init 进程,读取并运行 /etc/init 目录下的启动配置文件,init 启动任务时会读取默认的运行等级(runlevel),然后将结果传递给 upstart 的下一个组件 telinit 中。telinit 通过比较当前 runlevel 与将要进入的 runlevel 之间运行服务的不同,关闭不需要的服务项,启动目前未运行的服务,从而实现系统状态的转换。

初始化阶段完成后,系统就可以准备接受用户登录。

bios :接管主板所有自检工作,掌握系统的启动,部件之间的兼容和程序管理等多项任务。连接软件与硬件设备的“桥梁”。

boot loader :grub 实际上是一个 boot loader,开机管理程序可以指定使用哪个核心文件来开机,并实际载入核心(kernel)到内存当中解压缩与执行, 此时核心就能够开始在内存内活动,并侦测所有硬件信息与载入适当的驱动程序来使整部主机开始运行。

init 进程:系统开始的第一个工作,它是其他所有进程的父进程,一直处在运行状态,并且进程 id 号永远是第一个。作用是读取初始化脚本,完成系统相关管理任务。

Read more »

内容来自实验楼

dpkg 的使用
dpkg 介绍

最初软件的工具的安装只能依靠代码的下载,通过编译安装,随着 Debian 的诞生,出现了 dpkg(Debian Packager) 软件包管理工具,这样使得我们可以直接通过一个安装包直接安装软件,Red Hat 系列受启发开发出了类似的管理工具 rpm。

但是有一些软件的实现依赖于其他软件已有的功能,这样我们就需要首先安装其依赖的软件,不然直接安装会提示依赖错误,而安装的人并不知道有哪些依赖的关系,这样使得安装、升级一个软件变得非常的痛苦,此时 Debian 提出了解决方案,创造了 apt 工具来解决这样的困境,帮我们安装相关的依赖与安装顺序的问题,当然 Red Hat 借鉴 apt 的方式创造了 yum。

从上述中我们可以得出一个很明确的关系,在 Debian 系列的 Linux 操作系统(如 Debian、Ubuntu 等)中会使用 dpkg 与 apt 这样的包管理工具,在 Red Hat 系列的 Linux 操作系统(如 Red Hat、Centos、fe dora 等)会使用 rpm 与 yum 这样的包管理工具。

同时我们了解到先是有了 dpkg 软件包管理工具,然后才有了 apt 软件包管理工具。两者直接具体有什么区别呢?

区别 dpkg apt
离线与在线 dpkg 就像 windows 中的 exe 安装包,我们只需要安装这个包就可以了,属于离线方式,不需要依靠网络 apt 每次安装都需要从网络中获取相关资源,属于在线方式,需要依靠网络
依赖的处理 dpkg 没有处理依赖的能力,若是无依赖安装成功,若是有依赖,必须了解依赖关系,按顺序手动安装相关软件包否则安装失败 apt 能够获取安装软件的所有信息,并自动为你处理其依赖的关系,从而完成软件包的正确安装
工具的实现 dpkg 是用 C、perl 等开发语言实现的工具 apt 虽然也是使用 C++、shell 等开发语言实现的工具,但其底层会调用 dpkg 处理一些安装的工作

相信通过以上的描述大家会对 dpkg 有一定的认识,下面我们将通过一些简短的例子让大家实际感受 dpkg 的使用。而在此之前将为大家介绍一下将会使用到或是常用的参数:

参数 说明
-i 安装指定 deb 包
-R 后面加上目录名,用于安装该目录下的所有 deb 安装包
-r remove,移除某个已安装的软件包
-I 显示 deb 包文件的信息
-s 显示已安装软件的信息
-S 搜索已安装的软件包
-L 显示已安装软件包的目录信息
Read more »

内容来自实验楼

我们经常会需要安排脚本在某个时间或每隔一段时间来运行,如周期性的清理一下/tmp,周期性的去备份一次数据库,周期性的分析日志等等。而且有时候因为某些因素的限制,执行该任务的时间会很尴尬。Linux 调度通过 crontab 与 at 这两个工具。

  • at:处理仅执行一次就结束调度的指令。这次做完以后就没有。
  • crontab:周期性需要执行的任务。
Read more »

内容来自实验楼

备份
概述

几乎所有的备份工具都支持两种不同的备份类型:完整备份和增量备份。

对于完整备份而言,包含的是一个文件系统的全部内容。而增量备份只包括相对于上一次备份之后,发生变化的文件。

Read more »