[20190423]那個更快的疑問3.txt

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

[20190423]那個更快的疑問3.txt--//前一陣子,做了11g在單表單條記錄唯一索引掃描的測試,摘要如下:--//參考鏈接:http://blog.itpub.net/267265/viewspace-2636321/http://blog.itpub.net/267265/viewspa ...


[20190423]那個更快的疑問3.txt

--//前一陣子,做了11g在單表單條記錄唯一索引掃描的測試,摘要如下:
--//參考鏈接:
http://blog.itpub.net/267265/viewspace-2636321/
http://blog.itpub.net/267265/viewspace-2636342/

--//在鏈接中我解析唯一索引查詢的情況,為什麼10g快於11g,鏈接:http://blog.itpub.net/267265/viewspace-2639920/
--//差異在於10g很少做times的系統調用上.10g下僅僅116次.而11g高達200179.(getrusage與times調用次數比大約是7:2)
--//我當時的感覺10g漏寫times系統函數調用,導致這樣的情況,11g把它補上了。
--//實際上有網友提出疑問.我的測試下的結論有問題.當時測試的情況如下:
--//11g的測試:
$ strace -f -c sqlplus -s -l scott/book @m1.txt 1e5 id=1_unique_index 0 >/dev/null
...
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 72.78    0.043919           0    700708           getrusage
 19.80    0.011947           0    200179           times
  6.67    0.004024         671         6         3 wait4
  0.24    0.000147          29         5           clone
  0.18    0.000106           0       375         2 read
  0.16    0.000096           0       264       106 open
...
------ ----------- ----------- --------- --------- ----------------
100.00    0.060341                902967       206 total

--//1e5次執行times調用消耗0.011947秒,放大10倍(我每個session執行次數是1e6)也就是0.119470秒,什麼可能產生這麼大的差異.
--//仔細查看,我覺得strace跟蹤記錄的syscallsyscall.linux標準C函數.看不出oracle內部函數調用次數.
--//我當時的解析是這增加的times調用一定是11g版本唯一索引掃描中增加幾個oracle內部函數調用,導致11g的唯一索引
--//掃描更慢,如何驗證我當時確實不知道? 最近shared latch測試,建立一些gdb腳本,有了這些腳本可以latch獲得釋放的情況.

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

2.建立測試腳本:

create table t as select rownum id from dual ;
create unique index pk_t on t(id);
alter table t modify id  not null ;
create table job_times (sid number, time_ela number,method varchar2(20));
--//分析表略.

$ cat z1.txt
set verify off
host sleep $(echo &&3/50 | bc -l )
variable vmethod varchar2(20);
exec :vmethod := '&&2';
insert into job_times values ( sys_context ('userenv', 'sid') ,dbms_utility.get_time ,:vmethod) ;
commit ;
declare
v_id number;
v_d date;
begin
    for i in 1 .. &&1 loop
        select /*+  &&3 */ count (*) into v_id from t where id=1 ;
    end loop;
end ;
/
update job_times set time_ela = dbms_utility.get_time - time_ela where sid=sys_context ('userenv', 'sid') and method=:vmethod;
commit;
quit

3.分別測試:
$ sqlplus -s -l scott/book @z1.txt 1e6 id=unindex 0 >/dev/null

SCOTT@book> Select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from job_times group by method order by 3 ;
METHOD                 COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)
-------------------- ---------- ---------------------- -------------
id=unindex                    1                   2723          2723

--//在10g下重覆測試:
SCOTT@test> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- ----------------------------------------------------------------
x86_64/Linux 2.4.xx            10.2.0.4.0     Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

SCOTT@test> select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from job_times group by method order by 3 ;
METHOD                 COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)
-------------------- ---------- ---------------------- -------------
id=unindex                    1                   1591          1591
--//即使單用戶執行10g下比11g快許多.

3.通過gdb腳本分析:
--//11g:
SCOTT@book> @ spid
       SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
        88         89 65066                    DEDICATED 65067       30         65 alter system kill session '88,89' immediate;

--//執行多次3次以上避免遞歸.
select count(*) from t where id=1;
--//打開window 2:
$ gdb -p 65067 -x latch11g.gdb
(gdb) c
Continuing.
ksl_get_shared_latch laddr:85f7fe28, willing:1, where:-2050764096, why:95, mode:8
ksl_get_shared_latch laddr:85f7fe28, willing:1, where:-2050764096, why:96, mode:16
ksl_get_shared_latch laddr:85f7fe28, willing:1, where:-2050764096, why:95, mode:8
kslgetl 844ed538, 0, 49, 2062
kslgetl 8353a258, 1, 16777771, 2053
ksl_get_shared_latch laddr:85f7fe28, willing:1, where:-2050764096, why:96, mode:16
ksl_get_shared_latch laddr:85f7fe28, willing:1, where:-2050764096, why:95, mode:8
ksl_get_shared_latch laddr:85f7fe28, willing:1, where:-2050764096, why:96, mode:16

--//看到ksl_get_shared_latch 6次,kslgetl 2次,看看是什麼latch.
> select addr,name,level#,latch#,gets,misses,sleeps,immediate_gets,immediate_misses,waiters_woken,waits_holding_latch,spin_gets,wait_time from v$latch_children where addr=lpad(upper('85f7fe28'),'16','0')
ADDR             NAME             LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
---------------- ---------------- ------ ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
0000000085F7FE28 session idle bit      1         14       1095          0          0              0                0             0                   0          0          0

--//session idle bit 第一次看見,我看了我的測試機器,一共24次children latch.估計跟CPU數量有關.我在另外的會話重覆測試
--//ksl_get_shared_latch的地址不一樣,而kslgetl 也是2次都是一樣.

> select addr,name,level#,latch#,gets,misses,sleeps,immediate_gets,immediate_misses,waiters_woken,waits_holding_latch,spin_gets,wait_time from v$latch_children where addr=lpad(upper('844ed538'),'16','0')
ADDR             NAME                LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
---------------- ------------------- ------ ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
00000000844ED538 simulator lru latch      6        185        560          1          0       72795239          3207148             0                   0          1          0

> select addr,name,level#,latch#,gets,misses,sleeps,immediate_gets,immediate_misses,waiters_woken,waits_holding_latch,spin_gets,wait_time from v$latch_children where addr=lpad(upper('8353a258'),'16','0')
ADDR             NAME                 LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
---------------- -------------------- ------ ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
000000008353A258 simulator hash latch      7        186   72792634          0          0              0                0             0                   0          0          0

--//奇怪這兩個latch我從來沒有過,而且奇怪的是根本看不到cbc latch.
--//在10g下重覆測試看看(註10g shared latch 的函數是kslgetsl )

Breakpoint 1 at 0x7a0644
Breakpoint 2 at 0x7a0a44
Breakpoint 3 at 0x3bccd52
Breakpoint 4 at 0x3be9a04
Breakpoint 5 at 0x3181cd6400
Breakpoint 6 at 0x78ef44
Function "ksl_get_shared_latch" not defined.
Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
Breakpoint 7 at 0x78f4bc
Breakpoint 8 at 0x79054c
--//奇怪10g沒有ksl_get_shared_latchoracle內部函數.註解這部分內容.

(gdb) c
Continuing.
kslgetsl laddr:7cfb24f8, willing:1, where:2096584384, why:80, mode:8
kslgetsl laddr:7cfb24f8, willing:1, where:2096584384, why:81, mode:16
kslgetsl laddr:7cfb24f8, willing:1, where:2096584384, why:80, mode:8
kslgetl 7a10aaa0, 1, 0, 2741
kslgetsl laddr:7cfb24f8, willing:1, where:2096584384, why:81, mode:16
kslgetsl laddr:7cfb24f8, willing:1, where:2096584384, why:80, mode:8
kslgetsl laddr:7cfb24f8, willing:1, where:2096584384, why:81, mode:16
--//看到kslgetsl 6次,kslgetl 1次,看看是什麼latch.
SYS@test> select addr,name,level#,latch#,gets,misses,sleeps,immediate_gets,immediate_misses,waiters_woken,waits_holding_latch,spin_gets,wait_time from v$latch_children where addr=lpad(upper('7cfb24f8'),'16','0');
ADDR             NAME                 LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
---------------- -------------------- ------ ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
000000007CFB24F8 session idle bit          1          7       7112          0          0              0                0             0                   0          0          0

SYS@test> select addr,name,level#,latch#,gets,misses,sleeps,immediate_gets,immediate_misses,waiters_woken,waits_holding_latch,spin_gets,wait_time from v$latch_children where addr=lpad(upper('7a10aaa0'),'16','0');
ADDR             NAME                   LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
---------------- ---------------------- ------ ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
000000007A10AAA0 shared pool simulator       8        241     146325          1          0              0                0             0                   0          1          0

--//你可以再次執行sql語句看看gets的變化:
SYS@test> select addr,name,level#,latch#,gets,misses,sleeps,immediate_gets,immediate_misses,waiters_woken,waits_holding_latch,spin_gets,wait_time from v$latch_children where addr=lpad(upper('7cfb24f8'),'16','0');
ADDR             NAME             LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
---------------- ---------------- ------ ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
000000007CFB24F8 session idle bit      1          7       7118          0          0              0                0             0                   0          0          0

SYS@test> select addr,name,level#,latch#,gets,misses,sleeps,immediate_gets,immediate_misses,waiters_woken,waits_holding_latch,spin_gets,wait_time from v$latch_children where addr=lpad(upper('7a10aaa0'),'16','0');
ADDR             NAME                  LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
---------------- --------------------- ------ ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
000000007A10AAA0 shared pool simulator      8        241     146326          1          0              0                0             0                   0          1          0

--//說明跟蹤到的get變化沒有問題.我在11g看了latch的變化,只不過simulator lru latch 變成了IMMEDIATE_GETS數量增加:
> select addr,name,level#,latch#,gets,misses,sleeps,immediate_gets,immediate_misses,waiters_woken,waits_holding_latch,spin_gets,wait_time from v$latch_children where addr=lpad(upper('8353a258'),'16','0')
ADDR             NAME                                         LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
---------------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
000000008353A258 simulator hash latch                              7        186   72792639          0          0              0                0             0                   0          0          0

> select addr,name,level#,latch#,gets,misses,sleeps,immediate_gets,immediate_misses,waiters_woken,waits_holding_latch,spin_gets,wait_time from v$latch_children where addr=lpad(upper('844ed538'),'16','0')
ADDR             NAME                                         LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
---------------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
00000000844ED538 simulator lru latch                               6        185        563          1          0       72795248          3207148             0                   0          1          0

--//執行sql語句再查看.
> select addr,name,level#,latch#,gets,misses,sleeps,immediate_gets,immediate_misses,waiters_woken,waits_holding_latch,spin_gets,wait_time from v$latch_children where addr=lpad(upper('8353a258'),'16','0')
ADDR             NAME                                         LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
---------------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
000000008353A258 simulator hash latch                              7        186   72792640          0          0              0                0             0                   0          0          0

> select addr,name,level#,latch#,gets,misses,sleeps,immediate_gets,immediate_misses,waiters_woken,waits_holding_latch,spin_gets,wait_time from v$latch_children where addr=lpad(upper('844ed538'),'16','0')
ADDR             NAME                                         LEVEL#     LATCH#       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS  WAIT_TIME
---------------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ----------
00000000844ED538 simulator lru latch                               6        185        563          1          0       72795249          3207148             0                   0          1          0

--//我估計跟一些參數有關:
kslgetl 844ed538, 0, 49, 2062
kslgetl 8353a258, 1, 16777771, 2053
--//我猜測0表示no willing等待. 1表示willing等待.
--//我最後猜測也許正是11g下代碼改動使用ksl_get_shared_latch,多了1次kslgetl調用,使用導致11g下每次執行多了2次times syscall,
--//可以講11g下唯一索引掃描是一個退步.
--//至於為什麼沒有阻塞看不到cbc latch獲取和釋放,我給再探究看看...

4.我加入1個欄位看看:
drop table t purge ;
create table t as select rownum id,'test' name  from dual ;
create unique index pk_t on t(id);
alter table t modify id  not null ;

$ cat z1.txt
set verify off
host sleep $(echo &&3/50 | bc -l )
variable vmethod varchar2(20);
exec :vmethod := '&&2';
insert into job_times values ( sys_context ('userenv', 'sid') ,dbms_utility.get_time ,:vmethod) ;
commit ;
declare
v_id number;
v_d date;
v_name varchar2(4) ;
begin
    for i in 1 .. &&1 loop
        select /*+  &&3 */ name  into v_name from t where id=1 ;
    end loop;
end ;
/
update job_times set time_ela = dbms_utility.get_time - time_ela where sid=sys_context ('userenv', 'sid') and method=:vmethod;
commit;
quit

--//重覆測試:
--//11g:
SCOTT@book> Select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from job_times group by method order by 3 ;
METHOD                 COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)
-------------------- ---------- ---------------------- -------------
id=unindex_name               1                   2135          2135
id=unindex                    1                   2723          2723

--//10g:
SCOTT@test> select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from job_times group by method order by 3 ;
METHOD                 COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)
-------------------- ---------- ---------------------- -------------
id=unindex_name               1                   1359          1359
id=unindex                    1                   1591          1591

--//真心搞不懂,回表反而更快一些.oracle許多東西真心搞不懂....
--//感覺如果訪問數據塊緩存數據塊,沒有阻塞無需要獲取cbc latch嗎?

5.附上gdb腳本:
--//11g版本:
$ cat latch11g.gdb
break kslgetl
  commands
    silent
    printf "kslgetl %x, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

break kslges
  commands
    silent
    printf "kslges %x, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

break skgpwwait
  commands
    silent
    printf "skgpwwait %d, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

break sskgpwwait
  commands
    silent
    printf "sskgpwwait %d, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

break semop
  commands
    silent
    printf "semop %d, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

#break *0x93f9ddc
#  commands
#    silent
#    printf " spin count loop: %d %d %x\n", $rax,$rcx,$rip
#    c
#  end

##
break kslgetsl_w
  commands
    silent
    printf "kslgetsl_w laddr:%x, willing:%d, where:%d, why:%d, mode:%d\n", $rdi, $rsi, $rdx, $rcx, $r8
    c
  end

break ksl_get_shared_latch
  commands
    silent
    printf "ksl_get_shared_latch laddr:%x, willing:%d, where:%d, why:%d, mode:%d\n", $rdi, $rsi, $rdx, $rcx, $r8
    c
  end

break kslgess
  commands
    silent
    printf "kslgess %x, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

break kslskgs
  commands
    silent
    printf "kslskgs %x, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

break kslfre
  commands
    silent
    printf "kslfre %x, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

#break *0xa875be
#  commands
#    silent
#    printf " spin count loop: %d %x\n", $r13,$rip
#    c
#  end

--//10g版本:
$ cat latch10g.gdb
break kslgetl
  commands
    silent
    printf "kslgetl %x, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

break kslges
  commands
    silent
    printf "kslges %x, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

break skgpwwait
  commands
    silent
    printf "skgpwwait %d, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

break sskgpwwait
  commands
    silent
    printf "sskgpwwait %d, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

break semop
  commands
    silent
    printf "semop %d, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

#break *0x93f9ddc
#  commands
#    silent
#    printf " spin count loop: %d %d %x\n", $rax,$rcx,$rip
#    c
#  end

##
break kslgetsl
  commands
    silent
    printf "kslgetsl laddr:%x, willing:%d, where:%d, why:%d, mode:%d\n", $rdi, $rsi, $rdx, $rcx, $r8
    c
  end

#break ksl_get_shared_latch
#  commands
#    silent
#    printf "ksl_get_shared_latch laddr:%x, willing:%d, where:%d, why:%d, mode:%d\n", $rdi, $rsi, $rdx, $rcx, $r8
#    c
#  end

break kslgess
  commands
    silent
    printf "kslgess %x, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

break kslskgs
  commands
    silent
    printf "kslskgs %x, %d, %d, %d\n", $rdi, $rsi, $rdx, $rcx
    c
  end

#break *0xa875be
#  commands
#    silent
#    printf " spin count loop: %d %x\n", $r13,$rip
#    c
#  end



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

-Advertisement-
Play Games
更多相關文章
  • 1. 備份與還原的基礎說明 我們知道在DBA的日常工作中,SQL Server 資料庫的恢復請求偶有發生,可能是用作數據的追蹤,可也可能能是資料庫的災難恢復。 資料庫常用的備份命令如下: 備份文件的命名格式為:資料庫名字_備份類型(Full或Diff或Trn的一種)_時間格式.文件類型(bak或tr ...
  • 1、通過yum安裝: yum install redis 2、設置redis.conf中daemonize為yes。設置密碼: requirepass 3、安裝完後的啟動腳本是完善的,/etc/init.d/redis,不需要再另外操作。 查看啟動列表: chkconfig --list 安裝完可以 ...
  • --語 句 功 能--數據操作SELECT --從資料庫表中檢索數據行和列INSERT --向資料庫表添加新數據行DELETE --從資料庫表中刪除數據行UPDATE --更新資料庫表中的數據 --數據定義 CREATE TABLE --創建一個資料庫表DROP TABLE --從資料庫中刪除表 A ...
  • 由於資料庫存的是整個字元串組到一起了,C#代碼是這個樣子的。 在sqlserver中存儲的實際值是:20190416124941。那麼直接轉換? 所以在sqlserver中查詢的時候我們要進行轉化,因為在mssql中進行轉換需要是有標準的 例如/ : 等符號。那麼我們就進行截取吧。 最後就完事了。 ...
  • 加鎖的主要目的是為了防止併發操作時導致的數據不一致等問題,鎖分為共用鎖(S)、更新鎖(U)、排他鎖(X),共用鎖與更新只是單向相容?傳說中的單相思? 事務 事務能保證數據操作的原子性,要麼內部操作都提交,要麼都回退。事務內部某個地方出錯時,可以回滾前面的操作,比如更新、刪除等。 共用鎖 共用鎖允許並 ...
  • 在資料庫的鎖機制中介紹過,資料庫管理系統(DBMS)中的併發控制的任務是確保在多個事務同時存取資料庫中同一數據時不破壞事務的隔離性和統一性以及資料庫的統一性。 樂觀併發控制(樂觀鎖)和悲觀併發控制(悲觀鎖)是併發控制主要採用的技術手段。 無論是悲觀鎖還是樂觀鎖,都是人們定義出來的概念,可以認為是一種 ...
  • 一、統計語句 1、--統計當前【>當天00點以後的數據】 SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT(Nvarchar, GETDATE(), 111) ORDER BY dateandtime DESC 2 ...
  • 安裝redis-5.0.4 修改配置文件 創建命令鏈接 設置redis開機自啟動 啟動redis服務 測試連接 安裝過程可能出現的問題 1.CentOS預設沒有安裝gcc,這會導致我們無法make成功 2.make時報如下錯誤: zmalloc.h:50:31: fatal error: jemal ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...