Oracle體繫結構詳解

来源:http://www.cnblogs.com/chengxiao/archive/2016/09/26/5904783.html
-Advertisement-
Play Games

對於一門技術的學習,尤其是像Oracle database這種知識體系極其龐雜的技術來講,從巨集觀上瞭解其體繫結構是至關重要的。同時,個人認為,未必是專業DBA人員才需要瞭解其體繫結構(固然對於資料庫專業人員來講,這些都是必備知識了),一般的技術人員如果對其有較深入的瞭解,也是大有益處的,畢竟技術思想 ...


  對於一門技術的學習,尤其是像Oracle database這種知識體系極其龐雜的技術來講,從巨集觀上瞭解其體繫結構是至關重要的。同時,個人認為,未必是專業DBA人員才需要瞭解其體繫結構(固然對於資料庫專業人員來講,這些都是必備知識了),一般的技術人員如果對其有較深入的瞭解,也是大有益處的,畢竟技術思想很多時候都是相通的嘛。本文就從不同維度,如Oracle的記憶體結構,進程結構,存儲結構等方面做相應描述。

首先我們來說說基礎的概念吧

一、什麼是Oracle資料庫?

  眾所周知,Oracle DataBase是一款關係型資料庫管理系統(不瞭解何謂關係型資料庫的童鞋自行google,baidu),同類的產品還有mySql,sqlServer等,很多時候,我們會把那個承載我們核心數據的系統籠統地成為資料庫伺服器,但從嚴格意義上來講Oracle DataBase是由兩個部分組成:  

  實例:實例是資料庫啟動時初始化的一組進程和記憶體結構

  資料庫:資料庫則指的是用戶存儲數據的一些物理文件

  正因為如此我們一般才會說 關閉和啟動實例,載入卸載資料庫,就是這個道理。

   從實例和資料庫的概念上來看,我們能知道,實例暫時的,它不過是一組邏輯劃分的記憶體結構和進程結構,它會隨著資料庫的關閉而消失,而資料庫它其實就是一堆物理文件(控制文件,數據文件,日誌文件等等),它是永久存在的(除非磁碟損壞)。資料庫和實例通常是一對一的,這種結構我們成為單實例體繫結構;當然還有一些複雜的分散式的結構,一個資料庫可以對多個實例,像Oracle的RAC(有興趣的童鞋可以瞭解下)。

二、交互流程

  下麵是從網上找的一張圖,描述了單實例體繫結構大致的交互流程    

 

 

  1.用戶和用戶進程交互

    用戶進程可以是一般的客戶端軟體,像Oracle的sqlplus,sql developer,或者是一些驅動程式等等都屬於用戶進程

2.用戶進程和伺服器進程交互

  伺服器進程有時會稱為前臺進程,當然是相對於後臺進程(後面會提到的資料庫寫入器,日誌寫入器等)來說的,伺服器進程的主要作用就是處理連接到當前實例的用戶進程的請求,對客戶端發來的sql進行執行並返回執行結果。在專有伺服器結構中,用戶進程和伺服器進程是一對一的,也就是說,當監聽程式監聽到客戶端來了一個請求,會為其分配一個對應的伺服器進程。還有一種結構為共用伺服器,這種結構就不是一個用戶進程對應一個伺服器進程了,會通過調度程式進行協調處理,關於共用伺服器連接,本文就不在贅述了。

3.伺服器進程和實例進程交互

4.實例和資料庫進程交互

上面描述了一些我們在進行資料庫連接操作的時候,大致的交互流程是什麼樣的。下麵,我們就來看看Oracle 的實例記憶體結構

三、實例記憶體結構和進程結構

  (由於記憶體結構和進程結構關係較緊密,進程會作用到對應的記憶體區域,比如資料庫寫入器作用到資料庫緩衝區緩存中,日誌寫入器會作用到日誌緩衝區,所以記憶體結構和進程結構會相互配合地進行描述)

  oracle實例記憶體結構由兩部分組成SGA(系統全局區)和PGA(用戶全局區)組成,SGA是一塊共用的記憶體區域,也是最大的一塊記憶體區域;PGA則是用戶會話專有的記憶體區域,每個會話在伺服器端都有一塊專有的記憶體區域就是PGA。本文主要對SGA進行分析描述。SGA組成如下

 

  

資料庫緩衝區緩存&資料庫寫入器

  緩衝區緩存 是Oracle用來執行sql 的工作區域,在更新數據時,用戶會話不會直接去更新磁碟上的數據,想想,如果允許這麼做,那麼頻繁的磁碟IO對於系統性能的影響是毀滅性的。所以,實際的處理流程是這樣的:

select ename,salary from emp where name='東方不敗';

  

  我們來看這麼一條簡單的查詢語句,oracle是如何處理的。首先,當用戶提交了該條sql語句,由對應的用戶進程(比如我們常用的sql developer)將其發送給伺服器,監聽程式監聽到該條請求,會為其建立一個對應的伺服器進程,然後伺服器進程會先掃描緩衝區中有沒有包含關鍵行("東方不敗")的數據塊,如果有,這就算一次緩存命中了,然後相關行會傳輸到PGA進行進一步處理,最終經過格式化後展示給用戶;如果沒有命中,那麼伺服器進程會首先將對應行複製到緩衝區內,然後再返回給客戶端。

  DML(insert,update,delete)操作同理,加入用戶發送一條update語句,服務進程依然先去掃描緩衝區,如果緩存命中,則直接更新,數據變臟;如果沒有命中,由伺服器進程將對應數據塊先從磁碟上複製到緩衝區內,再進行更新操作。

臟緩衝區

  如果緩衝區存儲的塊和磁碟上的塊不一致,該緩衝區就叫做“臟緩衝區”,臟緩衝區最終會由資料庫寫入器(DBWn)寫入到磁碟中去。

資料庫寫入器(DBWn)

  資料庫寫入器是Oracle的一個後臺進程,所謂後臺進程是相對於前臺進程(伺服器進程)來講的。DBWn的"n"意味著一個實例是可以有多個資料庫寫入器的。

  作用:簡而言之,DBWn的作用就是將變髒了的緩衝區從資料庫緩衝區緩存中寫入到磁碟中的數據文件中去。

  資料庫緩衝區緩存這塊記憶體區域和資料庫寫入器這塊是比較重要的概念,別的資料庫產品像mySql也都有對應的實現,只不過叫法不一樣罷了。瞭解這塊的時候,要時刻意識到會話是不會直接更新磁碟數據的,會話的更新,插入,刪除包括查詢等都是先作用到緩衝區上,隨後,DBWn會將其中的臟緩衝區轉儲到磁碟上去。 

  DBWn什麼時候寫入?

DBWn是個比較懶的進程,它會儘可能少的進行寫入,在以下四種情況它會執行寫入:

a.沒有任何可用緩衝區(不得不寫啊)

b.臟緩衝區過多

c.3秒超時(最晚3秒會執行一次寫入)

d.遇到檢查點,即checkPoint(檢查點),檢查點是個Oracle事件,遇到檢查點,DBWn會執行寫入。比如實例有序關閉的時候會有檢查點,DBWn會將所有臟緩衝區寫入到磁碟上去的,這很容易理解,要保持數據文件的一致性。

    註意:

  從上述DBWn的幾個寫入時機,我們能意識到,DBWn的寫入不是直接依賴於會話的更新操作的。不是一有臟緩衝區,它就執行寫入。而且,DBWn執行寫入跟commit操作也沒有任何關係,不要以為commit操作的影響結果會實時流入到磁碟中去。

  DBWn採用極懶演算法進行寫入,原因我們應該要清楚:頻繁的磁碟IO對系統的壓力很大,如果DBWn很積極地去寫入磁碟,那對系統性能的影響就太大了,換個角度想,如果DBWn很勤快的寫磁碟,那麼資料庫緩衝區存在的意義也就不大了。

  當然,講到這兒,我們可能會意識到一個問題,DBWn如此懶地進行數據轉儲,如果在某一時刻,資料庫緩衝區緩存記憶體在著大量的臟緩衝區(生產環境中,這是常態),也就是有大量的未commit和已commit的數據還在記憶體中,沒有持久化到磁碟中,然後突然系統斷電了,這種情況下,數據是不是就丟掉了?數據當然不會丟失,這就引出了重做日誌(redo log)的概念,接下來,我們就來談談對應重做日誌的記憶體結構和後臺進程。

  日誌緩衝區&日誌寫入器

  當我們執行一些DML操作(insert,update,delete),數據塊發生改變了,產生的變更向量則會寫入到重做日誌文件中去。有了這些記錄,當系統由於斷電等因素突然宕掉,資料庫緩衝區緩存內的大量臟數據還沒來得及寫入到數據文件中去,在重新啟動的時候,會有一個實例恢復的過程,在此過程中就應用了重做日誌記錄來使數據保持一致;或者資料庫遭遇了物理損壞,比如磁碟損壞了,此時可以通過Oracle的備份恢復工具(如RMAN)進行數據恢復,原理就是 提取備份集-->應用重做日誌文件中的變更記錄。

    日誌緩衝區

日誌緩衝區是一塊比較小的記憶體區域,它是用來短期存儲將寫入到磁碟中的重做日誌文件中的變更向量的。

日誌緩衝區存在的意義依然是為了減少磁碟IO,減少用戶的等待時間,試想下,如果每一次用戶DML操作都要進行等待重做記錄被寫入到磁碟中去,體驗會有多差勁。

    日誌寫入器(LGWR)

顧名思義,日誌寫入器(LGWR)就是把日誌緩衝區內的內容寫入到磁碟的重做日誌文件中去,相比資料庫寫入器(DBWn),日誌寫入器就勤快多了。

以下三種情況LGWR會執行寫入:

a.commit時寫入

  前面提過,DBWn的寫入和commit沒有任何關係,如果commit時資料庫沒有任何記錄,那數據就真的丟失了,Oracle 的重做日誌就是為了保證數據安全而存在的,commit時,會話會先掛起,等待LGWR將這些記錄寫入到磁碟上的重做日誌文件中,才會通知用戶提交完成。所以,LGWR在commit時執行寫入,是為了確保事務永不丟失。

b.日誌緩衝區的占用率達到1/3。

c.DBWn要寫入臟緩衝區前

這個寫入是為了數據回滾考慮的。DBWn完全可能寫入還沒提交的事務(參照上面提到的寫入時機),那如何保證事務回滾呢?

  首先要知道,DBWn除了寫入實際的數據,還會寫入撤銷數據(不瞭解的同學可參考我的另一篇博文中對於撤銷段的描述 Oracle閃回技術詳解。)簡單說,事務回滾需要撤銷數據,在寫入撤銷數據前,會先寫入針對撤銷數據的日誌記錄(有點繞),若用戶要進行事務回滾,就可以應用這些日誌記錄來構造撤銷數據,然後進行回滾。

我們對這兩塊最重要的記憶體區域和對應的後臺進程做個總結:

  資料庫緩衝區緩存和日誌緩衝區都是為了提高性能,避免頻繁IO而存在的。日誌緩衝區相比資料庫緩衝區緩存要小的多,並且不能進行自動管理,對於日誌緩衝區的修改需要重啟實例,資料庫緩衝區緩存可進行自動管理。作用在資料庫緩衝區緩存上的DBWn進程,為了避免頻繁的磁碟IO導致系統性能下降,會儘可能少地執行寫入,且DBWn的寫入和commit操作沒有任何關係;

  而作用在日誌緩衝區上的LGWR進程,則會非常積極地進行寫入,一般情況下,它幾乎是實時地將重做日誌記錄轉儲到磁碟中去。LGWR是Oracle體繫結構中最大的瓶頸之一。DML的速度不可能超過LGWR將變更向量寫入磁碟的速度。

我們在來看下其他的記憶體區域和後臺進程

共用池

共用池是最複雜的SGA結構,它有許多子結構,我們來看看常見的幾個共用池組件:

  1.庫緩存:庫緩存這塊記憶體區域會按已分析的格式緩存最近執行的代碼,這樣,同樣的sql代碼多次執行的時候,就不用重覆地去進行代碼分析,可以很大程度上提高系統性能。

  2.數據字典緩存:存儲oracle中的對象定義(表,視圖,同義詞,索引等資料庫對象),這樣在分析sql代碼的時候,就不用頻繁去磁碟上讀取數據字典中的數據了

  3.PL/SQL區:緩存存儲過程、函數、觸發器等資料庫對象,這些對象都存儲在數據字典中,通過將其緩存到記憶體中,可以在重覆調用的時候提高性能。

大池:大池是個可選的記憶體區域,前面我們提到專有伺服器連接和共用伺服器連接,如果資料庫採用了共用伺服器連接模式,則要使用到大池;RMAN(Oracle的高級備份恢復工具)備份數據也需要大池。

JAVA池

  Oracle 的很多選項使用java寫的,Java池用作實例化Java對象所需的堆空間

流池

  從重做日誌中提取變更記錄的進程 和 應用變更記錄的進程會用到流池(如實例不正常關閉,譬如斷電導致實例關閉,在重啟時,Oracle會自動執行實例恢復過程,在此過程需要提取重做日誌記錄和應用重做日誌兩個動作)

以上列舉了Oracle常見的記憶體結構,要註意的是,上面列舉的記憶體區域,除了日誌緩衝區是固定的,不能動態調整也不能進行自動管理外,其他記憶體區域都可以進行動態調整,也可以進行自動管理。

 

在說說Oracle 的幾個後臺進程(DBWn和LGWR較重要,前面已做了瞭解,在此不再贅述)

SMON(System Monitor):安裝和打開資料庫,實例恢復也是由此進程完成的

PMON(Process Monitor):進程監視器,主要監視伺服器進程。前面提到過,專有伺服器體系模式下,用戶進程和伺服器進程是一對一的關係,如果某個會話發生異常,PMON會銷毀對應的伺服器進程,回滾未提交的事務,並回收會話專有的PGA記憶體區域。

CKPT(Checkpoint Process):CKPT負責發起檢查點信號,手動設置檢查點的語法:

SQL>alter system checkpoint;

  檢查點可強制DBWn寫入臟緩衝區,當資料庫崩潰後,由於大量臟緩衝區未寫入數據文件,在重新啟動時,需要由SMON進行實例恢復,實例恢復需要提取和應用重做日誌記錄,提取的位置就是從上次檢查點發起的位置開始的(檢查點之前的數據已經被強制寫入到數據文件中去了),這個位置稱為RBA(redo byte address),CKPT會不斷將這個位置更新到控制文件中去(以確定實例恢復需要從哪兒開始提取日誌記錄)。

MMON(Manageability Monitor)

  資料庫的自我監視和自我調整的支持進程。實例在運行中,會收集大量有關實例活動和性能的統計數據,這些數據會收集到SGA中,MMON定期從SGA中捕獲這些統計數據,並將其寫入到數據字典中,便於後續對這些快照進行分析。(預設情況,MMON每隔一個小時收集一次快照)

ARCn(Archiver

  歸檔進程,這個進程是可選的,如果資料庫配置為歸檔模式,這個進程就是必須的。所謂歸檔,就是將重做日誌文件永久保存(生產庫一般都會配置為歸檔模式)到歸檔日誌文件中。歸檔日誌文件和重做日誌文件作用是一樣的,只不過重做日誌文件會不短被重寫,而歸檔日誌文件則保留了關於數據更改的完整的歷史記錄。

 

至此,Oracle基礎的記憶體結構和進程結構我們已大概瞭解,來看下完成的進程和記憶體的交互情況,可以根據前面的理解將整個交互流程串聯一下。

四、Oracle存儲結構

物理存儲結構

 

  

  

所謂外部文件,意味著這些文件從嚴格意義上來講並不屬於Oracle資料庫的一部分。

控制文件:

  控制文件雖小,但作用重大,它包含指向資料庫其餘部分的指針(包括重做日誌文件,數據文件,歸檔日誌文件等的位置),存儲重要的序列號和時間戳,存儲RMAN備份的詳細信息。控制文件一旦受損,那實例會立馬終止,一般對數據文件的保護採用多路復用機制,就是冗餘多份在不同物理位置。

重做日誌文件

  重做日誌文件的作用在講解記憶體和進程結構的時候有提到過,重做日誌按時間順序存儲應用於資料庫的一連串的變更向量(包含聯機重做日誌文件和歸檔日誌文件)。由SMON在資料庫啟動時自動執行的實例恢復 和 磁碟損壞所要求的提取備份恢復都會應用到重做日誌進行相應的數據恢復

  重做日誌文件也建議進行多路復用,一個資料庫至少要有兩組重做日誌文件。一組供LGWR進行寫入,日誌文件是固定大小,業務高峰期會很快寫滿,寫滿之後會切換到第二組上,在配置為歸檔模式的資料庫中,這時由歸檔進程(ARCn)開始將第一組的內容進行歸檔備份,如此迴圈地進行寫入和歸檔。需要註意的是,在歸檔進程還未對當前組的日誌歸檔完畢前,是不允許LGWR對其進行重寫的。

數據文件

  數據文件存儲著實際的數據,DBWn會將資料庫緩衝區中的內容寫入到這類文件中去,數據文件的大小和數量是不受限制的。Oracle從10g開始,創建一個資料庫至少需要兩個數據文件,一個用於SYSTEM表空間,該表空間用來存儲數據字典;一個用於SYSAUX表空間,這個表空間用來存儲一些數據字典的輔助數據。

  數據文件由一個個的Oracle塊組成,這是Oracle的I/O基礎單元,與操作系統塊是不同的概念,Oracle塊要比操作系統塊大,這當然有處於性能的一些考慮,但我們考慮這樣一種情況,當用戶使用操作系統命令進行數據文件的備份的時候(假設1個Oracle塊=8個操作系統塊),已經複製了4個操作系統塊,然後CPU被DBWn搶占了,DBWn又重新對這個Oracle塊進行了更新,這時,當複製命令又得到了CPU時間去複製剩餘的4個塊的時候,就造成了整個Oracle塊的數據不一致,所以,這也是在執行這種備份(用戶自行備份)的時候,需要做一些額外處理,比如將表空間置為備份模式的原因。當然,使用RMAN是不存在這樣的問題的,RMAN的備份機制是肯定可以得到數據一致的塊的。(這塊內容作瞭解即可)

  對於數據文件的保護,一般可進行定期備份,或者使用RAID也可以。

實例參數文件

  這個文件存儲了資料庫所需的一些參數設置,比如各個記憶體區域的大小,可允許的最大進程數,最大會話數,控制文件的位置,資料庫的名稱等等,參數文件也是實例啟動時首先要載入的文件。

口令文件

  一般稱為外部口令文件。一般的用戶名和口令是存放在數據字典中,不會存放在這個文件中。在一些特殊場景下,比如實例還未啟動,這時,我可能需要以管理員的身份登入系統去執行一些恢復或者啟動操作,然而此時,數據字典由於實例還沒啟動是不存在的,這時就需要外部口令文件進行用戶身份的驗證。

歸檔日誌文件

  ARCn將聯機重做日誌文件會備份歸檔到這類文件中去,歸檔日誌文件保留了數據更改的完整歷史信息。

邏輯存儲結構

  Oracle將其物理結構從邏輯存儲結構中抽象出來,物理機構是系統管理員能看到的,邏輯結構則是用戶所能感知到的。比較典型的邏輯結構就是 "段"和"表空間"。

  段:

  段就是包含所有數據的邏輯結構,比較典型的段就是"表",稱為表段,還有索引段,撤銷段等等。

  表空間

    表空間從邏輯上是多個段的結合,在物理上是多個數據文件的集合,相當於在段和數據文件的對應中加入了一個中間層來解決這種多對多的關係。

  在早期的一些資料庫設計中,段和數據文件是一對一的關係,一個段一個數據文件,這種設計有很多弊端,首先,段的數量是不固定的,有可能一個系統中上千張表,那就得需要上千個數據文件,系統管理員要管理這麼多文件肯定會抓狂的;還有一種情況就是某些歷史表可能特別大,大到底層系統對單個文件的限制,用一個數據文件去承載的話肯定是不行的。表空間則完美解決了這樣的問題。

  還有一些邏輯結構如區間和Oracle塊(Oracle塊前面有提到過,區間則為塊的集合),下麵通過一張圖對Oracle的存儲結構進行整體的巨集觀的認識,進一步加深些理解

 

 

總結:

  本文博主對Oracle的體繫結構做了相對全面的介紹,包括記憶體結構,進程結構,存儲結構等等,相信大家對其全貌也有了基本的瞭解。當然由於博主本人也並非Oracle 專業人員(雖曾今亦有過成為DBA的念頭

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

-Advertisement-
Play Games
更多相關文章
  • 本文地址:http://www.cnblogs.com/wuyudong/p/5906735.html,轉載請註明源地址。 本文將實現標題欄下麵的textview中的文字跑馬燈的效果,就是將一行文字水平迴圈滾動,效果如下: 實現代碼如下: 如果其他地方也需要這樣的跑馬燈效果,複製代碼比較麻煩。這裡使 ...
  • 很多應用都會在界面中使用某種列表控制項:用戶可以選中、刪除或重新排列列表中的項目。這些控制項其實都是UITableView 對象,可以用來顯示一組對象,例如,用戶地址薄中的一組人名。 UITableView 對象雖然只能顯示一行數據,但是沒有行數限制。 編寫新的應用程式 JXHomepwner 應用 創 ...
  • 本文實現當從splash界面進入hone界面的時候,產生一種漸進淡入的動畫效果,在onCreate中調用一個方法initAnimation(),代碼如下: 其中rl_root在類中定義 private RelativeLayout rl_root; 其中rl_root為splash界面相對佈局的id ...
  • 開發中經常需要使用Shape和Selector,如果每個都用xml設置的話,會占用apk大小,同時命名多了也會混亂,使用代碼來設置會方便很多。 需要用到2個類:GradientDrawable和StateListDrawable 相關API: setColor(rgb); //填充顏色setGrad ...
  • 使用巨集的目的是什麼? 由於實際開發中,有時候一些設置信息需要重覆使用(例如設置列印信息、配置顏色、配置寬度等),如果每次都手動去敲每次都去創建會很麻煩。雖然巨集使用的時候會占用記憶體,可是目前來說大部分開發者都在使用。 1.創建PCH 文件 2.打開配置面板 按照下圖操作 3.按照下圖找到相關配置 4. ...
  • 1.Activity相關。launchmode,OnSaveInstnceState,生命周期等。 4種預設的launchmode,以及OnNewIntent的回調。 OnNewIntent->OnRestart->OnStart->onResume OnActivity->OnResume. On ...
  • 1.排隊機制 接收輸入TCP報文時,有三個隊列: ● 待處理隊列 ● 預排隊隊列 ● 接收隊列 接收隊列包含了處理過的TCP數據段,也就是說,去除了全部的協議頭,正準備將數據複製到用戶應用程式。接收隊列包含了所有按順序接收的數據段,在其他兩個隊列中的TCP數據段則需要進一步處理。 TCP報文首先由t ...
  • 查看原文:http://blog.csdn.net/u010818425/article/details/52490628 Gradle實戰系列文章: 《Gradle基本知識點與常用配置》 《Gradle實戰:Android多渠道打包方案彙總》 《Gradle實戰:不同編譯類型的包同設備共存》 《G ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...