[20190402]Library Cache mutex.txt

来源:https://www.cnblogs.com/lfree/archive/2019/04/02/10643307.html
-Advertisement-
Play Games

[20190402]Library Cache mutex.txt1.環境:SCOTT@book> @ ver1PORT_STRING VERSION BANNER x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Editi ...


[20190402]Library Cache mutex.txt

1.環境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

$ cat m2.txt
set verify off
column a noprint new_value v_a;
--select mod ( &&3 ,3) a  from dual ;
--alter session set optimizer_index_cost_adj= &&3;
host sleep $(echo &&3/50| bc -l )
insert into job_times values ( sys_context ('userenv', 'sid') ,dbms_utility.get_time ,'&&2') ;
commit ;
declare
v_id number;
v_d date;
begin
    for i in 1 .. &&1 loop
        --select  1 into v_id from dual ;
        --select  sysdate into v_d from dual ;
        select deptno into v_id from dept where deptno=10;
    end loop;
end ;
/
update job_times set time_ela = dbms_utility.get_time - time_ela where sid=sys_context ('userenv', 'sid') and method='&&2';
commit;
--quit

--//執行許多次,就可以在 x$mutex_sleep_history有記錄,出現MUTEX_TYPE='Library Cache'的情況
$ seq 150 | xargs -I {}  -P 150 bash -c  "sqlplus -s -l scott/book @m2.txt 1e6 f2_150 {} >/dev/null"

SYS@book> @ mutexy 16 a31kd5tkdvvmm
      HASH SUM_SLEEPS   SUM_GETS LOCATION                       MUTEX_TYPE           MUTEX_ADDR       SQLID         KGLNAOWN C100
---------- ---------- ---------- ------------------------------ -------------------- ---------------- ------------- -------- ---------------------------------------
1692266099  161187946  600188278 kksfbc [KKSCHLPIN1]            Cursor Pin           000000007C88E330 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
1692266099    9215322 1.8927E+11 kksLockDelete [KKSCHLPIN6]     Cursor Pin           000000007C88E330 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
1692266099    5019588 1.0546E+11 kksfbc [KKSCHLFSP2]            Cursor Pin           000000007C88E330 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
1692266099    1351526   63672414 kgllkc1   57                   Library Cache        000000007C957128 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
1692266099     499588    9089718 kkslce [KKSCHLPIN2]            Cursor Pin           000000007C957128 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
1692266099     212212    3838112 kglGetHandleReference 124      Library Cache        000000007C957128 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
1692266099     131248    1919076 kgllkdl1  85                   Library Cache        000000007C957128 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
1692266099      10118    1814754 kglhdgn2 106                   Library Cache        000000007C957128 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
8 rows selected.

--//探究MUTEX_TYPE='Library Cache',MUTEX_ADDR='000000007C957128'在哪裡,還有1個LOCATION問題?
--//我執行許多次才出現這樣的情況.

2.分析:

SYS@book> @ fcha 000000007C957128
Find in which heap (UGA, PGA or Shared Pool) the memory address 000000007C957128 resides...
WARNING!!! This script will query X$KSMSP, which will cause heavy shared pool latch contention
in systems under load and with large shared pool. This may even completely hang
your instance until the query has finished! You probably do not want to run this in production!
Press ENTER to continue, CTRL+C to cancel...

LOC KSMCHPTR           KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR
--- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ----------------
SGA 000000007C956FB8          1          1 KGLHD                   560 recr             80 00

--//執行如下,也可以獲得類似結果:
SELECT * FROM x$ksmsp WHERE TO_NUMBER ('000000007C957128', 'xxxxxxxxxxxxxxxx') between TO_NUMBER(KSMCHPTR, 'xxxxxxxxxxxxxxxx') and TO_NUMBER(KSMCHPTR, 'xxxxxxxxxxxxxxxx')+KSMCHSIZ -1;
ADDR                   INDX    INST_ID   KSMCHIDX   KSMCHDUR KSMCHCOM         KSMCHPTR           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00007F3CEDE1A5B8      16459          1          1          1 KGLHD            000000007C956FB8        560 recr             80 00


SYS@book> @ sharepool/shp4 a31kd5tkdvvmm 0
TEXT           KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
-------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
子游標句柄地址 000000007C7F8B90 000000007C956FE8 SELECT DEPTNO FROM DEPT WHERE DEPTNO=10           0          0          0 000000007C4468D8 000000007C88E3D8       4528       8088       3072     15688      15688 1692266099 a31kd5tkdvvmm          0
父游標句柄地址 000000007C956FE8 000000007C956FE8 SELECT DEPTNO FROM DEPT WHERE DEPTNO=10           0          0          0 000000007CA7BFE8 00                     4720          0          0      4720       4720 1692266099 a31kd5tkdvvmm      65535
--//可以發現MUTEX_ADDR='000000007C957128'的地址與父游標句柄的地址比較接近.實際上從KSMCHCOM=KGLHD也可以確定,

SYS@book> @ fcha 000000007C956FE8
Find in which heap (UGA, PGA or Shared Pool) the memory address 000000007C956FE8 resides...

WARNING!!! This script will query X$KSMSP, which will cause heavy shared pool latch contention
in systems under load and with large shared pool. This may even completely hang
your instance until the query has finished! You probably do not want to run this in production!

Press ENTER to continue, CTRL+C to cancel...

LOC KSMCHPTR           KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR
--- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ----------------
SGA 000000007C956FB8          1          1 KGLHD                   560 recr             80 00

SELECT * FROM x$ksmsp WHERE TO_NUMBER ('000000007C956FE8', 'xxxxxxxxxxxxxxxx') between TO_NUMBER(KSMCHPTR, 'xxxxxxxxxxxxxxxx') and TO_NUMBER(KSMCHPTR, 'xxxxxxxxxxxxxxxx')+KSMCHSIZ-1;
ADDR                   INDX    INST_ID   KSMCHIDX   KSMCHDUR KSMCHCOM         KSMCHPTR           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR
---------------- ---------- ---------- ---------- ---------- ---------------- ---------------- ---------- -------- ---------- ----------------
00007F3CEDDFBC00      12611          1          1          1 KGLHD            000000007C956FB8        560 recr             80 00

--//library cache mutex結構體在父游標句柄地址裡面.
--//0x7C957128=2090168616 0x7C956FB8=2090168248 2090168616-2090168248 = 368,在父游標句柄地址偏移368位元組處.

3.知道地址就可以模擬問題產生:
--//session 1:
SCOTT@book> @ spid

       SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
        32         35 10708                    DEDICATED 10709       26         84 alter system kill session '32,35' immediate;
--//32=0x20

--//session 2:
SYS@book> oradebug setmypid
Statement processed.

SYS@book> oradebug peek 0x000000007C957128 8
[07C957128, 07C957130) = 00000000 00000000

SYS@book> oradebug poke 0x000000007C957128 8 0x0000004400000020
BEFORE: [07C957128, 07C957130) = 00000000 00000000
AFTER:  [07C957128, 07C957130) = 00000020 00000044

--//session 1:
SCOTT@book> @ m2.txt 1 c1 0
1 row created.
Commit complete.
--//掛起!!註第一次執行會掛起,第2次就不會了.

--//session 2:
SYS@book> @ wait
P1RAW            P2RAW            P3RAW                    P1         P2         P3        SID    SERIAL#       SEQ# EVENT                  STATUS   STATE   WAIT_TIME_MICRO SECONDS_IN_WAIT WAIT_CLASS
---------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------------- -------- ------- --------------- --------------- -----------
0000000064DDEE73 0000004400000020 0000000000000039 1692266099 2.9206E+11         57         32         33         38 library cache: mutex X ACTIVE   WAITING        35878972              36 Concurrency
--//出現library cache: mutex X 等待.

SYS@book> oradebug poke 0x000000007C957128 8 0x0
BEFORE: [07C957128, 07C957130) = 00000020 00000044
AFTER:  [07C957128, 07C957130) = 00000000 00000000

--//再次執行,因為該游標已經cache. PL/sql語句中的sql語句與sqlplus執行的sql語句方式不同.

SYS@book> select * from v$open_cursor where sql_id='a31kd5tkdvvmm';
SADDR             SID USER_NAME ADDRESS          HASH_VALUE SQL_ID        SQL_TEXT                                LAST_SQL_ACTIVE_TIM SQL_EXEC_ID CURSOR_TYPE
---------------- ---- --------- ---------------- ---------- ------------- --------------------------------------- ------------------- ----------- --------------------
000000008635DE10   32 SCOTT     000000007C956FE8 1692266099 a31kd5tkdvvmm SELECT DEPTNO FROM DEPT WHERE DEPTNO=10                                 PL/SQL CURSOR CACHED
--//第一次執行就cache了.第2次執行不會在library cache上出現阻塞.

SYS@book> oradebug poke 0x000000007C957128 8 0x0000004400000020
BEFORE: [07C957128, 07C957130) = 00000000 00000000
AFTER:  [07C957128, 07C957130) = 00000020 00000044

SCOTT@book> @ m2.txt 1 c1 0
1 row created.
Commit complete.
PL/SQL procedure successfully completed.
11 rows updated.
Commit complete.

--//可以正常執行.但是退出會出現問題.
SCOTT@book> quit

--//掛起!!
SYS@book> @ wait
P1RAW            P2RAW            P3RAW                    P1         P2         P3        SID    SERIAL#       SEQ# EVENT                  STATUS   STATE   WAIT_TIME_MICRO SECONDS_IN_WAIT WAIT_CLASS
---------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------------- -------- ------- --------------- --------------- -----------
0000000064DDEE73 0000004400000020 0000000000000055 1692266099 2.9206E+11         85         32         35         57 library cache: mutex X ACTIVE   WAITING        17103974              17 Concurrency

--//還有1個情況是阻塞無法查詢x$mutex_sleep_history視圖,
SYS@book> @ mutexy 6 a31kd5tkdvvmm
--//掛起!!取消後正常!!
SYS@book> oradebug poke 0x000000007C957128 8 0x00
BEFORE: [07C957128, 07C957130) = 00000020 00000044
AFTER:  [07C957128, 07C957130) = 00000000 00000000
----

      HASH SUM_SLEEPS   SUM_GETS LOCATION                       MUTEX_TYPE           MUTEX_ADDR       SQLID         KGLNAOWN C100
---------- ---------- ---------- ------------------------------ -------------------- ---------------- ------------- -------- ---------------------------------------
1692266099  161187946  600188278 kksfbc [KKSCHLPIN1]            Cursor Pin           000000007C88E330 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
1692266099    9215322 1.8927E+11 kksLockDelete [KKSCHLPIN6]     Cursor Pin           000000007C88E330 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
1692266099    5019588 1.0546E+11 kksfbc [KKSCHLFSP2]            Cursor Pin           000000007C88E330 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
1692266099    1351526   63672414 kgllkc1   57                   Library Cache        000000007C957128 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
1692266099     499588    9089718 kkslce [KKSCHLPIN2]            Cursor Pin           000000007C957128 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
1692266099     212212    3838112 kglGetHandleReference 124      Library Cache        000000007C957128 a31kd5tkdvvmm          SELECT DEPTNO FROM DEPT WHERE DEPTNO=10
6 rows selected.

--//感覺在11g下出現Library Cache的情況性很小.library cache主要出現在sql語句登錄第1-3次執行時需要通過哈希定位檢查父游標是
--//否存在,以及是否要硬解析的情況,如果cache就不再需要了,不同會話相同語句同時執行的可能性在這裡發生阻塞的可能性很小,更容
--//易出現cursor: pin S.(我的測試也說明這個問題),加上session_cached_cursors作用,更難在這裡出現阻塞.
--//當然一些應用開始執行的語句可能都是一樣的,可能密集的登錄時偶爾出現不會成為主要矛盾.
--//不像10g,採用是latch caceh latch,而且還有數量限制.而11g是採用mutex,library cache mutex的結構體在生成的父游標句柄裡面,
--//等於打散到共用池的許多地方,出現碰撞的概率降低了.

4.附上相關腳本:
$ cat tpt/cha
channels2.sql  channels3.sql  channels.sql
[oracle@gxqyydg4 IP=100.78 ~/sqllaji ] $ cat tpt/fcha.sql
--------------------------------------------------------------------------------
--
-- File name:   fcha.sql (Find CHunk Address) v0.2
-- Purpose:     Find in which heap (UGA, PGA or Shared Pool) a memory address resides
--
-- Author:      Tanel Poder
-- Copyright:   (c) http://blog.tanelpoder.com | @tanelpoder
--
-- Usage:       @fcha <addr_hex>
--              @fcha F6A14448
--
-- Other:       This would only report an UGA/PGA chunk address if it belongs
--              to *your* process/session (x$ksmup and x$ksmpp do not see other
--              session/process memory)
--
--------------------------------------------------------------------------------

prompt Find in which heap (UGA, PGA or Shared Pool) the memory address &1 resides...
prompt
prompt WARNING!!! This script will query X$KSMSP, which will cause heavy shared pool latch contention
prompt in systems under load and with large shared pool. This may even completely hang
prompt your instance until the query has finished! You probably do not want to run this in production!
prompt
pause  Press ENTER to continue, CTRL+C to cancel...


select
    'SGA' LOC,
    KSMCHPTR,
    KSMCHIDX,
    KSMCHDUR,
    KSMCHCOM,
    KSMCHSIZ,
    KSMCHCLS,
    KSMCHTYP,
    KSMCHPAR
from
    x$ksmsp
where
    to_number(substr('&1', instr(lower('&1'), 'x')+1) ,'XXXXXXXXXXXXXXXX')
    between
        to_number(ksmchptr,'XXXXXXXXXXXXXXXX')
    and to_number(ksmchptr,'XXXXXXXXXXXXXXXX') + ksmchsiz - 1
union all
select
    'UGA',
    KSMCHPTR,
    null,
    null,
    KSMCHCOM,
    KSMCHSIZ,
    KSMCHCLS,
    KSMCHTYP,
    KSMCHPAR
from
    x$ksmup
where
    to_number(substr('&1', instr(lower('&1'), 'x')+1) ,'XXXXXXXXXXXXXXXX')
    between
        to_number(ksmchptr,'XXXXXXXXXXXXXXXX')
    and to_number(ksmchptr,'XXXXXXXXXXXXXXXX') + ksmchsiz - 1
union all
select
    'PGA',
    KSMCHPTR,
    null,
    null,
    KSMCHCOM,
    KSMCHSIZ,
    KSMCHCLS,
    KSMCHTYP,
    KSMCHPAR
from
    x$ksmpp
where
    to_number(substr('&1', instr(lower('&1'), 'x')+1) ,'XXXXXXXXXXXXXXXX')
    between
        to_number(ksmchptr,'XXXXXXXXXXXXXXXX')
    and to_number(ksmchptr,'XXXXXXXXXXXXXXXX') + ksmchsiz - 1
/

$ cat mutexy.sql
column kglnaown format a20
column MUTEX_TYPE format a20
column kglnaobj format a100
column LOCATION format a30
  select * from (
  SELECT kglnahsh hash
        ,SUM (sleeps) sum_sleeps
        ,SUM (gets) sum_gets
        ,location
        ,mutex_type
                ,MUTEX_ADDR
        ,kglobt03 sqlid
        ,kglnaown
        ,replace(kglnaobj,chr(13)) c100
    --,SUBSTR (kglnaobj, 1, 140) object
    FROM x$kglob, x$mutex_sleep_history
   WHERE kglnahsh = mutex_identifier
         and kglobt03= decode('&&2','',kglobt03,lower('&&2'))
GROUP BY kglnaobj
        ,kglobt03
        ,kglnaown
        ,kglnahsh
        ,location
        ,mutex_type
                ,MUTEX_ADDR
ORDER BY sum_sleeps DESC ) where rownum<= &1;


$ cat sharepool/shp4.sql
column N0_6_16 format 99999999
SELECT DECODE (kglhdadr,
               kglhdpar, '父游標句柄地址',
               '子游標句柄地址')
          text,
       kglhdadr,
       kglhdpar,
       substr(kglnaobj,1,40) c40,
           KGLHDLMD,
           KGLHDPMD,
           kglhdivc,
       kglobhd0,
       kglobhd6,
       kglobhs0,kglobhs6,kglobt16,
       kglobhs0+kglobhs6+kglobt16 N0_6_16,
           kglobhs0+kglobhs1+kglobhs2+kglobhs3+kglobhs4+kglobhs5+kglobhs6+kglobt16 N20,
           kglnahsh,
           kglobt03 ,
           kglobt09
  FROM x$kglob
 WHERE kglobt03 = '&1'  or kglhdpar='&1' or kglhdadr='&1' or KGLNAHSH= &2;



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 瞭解IO多路復用,瞭解poll和select存在的問題,深入瞭解epoll如何高效,最後使用epoll實現一個聊天室鞏固學習 ...
  • armv8 1.前言 本文的主要內容來源於ARMV8白皮書v5,對ARMV8做一個概述。包含如下的內容: 首先從背景談起,講述ARM的發展歷程; 之後介紹ARMV8體繫結構的基本特征; 介紹A64指令集 介紹異常級別 介紹記憶體管理單元 介紹編程寄存器 介紹DEBUG相關 ARMV8生態系統的演化 2 ...
  • 問題描述: centos7,偽分佈模式下,啟動datanode後,通過JPS查看發現沒有相關進程,在日誌文件里也沒有任何提示。通過百度,網上一堆說什麼vesion 的ID不一致,不能解決我的問題。 經過搜索,https://community.hortonworks.com/questions/69 ...
  • 系統信息 arch 顯示機器的處理器架構(1) uname -m 顯示機器的處理器架構(2) uname -r 顯示正在使用的內核版本 dmidecode -q 顯示硬體系統部件 - (SMBIOS / DMI) hdparm -i /dev/hda 羅列一個磁碟的架構特性 hdparm -tT / ...
  • 1.安裝DHCP伺服器角色,這樣在netsh下才會有dhcp上下文 2.編寫配置dhcp的腳本 從命令行運行netsh有兩種語法: 比如要獲取已經配置的網路介面列表 1.寫全 其中:-r RemoteComputerName 是指定要操作的遠程主機或本機的電腦名,interface ipv4 是n ...
  • shutdown shutdown 此命令用來安全關閉或重啟Linux系統,系統在關閉之前會通知所有的登錄用戶,系統即將關閉,此時所有新用戶都不可以登錄。 以下截取man手冊的內容(man shutdown): NAME shutdown - bring the system down SYNOPS ...
  • 從mysql資料庫中導出正常資料庫的腳本語句,而後使用腳本語句創建資料庫的過程中,執行語句提示Can't Create Table 'XXX' erro150的錯誤,語句執行中斷,創建table失敗,仔細分析相關語句發現導致此錯誤的原因為創建的外鍵和關聯的表的主鍵類型不匹配。 仔細查看被執行的語句, ...
  • snapshot其實就是一組metadata信息的集合,它可以讓管理員將表恢復到以前的一個狀態。snapshot並不是一份拷貝,它只是一個文件名的列表,並不拷貝數據。一個全的snapshot恢復以為著你可以回滾到原來的表schema和創建snapshot之前的數據。 應用場景: 1獲取:該操作嘗試從 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...