Oracle LiveLabs实验:Improve application performance with True Cache

news2024/9/21 22:50:18

此实验申请地址在这里,时间为120分钟。

帮助见这里。

简介

参加本次动手实践研讨会,了解如何使用 True Cache 通过卸载查询和减少对主数据库的请求和连接数量来提高可扩展性。本次研讨会基于连接到配置了 True Cache 的主数据库的计算实例(在线事务处理应用程序)。演示应用程序是一个使用 23ai JDBC 驱动程序的 Java 程序。它模拟了主数据库的大量事务,以及如何将只读查询卸载到 true cache 来帮助提高应用程序性能。

Oracle Database True Cache 是一种内存中、一致且自动管理SQL键值(对象)缓存。从概念上讲,True Cache 是一种无磁盘 Active Data Guard (ADG)。当数据库成为瓶颈时,许多大型 Web 应用程序都会面临性能问题。参加本次动手实践研讨会,了解如何使用 True Cache 通过卸载查询和减少对主数据库的请求和连接数量来提高可扩展性。

为什么要使用 True Cache?即使没有对数据进行分区,True Cache 也可用于扩展以读取为主的应用程序。当主数据库成为瓶颈时,True Cache 可用于卸载主数据库并扩展工作负载。此外,单个查询中的数据始终是一致且最新的,当跨多行连接(join)时,这一点很重要。

一些问题:

  • 对象缓存,对象指的是什么?Segment, Row set?
  • 我只访问几行,需要把整个表拿过来吗?
  • 内存不够怎么办,内存需要多大?也是LRU算法吗?

在这里插入图片描述
本实验目标为了解如何使用 True Cache 通过卸载查询和减少对主数据库的请求和连接数量来提高可扩展性。

完成设置后,下一个实验将涵盖:

  • 创建数据并将其加载到基于事务的模式
  • 运行基于 Java 的应用程序,使用 jdbc 连接到数据库,并首先针对主数据库运行不同的事务,然后针对 True Cache 实例运行不同的事务,以显示 True Cache 如何提高应用程序性能。

先决条件(可选)

  • 最好熟悉 Oracle 数据库,但这不是必需的
  • 最好熟悉 Java 和 JDBC,但这不是必需的
  • 对云和数据库术语有所了解会有所帮助
  • 熟悉 Oracle 云基础设施 (OCI) 会有所帮助

实验 1:初始化环境

任务 1:验证所需进程是否已启动并正在运行。

  1. 按照以下指示进行操作,以验证您的环境,然后再开始执行后续实验。以下进程应已启动并正在运行:
  • Oracle 主数据库容器
  • Oracle True Cache 容器
  • 客户端应用容器
  1. 打开终端会话并按照以下指示进行操作以验证服务。
$ sudo podman ps -a
CONTAINER ID  IMAGE                                              COMMAND               CREATED       STATUS         PORTS       NAMES
df86e4394197  localhost/oracle/database-ext-truecache:23.4.0-ee  /bin/sh -c exec $...  2 months ago  Up 27 minutes              prod
c6ef9520bf62  localhost/oracle/database-ext-truecache:23.4.0-ee  /bin/sh -c exec $...  2 months ago  Up 26 minutes              truedb
078364fd5b61  container-registry.oracle.com/os/oraclelinux:8     /usr/sbin/init        2 months ago  Up 27 minutes              appclient

如果容器已停止且未处于运行状态,则尝试使用以下 docker 命令重新启动它。

sudo podman stop <container ID/NAME>
sudo podman start <container ID/NAME>

对于多个容器,运行以下命令一次性重新启动所有容器:

sudo podman container stop $(sudo podman container list -qa)
sudo podman container start $(sudo podman container list -qa)

实验 2:将数据加载到数据库

在本实验中,您将创建事务处理模式并将数据加载到其中。

关于 Oracle True Cache
现代应用程序通常需要在连接数和可缓存的数据量方面具有巨大的可扩展性。

一种流行的方法是将缓存放在数据库前面。这些缓存依赖于应用程序通常不需要查看最新数据的事实。例如,当有人浏览航班预订系统时,系统可以显示一秒钟前的航班数据。当有人预订航班时,系统将显示最新数据。

Oracle True Cache 仅使用其缓冲区缓存中的数据来满足查询。与 Oracle Active Data Guard 一样,True Cache 是主数据库的全功能只读复制,只是它基本上是无盘的。

在本实验中,您将:

  • 了解如何在新创建的环境中创建模式,创建表。
  • 将数据上传到这些表

任务 1:创建用户和表

登入主数据库所在服务器:

$ sudo podman exec -it prod /bin/bash
bash-4.4$

登入数据库,运行脚本step1.sql:

bash-4.4$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Production on Wed Jul 24 01:12:22 2024
Version 23.4.0.24.05

Copyright (c) 1982, 2024, Oracle.  All rights reserved.


Connected to:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - Production
Version 23.4.0.24.05

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB1                       READ WRITE NO

SQL> alter session set container=orclpdb1;

Session altered.

SQL> @step1

User dropped.


User created.


Grant succeeded.


Grant succeeded.


Grant succeeded.


Grant succeeded.


Grant succeeded.

step1.sql 创建用户transactions 并赋权:

rem
rem Connect to pdb as sys
rem

DROP USER IF EXISTS transactions CASCADE ;

CREATE USER transactions identified BY WElcome_#12;

GRANT CONNECT, RESOURCE    TO transactions;

GRANT SELECT_CATALOG_ROLE  TO transactions;

GRANT UNLIMITED TABLESPACE TO transactions;

GRANT ALL PRIVILEGES       TO transactions;

GRANT DBA                  TO transactions;

当前注册到监听的服务如下:

$ lsnrctl status

LSNRCTL for Linux: Version 23.0.0.0.0 - Production on 24-JUL-2024 01:16:50

Copyright (c) 1991, 2024, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=prod)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 23.0.0.0.0 - Production
Start Date                24-JUL-2024 00:33:49
Uptime                    0 days 0 hr. 43 min. 1 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/23ai/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/prod/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=prod)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "19387f2c53b50cf0e063020114ac67bc" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "ORCLCDB" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "ORCLCDBXDB" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "SALES1" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "SALES1_TC" has 1 instance(s).
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...
Service "SALES2" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "SALES2_TC" has 1 instance(s).
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...
Service "SALES3" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "SALES3_TC" has 1 instance(s).
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...
Service "SALES4" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "SALES4_TC" has 1 instance(s).
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...
Service "TRUEDB" has 1 instance(s).
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...
Service "orclpdb1" has 2 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...
The command completed successfully

以transactions用户登录SALES服务,但每次都是登录到TRUEDB库,而TRUEDB库作为备库是只读的:

$ sqlplus transactions/WElcome_#12@orclpdb1

只好,以sys用户登录,但以transactions用户执行step2和step3:

SQL> show user
USER is "SYS"
SQL> alter session set container=orclpdb1;

Session altered.

SQL> alter session set current_schema=transactions;

Session altered.

SQL> @step2

Function created.

SQL> @step3

Table dropped.


Table dropped.


Sequence dropped.


Sequence created.


Table created.


Table created.

SQL> show user
USER is "SYS"

任务 2:将数据加载到表中

执行step4,加载数据,这一步时间稍长:

SQL> alter session set container=orclpdb1;

Session altered.

SQL> alter session set current_schema=transactions;

Session altered.

SQL> @step4

Table truncated.

Elapsed: 00:00:00.04

2000000 rows created.

Commit complete.
Elapsed: 00:00:08.15
  1  INSERT INTO transactions.accounts
  2  SELECT transactions.country_cd_from_account_id(n)
  3        ,n
  4        ,n
  5        ,10000
  6        ,SYS_EXTRACT_UTC(SYSTIMESTAMP)
  7  FROM   (
  8          SELECT &&initial_value + LEVEL - 1 AS n
  9          FROM dual
 10          CONNECT BY LEVEL <= &&final_value - &&initial_value + 1
 11*        )

2000000 rows created.

Commit complete.
Elapsed: 00:00:08.42
  1  INSERT INTO transactions.accounts
  2  SELECT transactions.country_cd_from_account_id(n)
  3        ,n
  4        ,n
  5        ,10000
  6        ,SYS_EXTRACT_UTC(SYSTIMESTAMP)
  7  FROM   (
  8          SELECT &&initial_value + LEVEL - 1 AS n
  9          FROM dual
 10          CONNECT BY LEVEL <= &&final_value - &&initial_value + 1
 11*        )

2000000 rows created.

Commit complete.
Elapsed: 00:00:13.66
  1  INSERT INTO transactions.accounts
  2  SELECT transactions.country_cd_from_account_id(n)
  3        ,n
  4        ,n
  5        ,10000
  6        ,SYS_EXTRACT_UTC(SYSTIMESTAMP)
  7  FROM   (
  8          SELECT &&initial_value + LEVEL - 1 AS n
  9          FROM dual
 10          CONNECT BY LEVEL <= &&final_value - &&initial_value + 1
 11*        )

2000000 rows created.

Commit complete.
Elapsed: 00:00:13.07
  1  INSERT INTO transactions.accounts
  2  SELECT transactions.country_cd_from_account_id(n)
  3        ,n
  4        ,n
  5        ,10000
  6        ,SYS_EXTRACT_UTC(SYSTIMESTAMP)
  7  FROM   (
  8          SELECT &&initial_value + LEVEL - 1 AS n
  9          FROM dual
 10          CONNECT BY LEVEL <= &&final_value - &&initial_value + 1
 11*        )

2000000 rows created.

Commit complete.
Elapsed: 00:00:18.51
  1  INSERT INTO transactions.accounts
  2  SELECT transactions.country_cd_from_account_id(n)
  3        ,n
  4        ,n
  5        ,10000
  6        ,SYS_EXTRACT_UTC(SYSTIMESTAMP)
  7  FROM   (
  8          SELECT &&initial_value + LEVEL - 1 AS n
  9          FROM dual
 10          CONNECT BY LEVEL <= &&final_value - &&initial_value + 1
 11*        )

2000000 rows created.

Commit complete.
Elapsed: 00:00:12.16
  1  INSERT INTO transactions.accounts
  2  SELECT transactions.country_cd_from_account_id(n)
  3        ,n
  4        ,n
  5        ,10000
  6        ,SYS_EXTRACT_UTC(SYSTIMESTAMP)
  7  FROM   (
  8          SELECT &&initial_value + LEVEL - 1 AS n
  9          FROM dual
 10          CONNECT BY LEVEL <= &&final_value - &&initial_value + 1
 11*        )

2000000 rows created.

Commit complete.
Elapsed: 00:00:12.34
  1  INSERT INTO transactions.accounts
  2  SELECT transactions.country_cd_from_account_id(n)
  3        ,n
  4        ,n
  5        ,10000
  6        ,SYS_EXTRACT_UTC(SYSTIMESTAMP)
  7  FROM   (
  8          SELECT &&initial_value + LEVEL - 1 AS n
  9          FROM dual
 10          CONNECT BY LEVEL <= &&final_value - &&initial_value + 1
 11*        )

2000000 rows created.

Commit complete.
Elapsed: 00:00:12.00
  1  INSERT INTO transactions.accounts
  2  SELECT transactions.country_cd_from_account_id(n)
  3        ,n
  4        ,n
  5        ,10000
  6        ,SYS_EXTRACT_UTC(SYSTIMESTAMP)
  7  FROM   (
  8          SELECT &&initial_value + LEVEL - 1 AS n
  9          FROM dual
 10          CONNECT BY LEVEL <= &&final_value - &&initial_value + 1
 11*        )

2000000 rows created.

Commit complete.
Elapsed: 00:00:13.01
  1  INSERT INTO transactions.accounts
  2  SELECT transactions.country_cd_from_account_id(n)
  3        ,n
  4        ,n
  5        ,10000
  6        ,SYS_EXTRACT_UTC(SYSTIMESTAMP)
  7  FROM   (
  8          SELECT &&initial_value + LEVEL - 1 AS n
  9          FROM dual
 10          CONNECT BY LEVEL <= &&final_value - &&initial_value + 1
 11*        )

2000000 rows created.

Commit complete.
Elapsed: 00:00:12.81
  1  INSERT INTO transactions.accounts
  2  SELECT transactions.country_cd_from_account_id(n)
  3        ,n
  4        ,n
  5        ,10000
  6        ,SYS_EXTRACT_UTC(SYSTIMESTAMP)
  7  FROM   (
  8          SELECT &&initial_value + LEVEL - 1 AS n
  9          FROM dual
 10          CONNECT BY LEVEL <= &&final_value - &&initial_value + 1
 11*        )

2000000 rows created.

Commit complete.
Elapsed: 00:00:13.23
  1  INSERT INTO transactions.accounts
  2  SELECT transactions.country_cd_from_account_id(n)
  3        ,n
  4        ,n
  5        ,10000
  6        ,SYS_EXTRACT_UTC(SYSTIMESTAMP)
  7  FROM   (
  8          SELECT &&initial_value + LEVEL - 1 AS n
  9          FROM dual
 10          CONNECT BY LEVEL <= &&final_value - &&initial_value + 1
 11*        )

2000000 rows created.

Commit complete.
Elapsed: 00:00:14.61

PL/SQL procedure successfully completed.

Commit complete.
Elapsed: 00:00:06.62

任务 3:验证 True Cache

$ sudo podman exec -it truedb /bin/bash
bash-4.4$

$ lsnrctl status

LSNRCTL for Linux: Version 23.0.0.0.0 - Production on 24-JUL-2024 02:27:51

Copyright (c) 1991, 2024, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=TCP)(HOST=truedb)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 23.0.0.0.0 - Production
Start Date                24-JUL-2024 00:34:28
Uptime                    0 days 1 hr. 53 min. 23 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/23ai/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/truedb/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=truedb)(PORT=1521)))
Services Summary...
Service "SALES1_TC" has 1 instance(s).
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...
Service "SALES2_TC" has 1 instance(s).
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...
Service "SALES3_TC" has 1 instance(s).
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...
Service "SALES4_TC" has 1 instance(s).
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...
Service "TRUEDB" has 2 instance(s).
  Instance "TRUEDB", status UNKNOWN, has 1 handler(s) for this service...
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...
Service "orclpdb1" has 1 instance(s).
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...
The command completed successfully

$ sqlplus transactions/WElcome_#12@orclpdb1

SQL*Plus: Release 23.0.0.0.0 - Production on Wed Jul 24 02:29:21 2024
Version 23.4.0.24.05

Copyright (c) 1982, 2024, Oracle.  All rights reserved.


Connected to:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - Production
Version 23.4.0.24.05

SQL> select database_role from v$database;

DATABASE_ROLE
----------------
TRUE CACHE

实验 3:通过 jdbc 使用 True Cache

在此实验中,您将通过 jdbc 测试与 true cache 的连接,然后首先针对主数据库运行事务处理应用程序,然后针对 true cache 实例运行事务处理应用程序,并观察性能的改进。

应用程序使用主数据库的单个数据库应用程序服务名称维护一个逻辑连接,而 JDBC Thin 驱动程序(Oracle Database 23ai 及更高版本)维护两个物理连接。应用程序通过特殊调用将逻辑连接标记为只读或读写,从而控制 True Cache 和主数据库实例之间的读/写拆分。此模式仅适用于基于 JDBC 的应用程序

此处使用的应用程序是一个事务处理应用程序,它对数据库执行各种事务操作。其中一些操作包括获取客户余额、获取客户详细信息、更新余额。每个线程模拟执行不同操作的用户。

在本实验中,您将:

  • 在连接到主数据库时运行应用程序
  • 在连接到 True Cache 时运行应用程序并观察性能差异

任务 1:运行应用程序

登录客户端:

$ sudo podman exec -it appclient /bin/bash
[root@appclient /]#

查看示例程序:

# cd /stage/clientapp
# ls -l
total 8220
-rwxr-xr-x. 1 1000 1000     638 May 24 19:40 TransactionApp.sh
-rw-r--r--. 1 1000 1000    9868 Aug  6  2023 Transactions_TrueCache.class
-rw-r--r--. 1 1000 1000   12246 Aug  6  2023 Transactions_TrueCache.java
-rw-r--r--. 1 1000 1000 6917992 Aug  3  2023 ojdbc8.jar
-rw-r--r--. 1 1000 1000 1469874 Aug  3  2023 ucp.jar

查看运行脚本,这个脚本比较了两次运行的性能,这两次运行的差异只在最后那个参数上有区别,即true和false:

# cat TransactionApp.sh
#!/bin/sh

ARGS="$@"

JAVA_HOME=/stage/jdk-17.0.6
PATH=$JAVA_HOME/bin:$PATH
CURRENT_DIR="$PWD"
export JAVA_HOME
export PATH
echo "CURRENT DIRECTORY : $CURRENT_DIR"
echo "Using JAVA_HOME :$JAVA_HOME"
echo "Now running Transactions against Primary database for 2 minutes with 50 users"
java -cp $CURRENT_DIR/ojdbc8.jar:$CURRENT_DIR/ucp.jar:. Transactions_TrueCache \ "prod:1521/sales1" transactions WElcome_#12 50 120 false
echo "Now running Transactions against True Cache for 2 minutes with 50 users"
java -cp $CURRENT_DIR/ojdbc8.jar:$CURRENT_DIR/ucp.jar:. Transactions_TrueCache \ "prod:1521/sales1" transactions WElcome_#12 50 120 true

脚本的成功结果确保 jdbc 能够通过 oracle.jdbc.useTrue CacheDriverConnection=true 参数连接到 True Cache 实例。

# ./TransactionApp.sh
CURRENT DIRECTORY : /stage/clientapp
Using JAVA_HOME :/stage/jdk-17.0.6
Now running Transactions against Primary database for 2 minutes with 50 users

        Beginning of the transaction test!!!


Result Summary

Number of transactions completed: 163650
Transactions per second: 1363
Read Only Transactions per second: 909

Number of selects completed: 218200
Number of updates completed: 54550
Number of inserts completed: 54550

Number of commits completed: 54550
Now running Transactions against True Cache for 2 minutes with 50 users

        Beginning of the transaction test!!!

Using True cache for select statements now

Result Summary

Number of transactions completed: 188550
Transactions per second: 1571
Read Only Transactions per second: 1047

Number of selects completed: 251400
Number of updates completed: 0
Number of inserts completed: 0

Number of commits completed: 0

通过运行 TransactionApp.sh 来运行应用程序,这将首先针对主服务器运行该应用程序 2 分钟,然后使用 50 个线程针对 True Cache 实例运行该应用程序 2 分钟。

遗留问题

如果一个服务对应2个实例,那如何登录到指定的实例呢?本例为TRUEDB:

Service "orclpdb1" has 2 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
  Instance "TRUEDB", status READY, has 1 handler(s) for this service...

参考

  • Oracle True Cache Technical Architecture
  • Oracle True Cache User’s Guide
  • https://github.com/oracle-livelabs/database/tree/main/truecache
  • https://stackoverflow.com/questions/22049212/copying-files-from-docker-container-to-host

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

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

相关文章

从零手写实现 mybatis 系列(零)mybatis 核心特性

拓展阅读 第一节 从零开始手写 mybatis&#xff08;一&#xff09;MVP 版本 中我们实现了一个最基本的可以运行的 mybatis。 第二节 从零开始手写 mybatis&#xff08;二&#xff09;mybatis interceptor 插件机制详解 第三节 从零开始手写 mybatis&#xff08;三&#xff0…

最低工资标准数据(2001-2023年不等)、省市县,整理好的面板数据(excel格式)

时间范围&#xff1a;2001-2022年 具体内容&#xff1a;一&#xff1a;最低工资数据标准时间&#xff1a;2012-2021包含指标&#xff1a; 省份城市/区县小时最低工资标准&#xff08;非全日制&#xff09;月最低工资标准实施日期 样例数据&#xff1a; 二&#xff1a;各省最低…

Spring Cloud Gateway网关的高级特性之GatewayFilter Factories(路由过滤器)

1、GatewayFilter Factories&#xff08;路由过滤器&#xff09; 官方访问地址&#xff1a;点击这里 来自官方的解释如下图所示&#xff1a; 简单来说就是&#xff1a; 客户端向 Spring Cloud Gateway 发送请求。如果请求与某个路由匹配&#xff0c;则该请求会被传递给 Ga…

OpenEuler安装部署教程

目录 OpenEuler安装部署教程 MobaXterm一款全能的远程工具 yum安装软件 vim编辑器&#xff08;了解&#xff09; 防火墙 常用命令 网络工具netstat & telnet 进程管理工具top ps 磁盘free、fdisk 用户、组&#xff08;了解&#xff09; 权限&#xff08;了解&am…

实验3-9 三天打鱼两天晒网

//实验3-9 三天打鱼两天晒网/* 中国有句俗语叫“三天打鱼两天晒网”。 假设某人从某天起&#xff0c;开始“三天打鱼两天晒网”&#xff0c; 问这个人在以后的第N天中是“打鱼”还是“晒网”&#xff1f; */#include<stdio.h> #include<math.h> int main(){int n; …

Photoshop的下载和安装教程

找到Adobe 的官网 https://www.adobe.com/cn/ 创建一个新的账户,如果你没有账户的话 后面安装步骤来注册 下载和安装 登录之后 点击 点击 点击 然后进行下载和安装 然后就是漫长的等待 安装完成 点击 这只是一个安装Photoshop的教程,也可以根据别人的安装包来进行安装

ThreadPoolExecutor工作原理及源码详解

一、前言 创建一个线程可以通过继承Thread类或实现Runnable接口来实现&#xff0c;这两种方式创建的线程在运行结束后会被虚拟机回收并销毁。若线程数量过多&#xff0c;频繁的创建和销毁线程会浪费资源&#xff0c;降低效率。而线程池的引入就很好解决了上述问题&#xff0c;…

万字详解 MapStruct Plus,带你快速上手!

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 前言一、为什么要用 MapStruct&#xff08;背景&#xff09;二、MapStruct Plus 的快速开始1. 引入依赖2. 指定对象映射关系3. 编写测试代码4. 运行结果5. 原理解析 三、自定义实体类中的属性转换1. 自定义一个类型…

【IO】使用父子进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,子进程结束后退出,父进程回收子进程的资源

1、使用父子进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半内容&#xff0c;子进程拷贝后一半内容&#xff0c;子进程结束后退出&#xff0c;父进程回收子进程的资源 #include <myhead.h>int main(int argc, const char *argv[]) {//判断输入的格式是否符合要求i…

预测性维护:一种基于因果技术语言处理 (CTLP) 的智能故障诊断方法

关键词&#xff1a;预测性维护、因果贝叶斯网络、ROX数据 在工业运营和维护领域&#xff0c;资产绩效最大化和风险最小化至关重要。随着工业设备组件的磨损和恶化&#xff0c;系统会表现出一系列变化&#xff0c;这些变化的严重程度会逐渐增加&#xff0c;直到最终发生故障。在…

C++_string_知识总结(初学)

基础认识&#xff1a; string严格意义上不属于STL容器&#xff0c;其出现的时间早于STL&#xff0c;这也导致了string官方库中部分函数冗余。但是这也体现了语言发展中的一个重要现象——向前兼容。和很多STL容器一样&#xff0c;string是一个类&#xff0c;核心是一个顺序表&…

MySQL:GROUP BY 分组查询

分组查询是SQL中一个非常强大的功能&#xff0c;它允许我们将数据按照一个或多个字段进行分组&#xff0c;并对每个分组进行聚合计算&#xff08;如求和、平均值、最大值、最小值等&#xff09;。在MySQL中&#xff0c;我们使用 GROUP BY 关键字来实现分组查询。 核心语法 SE…

笑出腹肌的饼图绘制秘籍:Matplotlib让你秒变数据烘焙大师!

1. 引言 亲们&#xff0c;还在为数据报告里的饼图头疼吗&#xff1f;别怕&#xff0c;Matplotlib来救场啦&#xff01;它不只是个绘图工具&#xff0c;简直是数据界的魔术师&#xff0c;让你的饼图既专业又有趣。跟我学几招&#xff0c;保证让你的观众边吃边看&#xff0c;爱不…

Linux驱动开发—编写第一个最简单的驱动模块

文章目录 开发驱动准备工作1.正常运行的Linux系统的开发板2.内核源码树3.nfs挂载的rootfs4.得心趁手的IDE 第一个Hello world 驱动程序常见模块的操作命令模块的初始化和清理模块的版本信息模块中的各种宏 示例Hello World代码printk函数解析 使用MakeFile编译驱动模块使用insm…

谷歌账号异常,成功通过验证后这个界面操作指引:建议增加辅助手机和邮箱

许多朋友对下面这个界面都很熟悉&#xff0c;通常是账号被停用后的时候输入账号和密码后&#xff0c;还需要再次输入手机号码验证。而且这个时候输入国内的号码或者谷歌账号绑定的辅助手机号码都不管用&#xff0c;提示此电话号码用于验证的次数过多&#xff0c;或者此电话号码…

链表篇:03-合并有序链表

解题思路&#xff1a; 使用双指针&#xff0c;一个指针指向头节点&#xff0c;然后另外一个指针进行移动。让其头节点保持不动&#xff0c;最后循环遍历两个链表&#xff0c;将其挂到头指针所在的节点上。 temp 守卫节点&#xff0c;用于指向头节点&#xff0c;防止头节点丢…

机械学习—零基础学习日志(高数17——极限局部有界性)

零基础为了学人工智能&#xff0c;真的开始复习高数 这里我们更加详细讲解函数极限性质。上一篇文章里有一些内容还需要进一步补充。 局部有界性 这里是局部有界性的需要注意的事项。第3点&#xff0c;如果函数在闭区间内连续&#xff0c;则必定有界。试想一下&#xff0c;如…

Log4j2漏洞

Log4j2漏洞 步骤一:执行以下命令启动靶场环境并在浏览器访问!!! systemctl start docker cd vulhub/log4j/CVE-2021-44228 vi docker-compose.yml //编写docker-compose.xml的端口和版本号 docker-compose up -d # 访问网址 http://192.168.30.131:8983/solr/#/步骤二:先在自…

MyBatis入门如何使用操作数据库及常见错误(yml配置)

一&#xff0c;什么是MyBatis 是一款优秀的持久层框架&#xff0c;用于简化jdbc的开发 持久层&#xff1a;指的就是持久化操作的层&#xff0c;通常也就是数据访问层&#xff08;dao&#xff09;&#xff0c;也就是用来操作数据库。 也就是MyBatis是让你更加简单完成程序与数…

ECCV 2024前沿科技速递:GLARE-基于生成潜在特征的码本检索点亮低光世界,低光环境也能拍出明亮大片!

在计算机视觉与图像处理领域&#xff0c;低光照条件下的图像增强一直是一个极具挑战性的难题。暗淡的光线不仅限制了图像的细节表现&#xff0c;还常常引入噪声和失真&#xff0c;极大地影响了图像的质量和可用性。然而&#xff0c;随着ECCV 2024&#xff08;欧洲计算机视觉会议…