JDK bug:ciObjectFactory::create_new_metadata:原因完全解析
文章目录
- 1、问题
- 2.详细日志
- 2.关键日志
- 3.结论
- 4.JDK:bug
- 最终bug链接:
- 京东遇到过类似bug
- 各位大佬如果有更详细的解答可以留言。
1、问题
服务不通,接口404,查看日志有一下截图,还有一个更详细的日志
2.详细日志
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f49157f4067, pid=17437, tid=0x00007f48b8ffe700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_92-b14) (build 1.8.0_92-b14)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.92-b14 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V [libjvm.so+0x438067] ciObjectFactory::create_new_metadata(Metadata*)+0x327
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#--------------- T H R E A D ---------------Current thread (0x00007f4910806800): JavaThread "C1 CompilerThread3" daemon [_thread_in_vm, id=17480, stack(0x00007f48b8efe000,0x00007f48b8fff000)]siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x0000000000000013Registers:
RAX=0x000000000000000b, RBX=0x000000000000008a, RCX=0x00000037800182a0, RDX=0x00007f48b8ffea20
RSP=0x00007f48b8ffc300, RBP=0x00007f48b8ffc370, RSI=0x00007f48e0c25ce8, RDI=0x00007f48e0c25ce8
R8 =0x0000000000000089, R9 =0x00007f491638e200, R10=0x0000000000000000, R11=0x000000377f75a290
R12=0x00007f48e0c25ce8, R13=0x00007f48a9ad7240, R14=0x00007f4910806800, R15=0x00007f48a9ad7240
RIP=0x00007f49157f4067, EFLAGS=0x0000000000010202, CSGSFS=0x0000000000000033, ERR=0x0000000000000004TRAPNO=0x000000000000000eTop of Stack: (sp=0x00007f48b8ffc300)
0x00007f48b8ffc300: 00007f48a8853080 00007f48b8ffc420
0x00007f48b8ffc310: 00007f48a88513d0 00007f48b8ffd9f0
0x00007f48b8ffc320: 00007f4910008660 00007f49106c4150
0x00007f48b8ffc330: 0000000000000001 00007f48b8ffc400
0x00007f48b8ffc340: 00007f4910806800 000000000000008a
0x00007f48b8ffc350: 00007f48e0c25ce8 00007f48a9ad7240
0x00007f48b8ffc360: 000000000000008a 00007f48a88c38b0
0x00007f48b8ffc370: 00007f48b8ffc3b0 00007f49157f4495
0x00007f48b8ffc380: 00007f48b8ffc3c0 0000000000000000
0x00007f48b8ffc390: 00007f48e0c25ce8 0000000000000000
0x00007f48b8ffc3a0: 00007f491633aaa0 00007f48a88c38b0
0x00007f48b8ffc3b0: 00007f48b8ffc3f0 00007f49157ec167
0x00007f48b8ffc3c0: 0000000000000010 00007f48a88c38b0
0x00007f48b8ffc3d0: 00007f48a8853260 00007f48b94c5c60
0x00007f48b8ffc3e0: 00007f48b8ffc400 00007f48b94c5b30
0x00007f48b8ffc3f0: 00007f48b8ffc530 00007f49157ec478
0x00007f48b8ffc400: 00007f48e0a801c0 00007f48a88532b0
0x00007f48b8ffc410: 00000001000ef3e0 00007f48a88532b0
0x00007f48b8ffc420: 00007f4910806800 00007f48a9ad7240
0x00007f48b8ffc430: 00007f48b8ffc4b0 00007f49157f3dd5
0x00007f48b8ffc440: 00007f48a8852f20 00007f491633aaa0
0x00007f48b8ffc450: 00007f48b8ffc510 00007f48e0bca418
0x00007f48b8ffc460: 00007f48b8ffc4e0 00007f49157e22ce
0x00007f48b8ffc470: 00007f48b8ffc500 00007f48b8ffd9f0
0x00007f48b8ffc480: 00007f48a8852fe0 000000000000006f
0x00007f48b8ffc490: 00000001000ef3e0 00007f48a9ad7240
0x00007f48b8ffc4a0: 0000000000000089 00007f48a9f10ca0
0x00007f48b8ffc4b0: 00007f48b8ffc4f0 00007f49157f44ab
0x00007f48b8ffc4c0: 00007f48b8ffc4e0 0000000000000003
0x00007f48b8ffc4d0: 00000001000ef3e0 0000000000000003
0x00007f48b8ffc4e0: 0000000000000003 00007f48a88532b0
0x00007f48b8ffc4f0: 00007f48b8ffc530 00007f49157ef062 Instructions: (pc=0x00007f49157f4067)
0x00007f49157f4047: 83 c6 08 39 c7 7c e2 44 8d 48 ff 45 89 08 e9 7b
0x00007f49157f4057: fd ff ff 66 0f 1f 44 00 00 49 8b 04 24 4c 89 e7
0x00007f49157f4067: ff 50 08 84 c0 0f 84 05 fd ff ff 41 8b 44 24 08
0x00007f49157f4077: 85 c0 0f 8e f8 fc ff ff 41 f6 84 24 0e 01 00 00 Register to memory mapping:RAX=0x000000000000000b is an unknown value
RBX=0x000000000000008a is an unknown value
RCX=0x00000037800182a0: <offset 0x2182a0> in /lib64/libpthread.so.0 at 0x000000377fe00000
RDX=0x00007f48b8ffea20 is pointing into the stack for thread: 0x00007f4910806800
RSP=0x00007f48b8ffc300 is pointing into the stack for thread: 0x00007f4910806800
RBP=0x00007f48b8ffc370 is pointing into the stack for thread: 0x00007f4910806800
RSI=0x00007f48e0c25ce8 is pointing into metadata
RDI=0x00007f48e0c25ce8 is pointing into metadata
R8 =0x0000000000000089 is an unknown value
R9 =0x00007f491638e200: <offset 0xfd2200> in /opt/soft/java/jre/lib/amd64/server/libjvm.so at 0x00007f49153bc000
R10=0x0000000000000000 is an unknown value
R11=0x000000377f75a290: <offset 0x15a290> in /lib64/libc.so.6 at 0x000000377f600000
R12=0x00007f48e0c25ce8 is pointing into metadata
R13=0x00007f48a9ad7240 is an unknown value
R14=0x00007f4910806800 is a thread
R15=0x00007f48a9ad7240 is an unknown valueStack: [0x00007f48b8efe000,0x00007f48b8fff000], sp=0x00007f48b8ffc300, free space=1016k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x438067] ciObjectFactory::create_new_metadata(Metadata*)+0x327
V [libjvm.so+0x438495] ciObjectFactory::get_metadata(Metadata*)+0x85
V [libjvm.so+0x430167] ciSpeculativeTrapData::translate_from(ProfileData const*)+0x67
V [libjvm.so+0x430478] ciMethodData::load_extra_data()+0xa8
V [libjvm.so+0x4325e8] ciMethodData::load_data()+0x268
V [libjvm.so+0x424b17] ciMethod::ensure_method_data(methodHandle)+0xa7
V [libjvm.so+0x425d67] ciMethod::ensure_method_data()+0xa7
V [libjvm.so+0x370e65] GraphBuilder::try_inline_full(ciMethod*, bool, Bytecodes::Code, Instruction*)+0x545
V [libjvm.so+0x36d2cf] GraphBuilder::try_inline(ciMethod*, bool, Bytecodes::Code, Instruction*)+0x11f
V [libjvm.so+0x36e412] GraphBuilder::invoke(Bytecodes::Code)+0xbc2
V [libjvm.so+0x36ed8d] GraphBuilder::iterate_bytecodes_for_block(int)+0x6ad
V [libjvm.so+0x37091b] GraphBuilder::iterate_all_blocks(bool)+0x14b
V [libjvm.so+0x3712b6] GraphBuilder::try_inline_full(ciMethod*, bool, Bytecodes::Code, Instruction*)+0x996
V [libjvm.so+0x36d2cf] GraphBuilder::try_inline(ciMethod*, bool, Bytecodes::Code, Instruction*)+0x11f
V [libjvm.so+0x36e412] GraphBuilder::invoke(Bytecodes::Code)+0xbc2
V [libjvm.so+0x36ed8d] GraphBuilder::iterate_bytecodes_for_block(int)+0x6ad
V [libjvm.so+0x37091b] GraphBuilder::iterate_all_blocks(bool)+0x14b
V [libjvm.so+0x3712b6] GraphBuilder::try_inline_full(ciMethod*, bool, Bytecodes::Code, Instruction*)+0x996
V [libjvm.so+0x36d2cf] GraphBuilder::try_inline(ciMethod*, bool, Bytecodes::Code, Instruction*)+0x11f
V [libjvm.so+0x36e412] GraphBuilder::invoke(Bytecodes::Code)+0xbc2
V [libjvm.so+0x36ed8d] GraphBuilder::iterate_bytecodes_for_block(int)+0x6ad
V [libjvm.so+0x37091b] GraphBuilder::iterate_all_blocks(bool)+0x14b
V [libjvm.so+0x3712b6] GraphBuilder::try_inline_full(ciMethod*, bool, Bytecodes::Code, Instruction*)+0x996
V [libjvm.so+0x36d2cf] GraphBuilder::try_inline(ciMethod*, bool, Bytecodes::Code, Instruction*)+0x11f
V [libjvm.so+0x36e412] GraphBuilder::invoke(Bytecodes::Code)+0xbc2
V [libjvm.so+0x36ed8d] GraphBuilder::iterate_bytecodes_for_block(int)+0x6ad
V [libjvm.so+0x3708c2] GraphBuilder::iterate_all_blocks(bool)+0xf2
V [libjvm.so+0x3724e7] GraphBuilder::GraphBuilder(Compilation*, IRScope*)+0x527
V [libjvm.so+0x37a817] IRScope::IRScope(Compilation*, IRScope*, int, ciMethod*, int, bool)+0x1e7
V [libjvm.so+0x37a92f] IR::IR(Compilation*, ciMethod*, int)+0x9f
V [libjvm.so+0x358edb] Compilation::build_hir()+0xdb
V [libjvm.so+0x35929e] Compilation::compile_java_method()+0x6e
V [libjvm.so+0x3593ce] Compilation::compile_method()+0x4e
V [libjvm.so+0x35973e] Compilation::Compilation(AbstractCompiler*, ciEnv*, ciMethod*, int, BufferBlob*)+0x25e
V [libjvm.so+0x35a4e9] Compiler::compile_method(ciEnv*, ciMethod*, int)+0xa9
V [libjvm.so+0x4aea9a] CompileBroker::invoke_compiler_on_method(CompileTask*)+0xc9a
V [libjvm.so+0x4afa46] CompileBroker::compiler_thread_loop()+0x5d6
V [libjvm.so+0xa6cc5f] JavaThread::thread_main_inner()+0xdf
V [libjvm.so+0xa6cd8c] JavaThread::run()+0x11c
V [libjvm.so+0x91fad8] java_start(Thread*)+0x108
C [libpthread.so.0+0x79d1]**Current CompileTask:
C1: 319967 19019 ! 3 com.mysql.jdbc.Buffer::readString (121 bytes)**--------------- P R O C E S S --------------
2.关键日志
1、SIGSEGV (0xb) at pc=0x00007f49157f4067, pid=17437, tid=0x00007f48b8ffe700:中断异常信号量
2、Problematic frame: V [libjvm.so+0x438067] ciObjectFactory::create_new_metadata(Metadata*)+0x327:表示发生的c方法
3、Current thread (0x00007f4910806800): JavaThread “C1 CompilerThread3” daemon [_thread_in_vm, id=17480, stack(0x00007f48b8efe000,0x00007f48b8fff000)]:详细日志中发现当前任务线程:C1 CompilerThread3
4、Current CompileTask:
C1: 319967 19019 ! 3 com.mysql.jdbc.Buffer::readString (121 bytes):详细日志中发现当前任务线程当前任务
3.结论
【C1编译器】通过线程【C1 CompilerThread3】JIT优化热点方法【com.mysql.jdbc.Buffer::readString】代码时,在调用【libjvm.so】中的代码【ciObjectFactory::create_new_metadata】方法时,【试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据】,导致的崩溃
4.JDK:bug
直接去搜索关键字:create_new_metadata,出现一下内容
最终bug链接:
https://bugs.java.com/bugdatabase/view_bug?bug_id=8156137
解释:
I tested with a fix for _previous_version_count, but put in an artificial delay for classes to move from the previous versions list to the deallocate list (simulating on_stack metadata), and I was able to get the same crash, so this is evidence that JDK-8164692 is a separate (but contributing) bug. I’m testing my proposed fix, which is to process previous versions in Klass::clean_weak_klass_links().
翻译:
InstanceKlass::_previous_version_count的问题可能是根本原因。 如果计数错误,则ClassLoaderDataGraph::do_unloading()可能会跳过调用InstanceKlass::purge_previous_versions(),从而允许ClassLoaderDataGraphKlassIteratorAtomic和G1ConcurrentMark看到这些临时类。
InstanceKlass::_previous_version_count计数错误的一个bug,导致G1ConcurrentMark能调用临时类。
京东遇到过类似bug
链接地址:https://zhuanlan.zhihu.com/p/665260001
很巧合的都是在C1编译jdbc驱动的场景出现的
Current CompileTask:
C1: 319967 19019 ! 3 com.mysql.jdbc.Buffer::readString (121 bytes)
京东:Current CompileTask:
C2:43781461 13331 ! 4 com.mysql.cj.NativeSession::execSQL (579 bytes)
各位大佬如果有更详细的解答可以留言。
相关文章:
JDK bug:ciObjectFactory::create_new_metadata:原因完全解析
文章目录 1、问题2.详细日志2.关键日志3.结论4.JDK:bug最终bug链接: 京东遇到过类似bug各位大佬如果有更详细的解答可以留言。 1、问题 服务不通,接口404,查看日志有一下截图,还有一个更详细的日志 2.详细日志 # #…...
【数据结构】并查集的简单实现,合并,查找(C++)
文章目录 前言举例: 一、1.构造函数2.查找元素属于哪个集合FindRoot3.将两个集合归并成一个集合Union4.查找集合数量SetCount 二、源码 前言 需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规…...
2023美团商家信息
2023美团商家电话、地址、经纬度、评分、均价、执照......
0155 - Java 数组
1 数组介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。 即:数(数据)组(一组)就是一组数据 2 数组的使用 2.1 使用方式一 2.2 使用方式二 3 数组使用注意事项和细节 数组是多个相同类型数据的组合,实现对这些数据…...
Java 语言有哪些特点
Java语言具有以下特点: 简单易学:Java语法相对简单,与C相比更容易上手。 面向对象:Java是一门纯粹的面向对象编程语言,支持封装、继承和多态等面向对象的特性。 平台无关性:Java程序可以在不同的操作系统…...
SAP 特殊采购类50简介----虚拟件
今天我们测试一下特殊类50,也就是我们常说的虚拟件。 虚拟物料是库存中实际不存在的物料清单(BOM)的子装配件,它用于简化物料清单。尽管虚拟物料出现在物料清单中,但生产订单显示制造虚拟物料所需的组件,而不是虚拟物料本身。 我们举个列子,生产的手机是有包装的,有盒子…...
C语言——内存函数的使用与模拟实现
大家好,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流 本文由:残念ing 原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客,欢迎各位…...
Mysql索引事务(面试高频)
文章目录 目录 文章目录 前言 一 . 索引 1.1 概念 1.2 作用 1.3 使用场景 1.4 存储引擎 二 . 事务 2.1 事务的概念 2.2 事务四大特性 前言 大家好,今天给大家绍一下mysql索引和事务 一 . 索引 1.1 概念 索引是一种特殊的文件,包含着对数据表中的所有记录的引用指针…...
SpringCloudGateway 3.1.4版本 Netty内存泄漏问题解决
一、 产生的异常 当时是服务器访问不到服务了,上去一看,无法申请资源OutOfDirectMemoryError了,内存级别的东西让人一阵头大,赶紧在线下模拟, 1. 减少分配的堆外内存,打开Netty的监测工具等有助于复现的…...
STM32内部是怎么工作的
STM32是怎么工作的 1 从孩子他妈说起2 早期计算机的组成2.1 五大元件(1)第一个出场的是电容元件(2)第二个出场的是二极管(3)第三个出场的是电阻元件(4)第四个出场的是电感࿰…...
MyBatis的配置文件
目录 MyBatis配置 1.properties标签 2.typeAliases标签 3.Mappers标签 一个最全面的MyBatis配置文件可能会包含各种不同的设置和选项,根据实际情况,可以根据需要添加或删除配置。以下是一个包含各种可能设置的示例。 这个配置文件包含了环境设置、数…...
MCU平台下确定栈空间大小的方法
本文介绍MCU平台下确定栈空间大小的方法。 通常使用IDE开发MCU程序在生成Image文件时,Image文件被划分为代码区,数据区,BSS区,堆区,栈区。其中,代码区,数据区,BSS区空间大小由编译器…...
Flink系列之:SQL提示
Flink系列之:SQL提示 一、动态表选项二、语法三、例子四、查询提示五、句法六、加入提示七、播送八、随机散列九、随机合并十、嵌套循环十一、LOOKUP十二、进一步说明十三、故障排除十四、连接提示中的冲突案例十五、什么是查询块 SQL 提示可以与 SQL 语句一起使用来…...
机器学习算法---聚类
类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…...
gitlab ci pages
参考文章 gitlab pages是什么 一个可以利用gitlab的域名和项目部署自己静态网站的机制 开启 到gitlab的如下页面 通过gitlab.ci部署项目的静态网站 # build ruby 1/3: # stage: build # script: # - echo "ruby1"# build ruby 2/3: # stage: build …...
Web ML 库的Transformers.js 提供文本转语音功能
JavaScript 库 Transformers.js 提供了类似 Python Transformers 库的功能,设计用于在 Web 浏览器中直接运行 Transformer 模型,而不再需要外部服务器参与处理。在最新的 2.7 版本中,Transformers.js 引入了增强功能,其中包括文本…...
管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜E
老老规矩,看目录,平均每年2E,跟2D一样,D是全对,E是全错,侧面也看出10道题,大概是3A/B,3C,2D,2E,其实还是蛮平均的。但E为1道的情况居多。 第20题…...
【Linux基本指令(2)】
文章目录 一. 基本指令第二回 一. 基本指令第二回 cp指令语法 cp src dst 将目标文件或者目录拷贝到指定目录下或文件下。注意同级目录下,不允许存在同名文件或同名目录。如果将一个file.txt文件拷贝到当前目录下,就重名了,报错cp不了&#…...
Debian系统设置SSH密钥登陆
如果没有安装ssh,root权限运行apt install openssh-server进行安装。 ssh-keygen -t rsa # 生成配对密钥,后续一路enter即可会在用户目录(即~这个)下生成.ssh文件夹,里面的id_rsa是私钥,id_rsa.pub是公钥…...
uniapp cli开发和HBuilderX开发
uniapp cli开发和HBuilderX开发 前言 uniapp是一个跨平台的开发框架,可以开发出微信小程序、支付宝小程序、百度小程序、头条小程序、H5、App等,开发者只需要写一套代码,就可以发布到各个平台,大大提高了开发效率。 uniapp的开…...
【Java异常】idea 报错:无效的目标发行版:17 的解决办法
【Java异常】idea 报错:无效的目标发行版:17 的解决办法 一,问题来源 springcloud的第一个demo项目就给我干趴了 二、原因分析 java: 无效的目标发行版: 17 原因就是 JDK 版本不对。从 IDEA 编辑器中可以找到问题的原因所在,…...
代码提交规范-ESLint+Prettier+husky+Commitlint
代码提交规范-ESLintPrettierhuskyCommitlint 配置eslint (3步)配置prettier(4步)1.安装配置prettier2.设置忽略文件 .prettierignore3.处理eslint冲突4. 配置vscode 的settings.json husky安装并配置lint-staged(3步)安装配置com…...
手动实现 Vue 3的简易双向数据绑定(模仿源码)
Vue 3 带来了许多令人兴奋的新特性和改进,其中之一就是其双向数据绑定的实现方式。与 Vue 2 使用 Object.defineProperty 不同,Vue 3 利用了 JavaScript 的 Proxy 特性来创建响应式数据。在这篇博客中,我们将探讨 Vue 3 中双向数据绑定的基础…...
LVS最终奥义之DR直接路由模式
1 LVS-DR(直接路由模式) 1.1 LVS-DR模式工作过程 1.客户端通过VIP将访问请求报文(源IP为客户端IP,目标IP为VIP)发送到调度器 2.调度器通过调度算法选择最适合的节点服务器并重新封装数据报文(将源mac地址改为调度器的mac地址&am…...
t-SNE高维数据可视化实例
t-SNE:高维数据分布可视化 实例1:自动生成一个S形状的三维曲线 实例1结果: 实例1完整代码: import matplotlib.pyplot as plt from sklearn import manifold, datasets """对S型曲线数据的降维和可视化"&q…...
配置应用到k8s
配置应用到k8s,前置条件是安装了Docker,Minikube,kubectl 应用已经通过Docker生成本地镜像文件 1,创建godemo-deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata:name: godemo-deploymentspec:replicas: 3 #启动三个…...
(四)STM32 操作 GPIO 点亮 LED灯 / GPIO工作模式
目录 1. STM32 工程模板中的工程目录介绍 2. GPIO 简介 3. GPIO 框图剖析 1)保护二极管及上、下拉电阻 2) P-MOS 管和 N-MOS 管 3)输出数据寄存器 3.1)ODR 端口输出数据寄存器 3.2)BSRR 端口位设置/清除寄存器 4&a…...
你知道跨站脚本攻击吗?一篇带你了解什么叫做XSS
1.XSS简介 (1)XSS简介 XSS作为OWASP TOP 10之一。 XSS中文叫做跨站脚本攻击(Cross-site scripting),本名应该缩写为CSS,但是由于CSS(Cascading Style Sheets,层叠样式脚本&#x…...
JVM入门
JVM概述 JVM位置 JVM体系结构 注意:栈中一定不存在垃圾,栈中数据用完一个弹出一个,总结来说,栈区、本地方法栈、程序计数器这三块必定不存在垃圾。JVM调优主要是针对方法区、堆(99%)进行调优。 常用的第三…...
Cmake基础(5)
这篇文章主要描述如何使用cmake构建一个库工程 文章目录 add_libraryinstall 库工程的代码:头文件和源文件 #ifndef ADD_H #define ADD_H#ifdef _WIN32 #ifdef MYMATH_EXPORTS #define MYMATH_API __declspec(dllexport) #else #define MYMATH_API __declspec(dll…...
静态网站制作模板/福州网站优化
[get的过去式和过去分词]I got some fish at the market. Have they got back yet?与have 连用: have got: (1)占有,拥有(现在时): Ive got a new laptop. Have you got a coin? Shes got a nice smile.(2)表示义务、责任:Ive got to go now. What have you got to do today?…...
西安网站开发工程师/武汉seo首页
13-Figma-组件管理 常见操作 创建组件,选择,点击顶部创建多个组件,框选多个,点击顶部组件使用,对组件进行复制,就创建了组件的实例实例跳到模板,右键-》转到组件模板所有组件如何管理…...
大气医院网站源码/sem与seo
MyClouds企业级微服务平台 MyClouds-V2.1-RC 已发布。更新如下1. [缺陷] 完善了直接访问静态html页面时的权限控制逻辑。2. [重构] 在LayUI前端框架下实现了根据权限数据动态生成主页左侧导航菜单。3. [重构] 放弃使用spring session redis集中存储的模式进行分布式会话管理&a…...
长沙做网站有哪些/百度自然搜索排名优化
2. 概述 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息, 将接口和 Java 的 POJOs(Plain Old Ja…...
优化网站建设公司/今日热点新闻事件2021
一颗柠檬红茶:浅谈Elasticsearch 5.6.10搬砖历程_1zhuanlan.zhihu.com写在前面:原文再续,书接上一回。上一篇主要介绍Elasticsearch的特点与应用,也分享了分布式集群的特性,以及数据读取、写入、更新、删除的原理&am…...
小额贷款 网站模板/定制网站和模板建站
方法一:打印PDF表单以及在PDF中加入图片 需要的资料: jar包:iTextAsian.jar ,itext-2.1.7.jar; 源码: 1 public static void main(String args[]) throws IOException, DocumentException {2 Strin…...