首页
关于
推荐
搜索定位器
视频解码
电源计划
软件资源
博客友链
搜索
1
开源软件:m3u8.sqlite文件转视频工具
986 阅读
2
欢迎来到我的世界
753 阅读
3
iKuai+Openwrt实现虚拟WAN分流,再也不用担心旁路网关崩了影响全局网络
689 阅读
4
AI:ChatGPT,假如你是Java架构师
662 阅读
5
开源软件:Windows网络驱动器管理工具
629 阅读
资料整理
软件发布
世新家装
萌宠乐园
登录
搜索
标签搜索
Docker
CentOS7
开源软件
Jenkins
MySQL
JVM
世新家装
ZStack
Java
Spring
Shell脚本
docker-compose
iKuai
ESXi
Bean
BeanDefinition
小太阳鹦鹉
欢迎
C#
WPF
卖萌小老头
累计撰写
51
篇文章
累计收到
8
条评论
首页
栏目
资料整理
软件发布
世新家装
萌宠乐园
页面
关于
推荐
搜索定位器
视频解码
电源计划
软件资源
博客友链
搜索到
42
篇与
资料整理
的结果
2023-07-15
NPS部署说明(简要笔记)
NPS部署说明服务端安装包下载https://github.com/ehang-io/nps/releasesCentOS7安装解压并上传,假设上传至nps目录修改配置文件(主要是检查和其他服务的端口冲突)安装启动# 下载服务端安装包 wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_server.tar.gz # 解压 tar -zxvf linux_amd64_server.tar.gz # 移动或改名 mv linux_amd64_server nps # 修改权限和配置文件 cd nps chmod 777 nps cd conf vim nps.conf # 检查对应端口和现有的其他服务是否冲突 # 安装(先到nps执行文件目录) ./nps install ##------- 日志如下: 2023/07/15 10:41:21 copy file ::/root/nps/conf/clients.json to /etc/nps/conf/clients.json 2023/07/15 10:41:21 copy file ::/root/nps/conf/hosts.json to /etc/nps/conf/hosts.json ...... 2023/07/15 10:41:21 You can start with: nps start|stop|restart|uninstall|update or nps-update update anywhere! ##------- 日志 # 启动 ./nps start # 浏览器访问web端口就OK了客户端客户端启动前,需要再服务端新增客户端新增客户端后需要拷贝客户端唯一标识到客户端配置文件启动客户端,通过服务端查看客户端在线从服务端增加隧道和其他配置docker run -d \ --name npc \ --restart=unless-stopped \ --net=host ffdfgdfg/npc \ -server={ip:port} \ -vkey={key} \ -type=tcp
2023年07月15日
283 阅读
0 评论
0 点赞
Linux面试题
1) Linux 中主要有哪几种内核锁?Linux 的同步机制从 2.0 到 2.6 以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux 从单处理器到对称多处理器的过渡;伴随着从非抢占内核到抢占内核的过度。Linux 的锁机制越来越有效,也越来越复杂。Linux 的内核锁主要是自旋锁和信号量。自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的执行线程便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区。Linux 中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。Linux 内核中的同步机制:原子操作、信号量、读写信号量和自旋锁的 API,另外一些同步机制,包括大内核锁、读写锁、大读者锁、RCU (Read-Copy Update,顾名思义就是读-拷贝修改),和顺序锁。2) Linux 中的用户模式和内核模式是什么含意?MS-DOS 等操作系统在单一的 CPU 模式下运行,但是一些类 Unix 的操作系统则使用了双模式,可以有效地实现时间共享。在 Linux 机器上,CPU 要么处于受信任的内核模式,要么处于受限制的用户模式。除了内核本身处于内核模式以外,所有的用户进程都运行在用户模式之中。内核模式的代码可以无限制地访问所有处理器指令集以及全部内存和 I/O 空间。如果用户模式的进程要享有此特权,它必须通过系统调用向设备驱动程序或其他内核模式的代码发出请求。另外,用户模式的代码允许发生缺页,而内核模式的代码则不允许。在 2.4 和更早的内核中,仅仅用户模式的进程可以被上下文切换出局,由其他进程抢占。除非发生以下两种情况,否则内核模式代码可以一直独占 CPU:(1) 它自愿放弃 CPU;(2) 发生中断或异常。2.6 内核引入了内核抢占,大多数内核模式的代码也可以被抢占。3) 怎样申请大块内核内存?在 Linux 内核环境下,申请大块内存的成功率随着系统运行时间的增加而减少,虽然可以通过vmalloc 系列调用申请物理不连续但虚拟地址连续的内存,但毕竟其使用效率不高且在 32 位系统上 vmalloc 的内存地址空间有限。所以,一般的建议是在系统启动阶段申请大块内存,但是其成功的概率也只是比较高而已,而不是 100%。如果程序真的比较在意这个申请的成功与否,只能退用“启动内存”(Boot Memory)。下面就是申请并导出启动内存的一段示例代码:void* x_bootmem = NULL;EXPORT_SYMBOL(x_bootmem);unsigned long x_bootmem_size = 0;EXPORT_SYMBOL(x_bootmem_size);static int __init x_bootmem_setup(char *str){x_bootmem_size = memparse(str, &str);x_bootmem = alloc_bootmem(x_bootmem_size);printk(“Reserved %lu bytes from %p for xn”, x_bootmem_size, x_bootmem);return 1;}__setup(“x-bootmem=”, x_bootmem_setup);可见其应用还是比较简单的,不过利弊总是共生的,它不可避免也有其自身的限制:内存申请代码只能连接进内核,不能在模块中使用。被申请的内存不会被页分配器和 slab 分配器所使用和统计,也就是说它处于系统的可见内存之外,即使在将来的某个地方你释放了它。一般用户只会申请一大块内存,如果需要在其上实现复杂的内存管理则需要自己实现。在不允许内存分配失败的场合,通过启动内存预留内存空间将是我们唯一的选择。4) 用户进程间通信主要哪几种方式?(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令 mkfifo 或系统调用 mkfifo 来创建。(3)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux 除了支持 Unix 早期信号语义函数 sigal外,还支持语义符合 Posix.1 标准的信号函数 sigaction(实际上,该函数是基于 BSD 的,BSD为了实现可靠信号机制,又能够统一对外接口,用 sigaction 函数重新实现了 signal 函数)。(4)消息(Message)队列:消息队列是消息的链接表,包括 Posix 消息队列 system V 消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺(5)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用 IPC 形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。(6)信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。(7)套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由 Unix 系统的 BSD 分支开发出来的,但现在一般可以移植到其它类 Unix 系统上:Linux 和System V 的变种都支持套接字。5) 通过伙伴系统申请内核内存的函数有哪些?在物理页面管理上实现了基于区的伙伴系统(zone based buddy system)。对不同区的内存使用单独的伙伴系统(buddy system)管理,而且独立地监控空闲页。相应接口alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。6) Linux 虚拟文件系统的关键数据结构有哪些?(至少写出四个)struct super_block,struct inode,struct file,struct dentry;7) 对文件或设备的操作函数保存在那个数据结构中?struct file_operations8) Linux 中的文件包括哪些?执行文件,普通文件,目录文件,链接文件和设备文件,管道文件。9) 创建进程的系统调用有那些?clone(),fork(),vfork();系统调用服务例程:sys_clone,sys_fork,sys_vfork;10) 调用 schedule()进行进程切换的方式有几种?1.系统调用 do_fork();2.定时中断 do_timer();3.唤醒进程 wake_up_process4.改变进程的调度策略 setscheduler();5.系统调用礼让 sys_sched_yield();11) Linux 调度程序是根据进程的动态优先级还是静态优先级来调度进程的?Liunx 调度程序是根据根据进程的动态优先级来调度进程的,但是动态优先级又是根据静态优先级根据算法计算出来的,两者是两个相关联的值。因为高优先级的进程总是比低优先级的进程先被调度,为防止多个高优先级的进程占用 CPU 资源,导致其他进程不能占有 CPU,所以引用动态优先级概念12) 进程调度的核心数据结构是哪个?struct runqueue13) 如何加载、卸载一个模块?insmod 加载,rmmod 卸载14) 模块和应用程序分别运行在什么空间?模块运行在内核空间,应用程序运行在用户空间15) Linux 中的浮点运算由应用程序实现还是内核实现?应用程序实现,Linux 中的浮点运算是利用数学库函数实现的,库函数能够被应用程序链接后调用,不能被内核链接调用。这些运算是在应用程序中运行的,然后再把结果反馈给系统。Linux 内核如果一定要进行浮点运算,需要在建立内核时选上 math-emu,使用软件模拟计算浮点运算,据说这样做的代价有两个:用户在安装驱动时需要重建内核,可能会影响到其他的应用程序,使得这些应用程序在做浮点运算的时候也使用 math-emu,大大的降低了效率。16) 模块程序能否使用可链接的库函数?模块程序运行在内核空间,不能链接库函数。17) TLB 中缓存的是什么内容?TLB,页表缓存,当线性地址被第一次转换成物理地址的时候,将线性地址和物理地址的对应放到 TLB 中,用于下次访问这个线性地址时,加快转换速度。18) Linux 中有哪几种设备?字符设备和块设备。网卡是例外,他不直接与设备文件对应,mknod 系统调用用来创建设备文件。19) 字符设备驱动程序的关键数据结构是哪个?字符设备描述符 struct cdev,cdev_alloc()用于动态的分配 cdev 描述符,cdev_add()用于注册一个 cdev 描述符,cdev 包含一个 struct kobject 类型的数据结构它是核心的数据结构20) 设备驱动程序包括哪些功能函数?open(),read(),write(),llseek(),realse();21) 如何唯一标识一个设备?Linux 使用一个设备编号来唯一的标示一个设备,设备编号分为:主设备号和次设备号,一般主设备号标示设备对应的驱动程序,次设备号对应设备文件指向的设备,在内核中使用 dev_t 来表示设备编号,一般它是 32 位长度,其中 12 位用于表示主设备号,20 位用于表示次设备号,利用 MKDEV(int major,int minor);用于生成一个 dev_t 类型的对象。22) Linux 通过什么方式实现系统调用?靠软件中断实现的,首先,用户程序为系统调用设置参数,其中一个编号是系统调用编号,参数设置完成后,程序执行系统调用指令,x86 上的软中断是有 int 产生的,这个指令会导致一个异常,产生一个事件,这个事件会导致处理器跳转到内核态并跳转到一个新的地址。并开始处理那里的异常处理程序,此时的异常处理就是系统调用程序。23) Linux 软中断和工作队列的作用是什么?Linux 中的软中断和工作队列是中断处理。1.软中断一般是“可延迟函数”的总称,它不能睡眠,不能阻塞,它处于中断上下文,不能进城切换,软中断不能被自己打断,只能被硬件中断打断(上半部),可以并发的运行在多个 CPU 上。所以软中断必须设计成可重入的函数,因此也需要自旋锁来保护其数据结构。2.工作队列中的函数处在进程上下文中,它可以睡眠,也能被阻塞,能够在不同的进程间切换。已完成不同的工作。可延迟函数和工作队列都不能访问用户的进程空间,可延时函数在执行时不可能有任何正在运行的进程,工作队列的函数有内核进程执行,他不能访问用户空间地址。
2023年05月23日
299 阅读
0 评论
0 点赞
MySQL55题及答案
1、一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 Mysql 重启,再 insert 一条记录,这条记录的 ID 是 18 还是 15 ?(1)如果表的类型是 MyISAM,那么是 18因为 MyISAM 表会把自增主键的最大 ID 记录到数据文件里,重启 MySQL 自增主键的最大ID 也不会丢失(2)如果表的类型是 InnoDB,那么是 15InnoDB 表只是把自增主键的最大 ID 记录到内存中,所以重启数据库或者是对表进行OPTIMIZE 操作,都会导致最大 ID 丢失2、Mysql 的技术特点是什么?Mysql 数据库软件是一个客户端或服务器系统,其中包括:支持各种客户端程序和库的多线程 SQL 服务器、不同的后端、广泛的应用程序编程接口和管理工具。3、Heap 表是什么?HEAP 表存在于内存中,用于临时高速存储。BLOB 或 TEXT 字段是不允许的只能使用比较运算符=,<,>,=>,= <HEAP 表不支持 AUTO_INCREMENT索引不可为 NULL4、Mysql 服务器默认端口是什么?Mysql 服务器的默认端口是 3306。5、与 Oracle 相比,Mysql 有什么优势?Mysql 是开源软件,随时可用,无需付费。Mysql 是便携式的带有命令提示符的 GUI。使用 Mysql 查询浏览器支持管理6、如何区分 FLOAT 和 DOUBLE?以下是 FLOAT 和 DOUBLE 的区别:浮点数以 8 位精度存储在 FLOAT 中,并且有四个字节。浮点数存储在 DOUBLE 中,精度为 18 位,有八个字节。7、区分 CHAR_LENGTH 和 LENGTH?CHAR_LENGTH 是字符数,而 LENGTH 是字节数。Latin 字符的这两个数据是相同的,但是对于 Unicode 和其他编码,它们是不同的。8、请简洁描述 Mysql 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?SQL 标准定义的四个隔离级别为:read uncommited :读到未提交数据read committed:脏读,不可重复读repeatable read:可重读serializable :串行事物9、在 Mysql 中 ENUM 的用法是什么?ENUM 是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用。Create table size(name ENUM('Smail,'Medium','Large');10、如何定义 REGEXP?REGEXP 是模式匹配,其中匹配模式在搜索值的任何位置。11、CHAR 和 VARCHAR 的区别?以下是 CHAR 和 VARCHAR 的区别:CHAR 和 VARCHAR 类型在存储和检索方面有所不同CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255当 CHAR 值被存储时,它们被用空格填充到特定长度,检索 CHAR 值时需删除尾随空格。12、列的字符串类型可以是什么?字符串类型是:SETBLOBENUMCHARTEXTVARCHAR13、如何获取当前的 Mysql 版本?SELECT VERSION();用于获取当前 Mysql 的版本。14、Mysql 中使用什么存储引擎?存储引擎称为表类型,数据使用各种技术存储在文件中。技术涉及:Storage mechanismLocking levelsIndexingCapabilities and functions.15、Mysql 驱动程序是什么?以下是 Mysql 中可用的驱动程序:PHP 驱动程序JDBC 驱动程序ODBC 驱动程序CWRAPPERPYTHON 驱动程序PERL 驱动程序RUBY 驱动程序CAP11PHP 驱动程序Ado.net5.mxj16、TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么?创建表时 TIMESTAMP 列用 Zero 更新。只要表中的其他字段发生更改,UPDATECURRENT_TIMESTAMP 修饰符就将时间戳字段更新为当前时间。17、主键和候选键有什么区别?表格的每一行都由主键唯一标识,一个表只有一个主键。主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。18、如何使用 Unix shell 登录 Mysql?我们可以通过以下命令登录:[mysql dir]/bin/mysql -h hostname -u19、 myisamchk 是用来做什么的?它用来压缩 MyISAM 表,这减少了磁盘或内存使用。20、MYSQL 数据库服务器性能分析的方法命令有哪些?21、如何控制 HEAP 表的最大尺寸?Heal 表的大小可通过称为 max_heap_table_size 的 Mysql 配置变量来控制。22、MyISAM Static 和 MyISAM Dynamic 有什么区别?在 MyISAM Static 上的所有字段有固定宽度。动态 MyISAM 表将具有像 TEXT,BLOB 等字段,以适应不同长度的数据类型。点击这里有一套最全阿里面试题总结。MyISAM Static 在受损情况下更容易恢复。23、federated 表是什么?federated 表,允许访问位于其他服务器数据库上的表。24、如果一个表有一列定义为 TIMESTAMP,将发生什么?每当行被更改时,时间戳字段将获取当前时间戳。25、列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况?它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。26、怎样才能找出最后一次插入时分配了哪个自动增量?LAST_INSERT_ID 将返回由 Auto_increment 分配的最后一个值,并且不需要指定表名称。27、你怎么看到为表格定义的所有索引?索引是通过以下方式为表格定义的:SHOW INDEX FROM28.、LIKE 声明中的%和_是什么意思?%对应于 0 个或更多字符,_只是 LIKE 语句中的一个字符。29、如何在 Unix 和 Mysql 时间戳之间进行转换?UNIX_TIMESTAMP 是从 Mysql 时间戳转换为 Unix 时间戳的命令FROM_UNIXTIME 是从 Unix 时间戳转换为 Mysql 时间戳的命令30、列对比运算符是什么?在 SELECT 语句的列比较中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR 或 LIKE 运算符。31、我们如何得到受查询影响的行数?行数可以通过以下代码获得:SELECT COUNT(user_id)FROM users;32、Mysql 查询是否区分大小写?不区分SELECT VERSION(), CURRENT_DATE;SeLect version(), current_date;seleCt vErSiOn(), current_DATE;所有这些例子都是一样的,Mysql 不区分大小写。33.、LIKE 和 REGEXP 操作有什么区别?LIKE 和 REGEXP 运算符用于表示^和%。SELECT * FROM employee WHERE emp_name REGEXP "^b";SELECT * FROM employee WHERE emp_name LIKE "%b";34.、BLOB 和 TEXT 有什么区别?BLOB 是一个二进制对象,可以容纳可变数量的数据。有四种类型的 BLOB -TINYBLOBBLOBMEDIUMBLOB 和LONGBLOB它们只能在所能容纳价值的最大长度上有所不同。TEXT 是一个不区分大小写的 BLOB。四种 TEXT 类型TINYTEXTTEXTMEDIUMTEXT 和LONGTEXT它们对应于四种 BLOB 类型,并具有相同的最大长度和存储要求。BLOB 和 TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小写,对 TEXT值不区分大小写。35、mysql_fetch_array 和 mysql_fetch_object 的区别是什么?以下是 mysql_fetch_array 和 mysql_fetch_object 的区别:mysql_fetch_array() - 将结果行作为关联数组或来自数据库的常规数组返回。mysql_fetch_object - 从数据库返回结果行作为对象。36、我们如何在 mysql 中运行批处理模式?以下命令用于在批处理模式下运行:mysql;mysql mysql.out37、MyISAM 表格将在哪里存储,并且还提供其存储格式?每个 MyISAM 表格以三种格式存储在磁盘上:·“.frm”文件存储表定义·数据文件具有“.MYD”(MYData)扩展名索引文件具有“.MYI”(MYIndex)扩展名38.、Mysql 中有哪些不同的表格?共有 5 种类型的表格:MyISAMHeapMergeINNODBISAMMyISAM 是 Mysql 的默认存储引擎。39、ISAM 是什么?ISAM 简称为索引顺序访问方法。它是由 IBM 开发的,用于在磁带等辅助存储系统上存储和检索数据。40、InnoDB 是什么?lnnoDB 是一个由 Oracle 公司开发的 Innobase Oy 事务安全存储引擎。41、Mysql 如何优化 DISTINCT?DISTINCT 在所有列上转换为 GROUP BY,并与 ORDER BY 子句结合使用。1SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;42、如何输入字符为十六进制数字?如果想输入字符为十六进制数字,可以输入带有单引号的十六进制数字和前缀(X),或者只用(Ox)前缀输入十六进制数字。如果表达式上下文是字符串,则十六进制数字串将自动转换为字符串。43、如何显示前 50 行?在 Mysql 中,使用以下代码查询显示前 50 行:SELECT*FROMLIMIT 0,50;44、可以使用多少列创建索引?任何标准表最多可以创建 16 个索引列。45、NOW()和 CURRENT_DATE()有什么区别?NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。CURRENT_DATE()仅显示当前年份,月份和日期。46、什么样的对象可以使用 CREATE 语句创建?以下对象是使用 CREATE 语句创建的:DATABASEEVENTFUNCTIONINDEXPROCEDURETABLETRIGGERUSERVIEW47、Mysql 表中允许有多少个 TRIGGERS?在 Mysql 表中允许有六个触发器,如下:BEFORE INSERTAFTER INSERTBEFORE UPDATEAFTER UPDATEBEFORE DELETEAFTER DELETE48、什么是非标准字符串类型?以下是非标准字符串类型:TINYTEXTTEXTMEDIUMTEXTLONGTEXT49、什么是通用 SQL 函数?CONCAT(A, B) - 连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段合并为一个字段。FORMAT(X, D)- 格式化数字 X 到 D 有效数字。CURRDATE(), CURRTIME()- 返回当前日期或时间。NOW() - 将当前日期和时间作为一个值返回。MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() - 从日期值中提取给定数据。HOUR(),MINUTE(),SECOND() - 从时间值中提取给定数据。DATEDIFF(A,B) - 确定两个日期之间的差异,通常用于计算年龄SUBTIMES(A,B) - 确定两次之间的差异。FROMDAYS(INT) - 将整数天数转换为日期值。50、解释访问控制列表ACL(访问控制列表)是与对象关联的权限列表。这个列表是 Mysql 服务器安全模型的基础,它有助于排除用户无法连接的问题。Mysql 将 ACL(也称为授权表)缓存在内存中。当用户尝试认证或运行命令时,Mysql 会按照预定的顺序检查 ACL 的认证信息和权限。51、MYSQL 支持事务吗?在缺省模式下,MYSQL 是 autocommit 模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql 是不支持事务的。但是如果你的 MYSQL 表类型是使用 InnoDB Tables 或 BDB tables 的话,你的 MYSQL 就可以使用事务处理,使用 SET AUTOCOMMIT=0 就可以使 MYSQL 允许在非 autocommit 模式,在非autocommit 模式下,你必须使用 COMMIT 来提交你的更改,或者用 ROLLBACK 来回滚你的更改。示例如下:一START TRANSACTION;SELECT @A:=SUM(salary) FROM table1 WHERE type=1;UPDATE table2 SET summmary=@A WHERE type=1;COMMIT;52、mysql 里记录货币用什么字段类型好NUMERIC 和 DECIMAL 类型被 Mysql 实现为同样的类型,这在 SQL92 标准允许。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定;点击这里有一套最全阿里面试题总结。例如:salary DECIMAL(9,2)在这个例子中,9(precision)代表将被用于存储值的总的小数位数,而 2(scale)代表将被用于存储小数点后的位数。因此,在这种情况下,能被存储在 salary 列中的值的范围是从-9999999.99 到 9999999.99。在 ANSI/ISO SQL92 中,句法 DECIMAL(p)等价于 DECIMAL(p,0)。同样,句法 DECIMAL 等价于 DECIMAL(p,0),这里实现被允许决定值 p。Mysql 当前不支持DECIMAL/NUMERIC 数据类型的这些变种形式的任一种。这一般说来不是一个严重的问题,因为这些类型的主要益处得自于明显地控制精度和规模的能力。DECIMAL 和 NUMERIC 值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。一个字符用于值的每一位、小数点(如果 scale>0)和“-”符号(对于负值)。如果 scale 是 0,DECIMAL 和 NUMERIC 值不包含小数点或小数部分。DECIMAL 和 NUMERIC 值得最大的范围与 DOUBLE 一样,但是对于一个给定的 DECIMAL 或NUMERIC 列,实际的范围可由制由给定列的 precision 或 scale 限制。当这样的列赋给了小数点后面的位超过指定 scale 所允许的位的值,该值根据 scale 四舍五入。当一个 DECIMAL 或 NUMERIC 列被赋给了其大小超过指定(或缺省的)precision 和 scale 隐含的范围的值,Mysql 存储表示那个范围的相应的端点值。我希望本文可以帮助你提升技术水平。那些,感觉学的好难,甚至会令你沮丧的人,别担心,我认为,如果你愿意试一试本文介绍的几点,会向前迈进,克服这种感觉。这些要点也许对你不适用,但你会明确一个重要的道理:接受自己觉得受困这个事实是摆脱这个困境的第一步。53、MYSQL 数据表在什么情况下容易损坏?服务器突然断电导致数据文件损坏。强制关机,没有先关闭 mysql 服务等。54、mysql 有关权限的表都有哪几个?Mysql 服务器通过权限表来控制用户对数据库的访问,权限表存放在 mysql 数据库里,由mysql_install_db 脚本初始化。这些权限表分别 user,db,table_priv,columns_priv 和host。55、Mysql 中有哪几种锁?MyISAM 支持表锁,InnoDB 支持表锁和行锁,默认为行锁表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高
2023年05月23日
297 阅读
0 评论
0 点赞
MyBatis框架
2023年05月23日
375 阅读
0 评论
0 点赞
2023-05-23
暂无简介
JVM指令手册
栈和局部变量操作将常量压入栈的指令aconst_null 将null对象引用压入栈iconst_m1 将int类型常量-1压入栈iconst_0 将int类型常量0压入栈iconst_1 将int类型常量1压入操作数栈iconst_2 将int类型常量2压入栈iconst_3 将int类型常量3压入栈iconst_4 将int类型常量4压入栈iconst_5 将int类型常量5压入栈lconst_0 将long类型常量0压入栈lconst_1 将long类型常量1压入栈fconst_0 将float类型常量0压入栈fconst_1 将float类型常量1压入栈dconst_0 将double类型常量0压入栈dconst_1 将double类型常量1压入栈bipush 将一个8位带符号整数压入栈sipush 将16位带符号整数压入栈ldc 把常量池中的项压入栈ldc_w 把常量池中的项压入栈(使用宽索引)ldc2_w 把常量池中long类型或者double类型的项压入栈(使用宽索引)从栈中的局部变量中装载值的指令iload 从局部变量中装载int类型值lload 从局部变量中装载long类型值fload 从局部变量中装载float类型值dload 从局部变量中装载double类型值aload 从局部变量中装载引用类型值(refernce)iload_0 从局部变量0中装载int类型值iload_1 从局部变量1中装载int类型值iload_2 从局部变量2中装载int类型值iload_3 从局部变量3中装载int类型值lload_0 从局部变量0中装载long类型值lload_1 从局部变量1中装载long类型值lload_2 从局部变量2中装载long类型值lload_3 从局部变量3中装载long类型值fload_0 从局部变量0中装载float类型值fload_1 从局部变量1中装载float类型值fload_2 从局部变量2中装载float类型值fload_3 从局部变量3中装载float类型值dload_0 从局部变量0中装载double类型值dload_1 从局部变量1中装载double类型值dload_2 从局部变量2中装载double类型值dload_3 从局部变量3中装载double类型值aload_0 从局部变量0中装载引用类型值aload_1 从局部变量1中装载引用类型值aload_2 从局部变量2中装载引用类型值aload_3 从局部变量3中装载引用类型值iaload 从数组中装载int类型值laload 从数组中装载long类型值faload 从数组中装载float类型值daload 从数组中装载double类型值aaload 从数组中装载引用类型值baload 从数组中装载byte类型或boolean类型值caload 从数组中装载char类型值saload 从数组中装载short类型值将栈中的值存入局部变量的指令istore 将int类型值存入局部变量lstore 将long类型值存入局部变量fstore 将float类型值存入局部变量dstore 将double类型值存入局部变量astore 将将引用类型或returnAddress类型值存入局部变量istore_0 将int类型值存入局部变量0istore_1 将int类型值存入局部变量1istore_2 将int类型值存入局部变量2istore_3 将int类型值存入局部变量3lstore_0 将long类型值存入局部变量0lstore_1 将long类型值存入局部变量1lstore_2 将long类型值存入局部变量2lstore_3 将long类型值存入局部变量3fstore_0 将float类型值存入局部变量0fstore_1 将float类型值存入局部变量1fstore_2 将float类型值存入局部变量2fstore_3 将float类型值存入局部变量3dstore_0 将double类型值存入局部变量0dstore_1 将double类型值存入局部变量1dstore_2 将double类型值存入局部变量2dstore_3 将double类型值存入局部变量3astore_0 将引用类型或returnAddress类型值存入局部变量0astore_1 将引用类型或returnAddress类型值存入局部变量1astore_2 将引用类型或returnAddress类型值存入局部变量2astore_3 将引用类型或returnAddress类型值存入局部变量3iastore 将int类型值存入数组中lastore 将long类型值存入数组中fastore 将float类型值存入数组中dastore 将double类型值存入数组中aastore 将引用类型值存入数组中bastore 将byte类型或者boolean类型值存入数组中castore 将char类型值存入数组中sastore 将short类型值存入数组中wide指令wide 使用附加字节扩展局部变量索引通用(无类型)栈操作nop 不做任何操作pop 弹出栈顶端一个字长的内容pop2 弹出栈顶端两个字长的内容dup 复制栈顶部一个字长内容dup_x1 复制栈顶部一个字长的内容,然后将复制内容及原来弹出的两个字长的内容压入栈dup_x2 复制栈顶部一个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈dup2 复制栈顶部两个字长内容dup2_x1 复制栈顶部两个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈dup2_x2 复制栈顶部两个字长的内容,然后将复制内容及原来弹出的四个字长的内容压入栈swap 交换栈顶部两个字长内容类型转换i2l 把int类型的数据转化为long类型i2f 把int类型的数据转化为float类型i2d 把int类型的数据转化为double类型l2i 把long类型的数据转化为int类型l2f 把long类型的数据转化为float类型l2d 把long类型的数据转化为double类型f2i 把float类型的数据转化为int类型f2l 把float类型的数据转化为long类型f2d 把float类型的数据转化为double类型d2i 把double类型的数据转化为int类型d2l 把double类型的数据转化为long类型d2f 把double类型的数据转化为float类型i2b 把int类型的数据转化为byte类型i2c 把int类型的数据转化为char类型i2s 把int类型的数据转化为short类型整数运算iadd 执行int类型的加法ladd 执行long类型的加法isub 执行int类型的减法lsub 执行long类型的减法imul 执行int类型的乘法lmul 执行long类型的乘法idiv 执行int类型的除法ldiv 执行long类型的除法irem 计算int类型除法的余数lrem 计算long类型除法的余数ineg 对一个int类型值进行取反操作lneg 对一个long类型值进行取反操作iinc 把一个常量值加到一个int类型的局部变量上逻辑运算移位操作ishl 执行int类型的向左移位操作lshl 执行long类型的向左移位操作ishr 执行int类型的向右移位操作lshr 执行long类型的向右移位操作iushr 执行int类型的向右逻辑移位操作lushr 执行long类型的向右逻辑移位操作按位布尔运算iand 对int类型值进行“逻辑与”操作land 对long类型值进行“逻辑与”操作ior 对int类型值进行“逻辑或”操作lor 对long类型值进行“逻辑或”操作ixor 对int类型值进行“逻辑异或”操作lxor 对long类型值进行“逻辑异或”操作浮点运算fadd 执行float类型的加法dadd 执行double类型的加法fsub 执行float类型的减法dsub 执行double类型的减法fmul 执行float类型的乘法dmul 执行double类型的乘法fdiv 执行float类型的除法ddiv 执行double类型的除法frem 计算float类型除法的余数drem 计算double类型除法的余数fneg 将一个float类型的数值取反dneg 将一个double类型的数值取反对象和数组对象操作指令new 创建一个新对象checkcast 确定对象为所给定的类型getfield 从对象中获取字段putfield 设置对象中字段的值getstatic 从类中获取静态字段putstatic 设置类中静态字段的值instanceof 判断对象是否为给定的类型数组操作指令newarray 分配数据成员类型为基本上数据类型的新数组anewarray 分配数据成员类型为引用类型的新数组arraylength 获取数组长度multianewarray 分配新的多维数组控制流条件分支指令ifeq 如果等于0,则跳转ifne 如果不等于0,则跳转iflt 如果小于0,则跳转ifge 如果大于等于0,则跳转ifgt 如果大于0,则跳转ifle 如果小于等于0,则跳转if_icmpcq 如果两个int值相等,则跳转if_icmpne 如果两个int类型值不相等,则跳转if_icmplt 如果一个int类型值小于另外一个int类型值,则跳转if_icmpge 如果一个int类型值大于或者等于另外一个int类型值,则跳转if_icmpgt 如果一个int类型值大于另外一个int类型值,则跳转if_icmple 如果一个int类型值小于或者等于另外一个int类型值,则跳转ifnull 如果等于null,则跳转ifnonnull 如果不等于null,则跳转if_acmpeq 如果两个对象引用相等,则跳转if_acmpnc 如果两个对象引用不相等,则跳转比较指令lcmp 比较long类型值fcmpl 比较float类型值(当遇到NaN时,返回-1)fcmpg 比较float类型值(当遇到NaN时,返回1)dcmpl 比较double类型值(当遇到NaN时,返回-1)dcmpg 比较double类型值(当遇到NaN时,返回1)无条件转移指令goto 无条件跳转goto_w 无条件跳转(宽索引)表跳转指令tableswitch 通过索引访问跳转表,并跳转lookupswitch 通过键值匹配访问跳转表,并执行跳转操作异常athrow 抛出异常或错误finally子句jsr 跳转到子例程jsr_w 跳转到子例程(宽索引)rct 从子例程返回方法调用与返回方法调用指令invokcvirtual 运行时按照对象的类来调用实例方法invokespecial 根据编译时类型来调用实例方法invokestatic 调用类(静态)方法invokcinterface 调用接口方法方法返回指令ireturn 从方法中返回int类型的数据lreturn 从方法中返回long类型的数据freturn 从方法中返回float类型的数据dreturn 从方法中返回double类型的数据areturn 从方法中返回引用类型的数据return 从方法中返回,返回值为void线程同步montiorenter 进入并获取对象监视器monitorexit 释放并退出对象监视器JVM指令助记符变量到操作数栈:iload,iload_,lload,lload_,fload,fload_,dload,dload_,aload,aload_操作数栈到变量:istore,istore_,lstore,lstore_,fstore,fstore_,dstore,dstor_,astore,astore_常数到操作数栈:bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,iconst_,lconst_,fconst_,dconst_加:iadd,ladd,fadd,dadd减:isub,lsub,fsub,dsub乘:imul,lmul,fmul,dmul除:idiv,ldiv,fdiv,ddiv余数:irem,lrem,frem,drem取负:ineg,lneg,fneg,dneg移位:ishl,lshr,iushr,lshl,lshr,lushr按位或:ior,lor按位与:iand,land按位异或:ixor,lxor类型转换:i2l,i2f,i2d,l2f,l2d,f2d(放宽数值转换)i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l,d2f(缩窄数值转换)创建类实便:new创建新数组:newarray,anewarray,multianwarray访问类的域和类实例域:getfield,putfield,getstatic,putstatic把数据装载到操作数栈:baload,caload,saload,iaload,laload,faload,daload,aaload从操作数栈存存储到数组:bastore,castore,sastore,iastore,lastore,fastore,dastore,aastore获取数组长度:arraylength检相类实例或数组属性:instanceof,checkcast操作数栈管理:pop,pop2,dup,dup2,dup_xl,dup2_xl,dup_x2,dup2_x2,swap有条件转移:ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,if_icmpeq,if_icmpene,if_icmplt,if_icmpgt,if_icmple,if_icmpge,if_acmpeq,if_acmpne,lcmp,fcmplfcmpg,dcmpl,dcmpg复合条件转移:tableswitch,lookupswitch无条件转移:goto,goto_w,jsr,jsr_w,ret调度对象的实便方法:invokevirtual调用由接口实现的方法:invokeinterface调用需要特殊处理的实例方法:invokespecial调用命名类中的静态方法:invokestatic方法返回:ireturn,lreturn,freturn,dreturn,areturn,return异常:athrowfinally关键字的实现使用:jsr,jsr_w,ret
2023年02月11日
321 阅读
0 评论
0 点赞
JVM内存模型剖析与优化
JDK体系结构Java语言的跨平台特性JVM整体结构及内存模型补充一个问题:在minor gc过程中对象挪动后,引用如何修改?对象在堆内部挪动的过程其实是复制,原有区域对象还在,一般不直接清理,JVM内部清理过程只是将对象分配指针移动到区域的头位置即可,比如扫描s0区域,扫到gcroot引用的非垃圾对象是将这些对象复制到s1或老年代,最后扫描完了将s0区域的对象分配指针移动到区域的起始位置即可,s0区域之前对象并不直接清理,当有新对象分配了,原有区域里的对象也就被清除了。minor gc在根扫描过程中会记录所有被扫描到的对象引用(在年轻代这些引用很少,因为大部分都是垃圾对象不会扫描到),如果引用的对象被复制到新地址了,最后会一并更新引用指向新地址。这里面内部算法比较复杂,感兴趣可以参考R大的这篇文章:https://www.zhihu.com/question/42181722/answer/145085437https://hllvm-group.iteye.com/group/topic/39376#post-257329JVM内存参数设置Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里):java -Xms2048M -Xmx2048M -Xmn1024M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -jar microservice-eureka-server.jar-Xss:每个线程的栈大小-Xms:设置堆的初始可用大小,默认物理内存的1/64 -Xmx:设置堆的最大可用大小,默认物理内存的1/4-Xmn:新生代大小-XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。-XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。关于元空间的JVM参数有两个:-XX:MetaspaceSize=N和 -XX:MaxMetaspaceSize=N-XX:MaxMetaspaceSize: 设置元空间最大值, 默认是-1, 即不限制, 或者说只受限于本地内存大小。-XX:MetaspaceSize: 指定元空间触发Fullgc的初始阈值(元空间无固定初始大小), 以字节为单位,默认是21M左右,达到该值就会触发full gc进行类型卸载, 同时收集器会对该值进行调整: 如果释放了大量的空间, 就适当降低该值; 如果释放了很少的空间, 那么在不超过-XX:MaxMetaspaceSize(如果设置了的话) 的情况下, 适当提高该值。这个跟早期jdk版本的-XX:PermSize参数意思不一样,-XX:PermSize代表永久代的初始容量。由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般我会将这两个值都设置为256M。StackOverflowError示例:// JVM设置 -Xss128k(默认1M) public class StackOverflowTest { static int count = 0; static void redo() { count++; redo(); } public static void main(String[] args) { try { redo(); } catch (Throwable t) { t.printStackTrace(); System.out.println(count); } } } 运行结果: java.lang.StackOverflowError at com.appom.jvm.StackOverflowTest.redo(StackOverflowTest.java:12) at com.appom.jvm.StackOverflowTest.redo(StackOverflowTest.java:13) at com.appom.jvm.StackOverflowTest.redo(StackOverflowTest.java:13) ......结论:-Xss设置越小count值越小,说明一个线程栈里能分配的栈帧就越少,但是对JVM整体来说能开启的线程数会更多JVM内存参数大小该如何设置?JVM参数大小设置并没有固定标准,需要根据实际项目情况分析,给大家举个例子日均百万级订单交易系统如何设置JVM参数结论:通过上面这些内容介绍,大家应该对JVM优化有些概念了,就是尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收。
2023年02月11日
329 阅读
0 评论
0 点赞
1
2
3
4
...
7