Oracle 慢查询排查步骤

1. Oracle 慢查询排查步骤

1.1. 前言
记录一次 Oracle 慢查询的排查过程 , 便于以后直接使用。
看了一些文档 , Oracle 中优化的方案和 Mysql 基本上是一致的 , 通常包括一下几个方向 :

基准测试 (吞吐量): 包括 Oracle 本身吞吐量和磁盘 I/O 吞吐量
硬件分析 (资源情况): 包括查看服务器 CPU , 硬盘的使用情况
SQL 分析: 分析 SQL 中是否存在慢查询 , 是否命中索引
配置优化: 分析是否可以通过环境配置提高性能
以上几个方面 , 基本上就能将问题定位了 , 通过问题再考虑解决的方法

1.2. 排查步骤

1.2.1. 查询慢查询日志

 区别于 Mysql 直接写到 log 中的日志 , Oracle 可以通过语句拉出慢查询的 SQL

# 慢查询耗时
select *from (select sa.SQL_TEXT "执行 SQL",sa.EXECUTIONS "执行次数",round(sa.ELAPSED_TIME / 1000000, 2) "总执行时间",round(sa.ELAPSED_TIME / 1000000 / sa.EXECUTIONS, 2) "平均执行时间",sa.COMMAND_TYPE,sa.PARSING_USER_ID "用户 ID",u.username "用户名",sa.HASH_VALUEfrom v$sqlarea saleft join all_users uon sa.PARSING_USER_ID = u.user_idwhere sa.EXECUTIONS > 0order by (sa.ELAPSED_TIME / sa.EXECUTIONS) desc)where rownum <= 50;
# 查询次数最多的 SQL 
select *from (select s.SQL_TEXT,s.EXECUTIONS "执行次数",s.PARSING_USER_ID "用户名",rank() over(order by EXECUTIONS desc) EXEC_RANKfrom v$sql sleft join all_users uon u.USER_ID = s.PARSING_USER_ID) twhere exec_rank <= 100;

结果解释 :

拿到平均执行时间后就可以明显的发现查询时间较长的 SQL , 但是这一类 SQL 不一定是慢查询 , 需要根据情况判断 , 如果出现很离谱的时间 , 就需要分析索引

1.2.2. Oracle 查询 SQL 语句执行的耗时

select a.sql_text SQL 语句, b.etime 执行耗时, c.user_id 用户 ID,c.SAMPLE_TIME 执行时间, c.INSTANCE_NUMBER 实例数, u.username 用户名, a.sql_id SQL 编号from dba_hist_sqltext a,(select sql_id, ELAPSED_TIME_DELTA / 1000000 as etimefrom dba_hist_sqlstatwhere ELAPSED_TIME_DELTA / 1000000 >= 1) b,dba_hist_active_sess_history c,dba_users uwhere a.sql_id = b.sql_idand u.username = 'SYNC_PLUS_1_20190109'and c.user_id = u.user_idand b.sql_id = c.sql_id-- and a.sql_text like '%insert into GK_ZWVCH_HSC_NEW      select  %'order by  SAMPLE_TIME desc,b.etime desc;

1.2.3. 定位系统里面哪些 SQL 脚本存在 TABLE ACCESS FULL (扫全表) 行为


select *from v$sql_plan vwhere v.operation = 'TABLE ACCESS'and v.OPTIONS = 'FULL'and v.OBJECT_OWNER='SYNC_PLUS_1_20190109';

select s.SQL_TEXTfrom v$sqlarea swhere s.SQL_ID = '4dpd97jh2gzsd'and s.HASH_VALUE = '1613233933'and s.PLAN_HASH_VALUE = '3592287464';
或者select s.SQL_TEXT from v$sqlarea s where s.ADDRESS = '00000000A65D2318';

1.2.4. 查看索引情况

explain plan for
select * from t_call_records where t_bjhm='123456'# 查看执行结果
select * from table(dbms_xplan.display)

索引内容补充

从这里可以明显看到走了全表扫描 , 那么就需要根据情况加索引和校验

index unique scan : 索引唯一扫描 (主键索引)
index range scan : 索引范围扫描 (组合索引的情况)
index full scan : 全索引扫描
index fast full scan : 索引快速扫描, 扫描索引中的全部的数据块, 与全索引扫描的方式基本上类似。
两者之间的明显的区别是, 索引快速扫描对查询的数据不进行排序, 数据返回的时候不是排序的。

1.2.5. 查看锁的竞争情况

Step 1 : 查看后台锁竞争
SELECTSQ.INST_ID,SQ.SQL_TEXT, /*SQL 文本*/SE.SID, /*会话的唯一标识, 通常要对某个会话进行分析前, 首先就需要获得该会话的 SID。*/SE.BLOCKING_SESSION,SQ.OPTIMIZER_COST AS COST_,/* COST 值*/SE.LAST_CALL_ET CONTINUE_TIME,/*执行时间*/SE.EVENT,/*等待事件*/SE.LOCKWAIT,/*是否等待 LOCK(SE, P)*/SE.MACHINE,/*客户端的机器名。(WORKGROUP\PC-201211082055)*/SQ.SQL_ID,/*SQL_ID*/SE.USERNAME,/*创建该会话的用户名*/SE.LOGON_TIME,/*登陆时间*/'ALTER SYSTEM KILL SESSION ' || SE.SID || ',' || SE.SERIAL #  --若存在锁情况, 会用到 KILL 锁释放~
FROMgV$SESSION SE,/*会话信息。每一个连接到 ORACLE 数据库的会话都能在该视图中对应一条记录*/gV$SQLAREA SQ /*跟踪所有 SHARED POOL 中的共享 CURSOR 信息, 包括 执行次数, 逻辑读, 物理读等*/
WHERESE.SQL_HASH_VALUE = SQ.HASH_VALUE    AND SE.STATUS = 'ACTIVE'    AND SE.SQL_ID = SQ.SQL_ID    AND SE.USERNAME = SQ.PARSING_SCHEMA_NAME       --过滤条件AND SE.USERNAME = 'FWSB' --用户名AND se.BLOCKING_SESSION IS NOT NULL;// 实际运行脚本======================   
SELECTSQ.INST_ID,SQ.SQL_TEXT,SE.SID,SE.BLOCKING_SESSION,SQ.OPTIMIZER_COST AS COST_,SE.LAST_CALL_ET CONTINUE_TIME,SE.EVENT,SE.LOCKWAIT,SE.MACHINE,SQ.SQL_ID,SE.USERNAME,SE.LOGON_TIME,'ALTER SYSTEM KILL SESSION ' || SE.SID || ',' 
FROMgV$SESSION SE,gV$SQLAREA SQ 
WHERESE.SQL_HASH_VALUE = SQ.HASH_VALUE AND SE.STATUS = 'ACTIVE' AND SE.SQL_ID = SQ.SQL_ID AND SE.USERNAME = SQ.PARSING_SCHEMA_NAME AND SE.USERNAME = 'FWSB' AND SE.BLOCKING_SESSION IS NOT NULL;

补充 : 相关的表结构可以生乳查询 Oracle 官方文档

Step 2 : 查询结果

这里可以通过 SID 再去查找对应的 SQL , 找到对应的锁对象

1.2.6. 其他锁语句

查询那些用户, 操纵了那些表造成了锁机

SELECTs.username,decode(l.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL ) LOCK_LEVEL,o.owner,o.object_name,o.object_type,s.sid,s.terminal,s.machine,s.program,s.osuser
FROMv$session s,v$lock l,all_objects o
WHEREl.sid = s.sidAND l.id1 = o.object_id(+)AND s.username is NOT Null

详情参考 :—> V$Lock

查出被锁的表, 和锁住这个表的会话 ID

select a.session_id ,b.* from v$locked_object a,all_objects b where a.object_id=b.object_id

查出对应的 SQL 语句

SELECTvs.SQL_TEXT,vsess.sid,vsess.SERIAL #,vsess.MACHINE,vsess.OSUSER,vsess.TERMINAL,vsess.PROGRAM,vs.CPU_TIME,vs.DISK_READS 
FROMv$sql vs,v$session vsess 
WHEREvs.ADDRESS = vsess.SQL_ADDRESS AND vsess.sid = 36

补充语句 :

// 查哪个过程被锁 -> 查 V$DB_OBJECT_CACHE 视图: 
SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND LOCKS!='0';// 查是哪一个 SID, 通过 SID 可知道是哪个 SESSION. -> 查 V$ACCESS 视图: 
SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';// 查出 SID 和 SERIAL# -> 查 V$SESSION 视图 + 查 V$PROCESS 视图
SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的 SID'
SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的 PADDR';

1.3. 慢查询优化

1.3.1. SQL 部分

// 避免 in 操作
Oracle 中 in 会被试图转换成多个表的连接 , 转换不成功会先进行 in 中的子查询 , 再进行外部查询// 避免 not in
不管哪个数据库 , 一般都是不推荐的 , 这种写法会跳过索引 (同理还有 is null 和 not null)// 避免使用 <>
类似 , 不走索引// **采用函数处理的字段不能利用索引**// 关联查询
- 多用 Where 语句把单个表的结果集最小化, 多用聚合函数汇总结果集后再与其它表做关联
- 多用 右连接// 过滤多用 where , 避免使用 having
- 这个和 mysql 是一致的 , having 是对 where 的数据进行过滤组处理 , 对于数据的过滤 , 优先用 where
- 总结 : 先过滤小的结果集, 然后通过这个小的结果集和其他表做关联// like 操作符
like 操作可以通过 instr 代替// union 操作符 
- 通常不会产生重复结果 , 而 union 会额外触发一次排序
- 采用 union ALL 操作符替代 union, 因为 union ALL 操作只是简单的将两个结果合并后就返回// SQL 执行保证统一性
涉及到 SGA 的概念// where 后面的条件顺序影响
这里不是全表索引的问题 , 而是由于 where 多个条件时 , 比较带来的 cpu 占用率问题// 询表顺序的影响
- 表的顺序不对会产生十分耗服务器资源的数据交叉// 其他的方案还包括以下方式
@ https://www.jb51.net/article/97515.htm@ https://www.jb51.net/article/23071.htm@ https://www.jb51.net/article/40281.htm

1.4. 性能优化

1.4.1. 整体性能优化流程

这里直接引用别人文章的结果 , 没有测试 , 仅供参考 !

// PS : 初始化时间 49.41// 增大 SGA Buffer Cache 和 SGA Shared Pool -> 48.57
- 增大 SGA 已经缓冲看来对于性能的提升并不显著, 加载时间只提升了 1.73%// 增大 SGA Redo Cache 和 Redo Log Files -> 41.39
- 加载时间提升了 17.35%, TPS 也提升了 9.33%。因为加载和同时插入, 更新, 删除需要比 8M 大的空间
- 但是看起来增加内存性能并没有显著提升// 增大 Database Block Size (2K-4K) -> 17.35
- 加载时间提升了 138%! 而对 TPS 值没有很大的影响// 使用 Tablespaces Local -> 15.07
- TPS 轻微提升// Database Block Size 增大 (4K-8K) -> 11.42
- TPS 继续提升 , 区别较大// 添加 io_slaves -> 10.48
dbwr_io_slaves 4\
lgwr_io_slaves (derived) 4// 优化 Linux 内核 -> 9.40
可以看到 , 内核版本优化后 , 性能是有一定提升的// 调整虚拟子内存 -> 5.58
- /ect/sysctl.cong-> vm.bdflush = 100 1200 128 512 15 5000 500 1884 2


这个流程不能作为标杆 , 但是可以作为优化 Oracle 的思路 , 可以看到 , 性能提升很大

1.4.2. 硬件优化

此处是使用 IO 校准 (I/O Calibration), 可以用于评测一下数据库的 I/O 性能 , 通过 分析 IO 结果判断采用不同的策略

// Step 1 : 确定并行度配置 (通常是核数的 2 倍)
show parameters parallel_thread// Step 2 : 确定并行策略 (auto : Oracle 将依据要执行的操作的特性和对象的大小来确定并行度)
- 查询策略 : show parameters parallel_degree_policy
- 设置策略 : alter session set parallel_degree_policy = 'auto'// Step 3 : 查看并行度数据
- 打开系统默认设置的输出功能 : set serveroutput on
- 查看详情 : 
set serveroutput on
DECLARElat  INTEGER;iops INTEGER;mbps INTEGER;
BEGIN
-- DBMS_RESOURCE_MANAGER.CALIBRATE_IO (disk_count,max_latency , iops, mbps, lat);DBMS_RESOURCE_MANAGER.CALIBRATE_IO (2, 10, iops, mbps, lat);DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops);DBMS_OUTPUT.PUT_LINE ('latency  = ' || lat);dbms_output.put_line('max_mbps = ' || mbps);
end;
/// 问题补充 : ORA-56708: 找不到任何具有异步 I/O 功能的数据文件
- 确定 sync : show parameter filesystemio_options
- 设置 sync : filesystemio_options- ASYNCH: 使 Oracle 支持文件的异步 (Asynchronous)IO- DIRECTIO: 使 Oracle 支持文件的 Direct IO- SETALL: 使 Oracle 同时支持文件的 Asynchronous IO 和 Direct IO- NONE: 使 Oracle 关闭对 Asynchronous IO 和 Direct IO 的支持1> alter system set filesystemio_options=setall scope=spfile;2> shutdown immediate;3> startup// PS : 注意其中管理员权限问题alter system set filesystemio_options=none scope=spfile;

1.5. 概念补充

1.5.1. SGA

系统全局区域 (SGA) 是一组共享内存结构, 称为 SGA 组件, 包含一个 Oracle 数据库实例的数据和控制信息。SGA 由所有服务器和后台进程共享。SGA 中存储的数据示例包括缓存的数据块和共享的 SQL 区域。

组成部分 :

Database buffer cache : 数据缓存
在查询或修改数据库中存储的数据之前, 必须从磁盘读取数据并将其存储在缓冲区缓存中。
所有连接到数据库的用户进程都共享对缓冲区缓存的访问。
为了获得最佳性能, 缓冲区缓存应该足够大, 以避免频繁的磁盘 I/O 操作。
Shared pool : 共享池缓存用户共享的信息 , 包括如下内容
可重用的 SQL 语句
来自数据字典的信息, 例如用户帐户数据、表和索引描述以及特权
存储过程, 它是存储在数据库中的可执行代码
Redo log buffer : 这个缓冲区通过缓存重做信息来提高性能, 直到可以将它写入存储在磁盘上的物理在线重做日志文件
Large pool : 这个可选区域用于为各种服务器进程缓冲大型 I/O 请求
Java pool : Java 池是用于 Java 虚拟机 (JVM) 中所有特定于会话的 Java 代码和数据的内存区域
Streams pool : Streams 池是 Oracle Streams 特性使用的内存区域
Result cache : 结果缓存缓冲区查询结果。如果运行的查询将结果存储在结果缓存中, 那么数据库将从结果缓存返回查询结果, 而不是重新运行查询。

1.6. 总结

笔者只是基于通过业务要求的角度进行 Oracle 优化 , 并没有深入 Oracle 业务优化 , 感兴趣的可以看看 《Oracle 数据库性能优化方法论和最佳实践》, 对数据库进行系统的优化。

2. 解析 oracle 对 select 加锁的方法以及锁的查询

2.1. oracle 对 select 加锁方法

create table test(a number,b number);
insert into test values(1,2);
insert into test values(3,4);
insert into test values(8,9);
commit;
---session 1 模拟选中一个号码
SQL> select * from test where a =1 for update skip locked;A          B
---------- ----------1          2
---session 2 对 a=1 再进行 select
SQL> select * from test where a = 1 for update skip locked;
未选定行
-- session 3 全表 select
SQL> select * from test for update skip locked;A          B
---------- ----------3          48          9
SQL>

2.2. 查询那些用户, 操纵了那些表造成了锁机

SELECT s.username,
decode(l.type,‘TM’,‘TABLE LOCK’,
‘TX’,‘ROW LOCK’,
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM vs e s s i o n s , v session s,vsessions,vlock l,all_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT Null

2.3. 查出被锁的表, 和锁住这个表的会话 ID

select a.session_id ,b.* from v$locked_object a,all_objects b
where a.object_id=b.object_id

2.4. 查出对应的 SQL 语句

select vs.SQL_TEXT,vsess.sid,vsess.SERIAL#,vsess.MACHINE,vsess.OSUSER
,vsess.TERMINAL,vsess.PROGRAM,vs.CPU_TIME,vs.DISK_READS
from vs q l v s , v sql vs,vsqlvs,vsession vsess
where vs.ADDRESS=vsess.SQL_ADDRESS
and vsess.sid=(上面查出来的会话 ID)

2.5. 集合

2.5.1. 查哪个过程被锁

查v$db_object_cache视图:SELECT * FROM v$db_object_cache a where a.locks='1'

2.5.2. 查是哪一个 SID, 通过 SID 可知道是哪个 SESSION.

SELECT * FROM V$ACCESS A WHERE A.owner='BIGSCREEN';

2.5.3. 查出 SID 和 SERIAL#


SELECT * FROM V$SESSION A WHERE A.Sid='45';
SELECT * FROM V$PROCESS A WHERE A.addr='0000000113B6ED30'

2.5.4. 杀进程

(1). 先杀 ORACLE 进程:
ALTER SYSTEM KILL SESSION ‘查出的 SID, 查出的 SERIAL#’;
(2). 再杀操作系统进程:
KILL -9 刚才查出的 SPID

ORAKILL 刚才查出的 SID 刚才查出的 SPID

2.6. 查找最耗费系统资源的 SQL

–-CPU
select b.sql_text,
a.buffer_gets,
a.executions,
a.buffer_gets/decode(a.executions , 0 , 1 , a.executions),
c.username
from V$SQLAREA A,V$SQLTEXT_WITH_NEWLINES b,dba_users c
where a.parsing_user_id = c.user_id
and a.address = b.address and c.username='BIGSCREEN'
order by a.buffer_gets desc , b.piece-–IO
select b.sql_text,
a.disk_reads,
a.executions,
a.disk_reads/decode(a.executions , 0 , 1 , a.executions),
c.username
from V$SQLAREA A,V$SQLTEXT_WITH_NEWLINES b,dba_users c
where a.parsing_user_id = c.user_id
and a.address = b.address and c.username='BIGSCREEN'
order by a.disk_reads desc , b.piece;select n.*,s.sid,s.value  CPU_Used  
from v$sesstat s ,v$statname n
where s.statistic#=n.statistic# and n.name='CPU used by this session'
and s.value>0
order by 2 desc;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/213506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rails3 row sql example

refer: https://stackoverflow.com/questions/14824453/rails-raw-sql-example 搜索怎么在Rails3 使用row sql&#xff0c; 打开上面的链接&#xff0c;可以找到这样的答案&#xff0c;如下图&#xff1a; sql "Select * from ... your sql query here" records_ar…

Nginx的server层外层的常见配置语句的解读

有下面的Nginx配置: worker_processes auto; worker_rlimit_nofile 51200;events {use epoll;worker_connections 51200;multi_accept on; }http {include mime.types;default_type application/octet-stream;server_names_hash_bucket_size 512;client_max_body_size 50m;cli…

推荐4个优秀的 Python 时间序列分析库

时间序列分析在金融和医疗保健等领域至关重要&#xff0c;在这些领域&#xff0c;理解随时间变化的数据模式至关重要。在本文中&#xff0c;我们将介绍四个主要的Python库——statmodels、tslearn、tssearch和tsfresh——每个库都针对时间序列分析的不同方面进行了定制。这些库…

最长子字符串的长度 (一) - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给你一个字符串 s&#xff0c;字符串s首尾相连成一个环形&#xff0c;请你在环中找出字符出现了偶数次最长子字符串的长度。 输入描述 输入是一串小写字母组成的…

VS2015编译GDAL3.2.0+opencl+C#

参考借鉴https://www.cnblogs.com/litou/p/15004877.html 参考借鉴https://www.cnblogs.com/xiaowangba/p/6313903.html 参考借鉴gdal、proj、geos、sqlite等在VS2015下编译和配置_vs2015编译sqlite3-CSDN博客 参考借鉴Windows下GDAL3.1.2编译 (VS2015)_gdal windows编译-CS…

字符串String

字符串字面量 let s "hello";变量s属于字符串字面量&#xff0c;它们属于硬编码进程序的字符串值&#xff0c;属于不可变的类型。但并不是所有字符串的值都能够在编写代码时确定。 String类型 String类型会在堆上分配到自己需要的存储空间&#xff0c;所以它能够…

Nacos简介

1.Nacos简介 1.1.为什么叫Nacos&#xff1f; 前四个字母分别为Naming和Configuration的前两个字母&#xff0c;最后的s为service。 1.2.Nacos是什么&#xff1f; nacos是第二代微服务SpringCloudAlibaba开源的一款注册中心和分布式配置中心组件&#xff0c;其功能上为第一代微…

声明式数据建模、定义简单易懂:下一代 ORM 助你效率倍增 | 开源日报 No.102

prisma/prisma Stars: 34.0k License: Apache-2.0 Prisma 是一个下一代 ORM&#xff0c;包括以下工具&#xff1a; Prisma Client&#xff1a;为 Node.js 和 TypeScript 自动生成的类型安全查询构建器Prisma Migrate&#xff1a;声明式数据建模和迁移系统Prisma Studio&#…

山人求道篇:五、交易中的大道至简与奥卡姆剃刀

量化的剃刀不是减去因子、减去代码&#xff0c;而是减去冗余信息量 市面上有的策略对各品种设置了不同参数&#xff0c;每个品种进场不一样就算了&#xff0c;出场参数还不一样&#xff0c;那你说他到底赚的是什么利润呢&#xff1f; 他自己也不知道&#xff0c;主要目的是为…

鸿蒙应用开发(二)环境搭建

开发流程 IDE下载 首先下载HUAWEI DevEco Studio&#xff0c;介绍首次启动DevEco Studio的配置向导&#xff1a; 运行已安装的DevEco Studio&#xff0c;首次使用&#xff0c;请选择Do not import settings&#xff0c;单击OK。安装Node.js与ohpm。node.js 是基于 V8 引擎构…

JavaScript常用技巧专题二

文章目录 一、前言二、生成随机字符串三、转义HTML特殊字符四、单词首字母大写五、将字符串转换为小驼峰六、删除数组中的重复值七、移除数组中的假值八、获取两个数字之间的随机数九、将数字截断到固定的小数点十、日期10.1、计算两个日期之间天数10.2、从日期中获取是一年中的…

【Java编程实现 9 * 9 乘法表格打印四种形态,七种打法】

Java编程实现 9 * 9 乘法表格打印四种形态&#xff0c;七种方法打印 废话篇打印 9 * 9 乘法表格嵌套for循环实现左下角打印嵌套for循环实现左上角打印嵌套for循环实现右上角打印嵌套for循环实现右下角打印 使用while循环打印 9 * 9 乘法表格&#xff08;一&#xff09;使用whil…

1003 我要通过!

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件&#xff0c;系统就输出“答案正确”&#xff0c;否则输出“答案错误”。 得到“答案正确”的条件是&#xff1a; 字符串中必须仅有 P、 A、 T这三种…

详解Keras3.0 Layers API: Core layers

1、Input keras.Input(shapeNone,batch_sizeNone,dtypeNone,sparseNone,batch_shapeNone,nameNone,tensorNone, ) 参数说明 shape: 输入张量的形状。如果为None&#xff0c;则可以动态地指定形状。batch_size: 批处理大小。如果为None&#xff0c;则可以动态地指定批处理大小…

基于SpringBoot+Vue前后端分离的景点数据分析平台(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

awt中文乱码-Intellij IDEA

乱码的根本原因在于秦始皇嘎太早了&#xff08;bushi 解决方法&#xff1a;肉眼可见的编码设置统一为GBK 1.打开设置找到文件编码 2.肉眼可见的编码统统改成GBK 有人该问了&#xff0c;为什么不改成utf-8&#xff0c;因为awt的编码由操作系统决定&#xff0c;我的是win家庭中…

Nextui使用

安装和使用 https://nextui.org/docs/frameworks/nextjs 自定义主题 https://nextui.org/docs/customization/customize-theme // tailwind.config.js const {nextui} require("nextui-org/react");/** type {import(tailwindcss).Config} */ module.exports {…

deepstream docker安装

介绍 deepstream为dGPU和Jetson平台提供dockers containers&#xff0c;这些镜像可以方便开发者很快地部署deepstream应用。deepstream的docker images可以在NGC web中得到。 安装Docker Docker 是一个开源的容器化平台&#xff0c;它允许你构建&#xff0c;测试&#xff0c…

29. 如何在Spring所有BeanDefinition注册完后做扩展?

如何在Spring所有BeanDefinition注册完后做扩展? 通常可以使用beanFactoryPostProcessor 对已注册的BeanDefinition进行修改或者通过它的子接口BeanDefinitionRegistryPostProcessor 再进行注册额外扩展 BeanDefinitionRegistryPostProcessor 1、概述 public interface Bea…

0基础学java-day18-( 坦克大战【2】)

课件资源放在文末 1.线程-应用到坦克大战 1.1 坦克大战 0.3 【坦克类&#xff1a;包括坦克的基本属性&#xff0c;以及坦克的移动方法】 package com.hspedu.tankgame03;/*** author 韩顺平* version 1.0*/ public class Tank {private int x;//坦克的横坐标private int y;…