1. 程式人生 > >Oracle PLSQLl的多執行緒程式設計架構 儲存過程中使用多執行緒 定時任務 作業排程計劃 JOB SCHEDULE

Oracle PLSQLl的多執行緒程式設計架構 儲存過程中使用多執行緒 定時任務 作業排程計劃 JOB SCHEDULE

 

基於Oracle plsql的多執行緒程式設計架構 (附儲存過程)

1年前 1413

作者介紹

馮守東,北京科訊華通科技發展有限公司高階專案經理。超12年Oracle開發及管理經驗,多年運營商和政府企業級系統運維經驗,曾獲得東軟最佳設計方案獎。熟悉Weblogic、TUXEDO、IBM WAS等相關中介軟體運維。熟悉MySQL、DB2、Informix等其他開源或商業資料,以及Openstack、Hadoop相關生態系統、網站架構設計等。

 

 引言  

 

1 文件編制目的

 

在日常程式設計範圍內有很多大計算量的儲存過程,在業務系統中使用Java實現多執行緒往往會有參與計算的任務不能均勻分配、不能完全發揮資料庫伺服器的高階效能,程式碼實現起來門檻較高,比較麻煩。因此,本文件將通過DIY方式介紹如何在Oracle資料庫伺服器實現儲存過程的並行處理。

 

 

2 背景

 

  • 有一個很大的計算過程,參與計算的物件非常多。例如資料固化、應收核定等。

  • 要用PL/SQL逐行處理,當然這這樣做會有大量的讀取和DML操作。

  • 我們使用一臺多CPU的資料庫伺服器,並且有大量磁碟空間。

  • 我們發現作業系統/SQL並不是非常容易擴充套件的,它只使用了1個CPU,並沒有利用整個機器。

  • 由於我們使用固有的單執行緒程式來處理資料,ORACLE並行查詢不可用!

  • “一個人的活多個人做”並行處理,將固有的任務/資料分解成N個不重疊的組,同時開始PL/SQL子程式N個拷貝。

 

3 範圍

 

本文件適用於所有使用Oracle 10g的專案,系統吞吐量大,有一定執行時間限制的應用場合。

 

4 詞彙表

 

詞彙名稱

詞彙含義

備註

DBMS_SCHEDULER

Oracle任務排程器

只有Oracle 10g支援新特性

READ LOCK

Oracle行排他鎖

Oracle 任何版本

Autonomous Transactions

Oracle自治事務

Oracle 任何版本

Dynamic SQL

Oracle 動態SQL

Oracle 任何版本

 

 

總體架構設計

  

 

設計原則和方法

 

原則:

 

  1. 提供一個脫離業務、通用性強的功能元件。

  2. 易於複用,程式碼修改少,可配置滿足不同要求。

  3. 對控制重複執行有所考慮。

  4. 元件提供人性化的客戶互動介面,解決進度情況展示的問題。

  5. 能有一個實現和效率之間的平衡。

 

方法:

 

此元件中的並行執行遵循了幾乎相同的邏輯。通常可以將某個大“任務”劃分為較小的部分,並且併發地執行各個部分。例如,如果需要計算一大批結果並把資料儲存到資料庫中,那麼完全可以建立4 個或更多並行會話(P001~P004)來一起執行儲存過程,任務的分派有一個任務分派器來做,分派器可以按照每個程序的負載情況均勻的分派任務。每個會話分別呼叫預定義的業務過程來執行分派器分派的任務。當需要提交處理結果的時候,可以在每個業務過程內進行儲存。

 

此元件作為一種實現架構,可以使一些要求吞吐量大、執行效率高的的操作得到大幅改善,使其能夠呈數量級提高。由於此架構對系統資源要求較高,通常情況下應該在非高峰期而且有足夠資源的情況下之用。

 

2 系統整體架構

 

20170103074933450.png

 

3 系統級元件

 

DBMS_SCHEDULER是Oracle 10G中新增的一個包,與老版本的DBMS_JOB包相比,DBMS_SCHEDULER有很多新特性。Oracle 10g引入DBMS_SCHEDULER來替代先前的DBMS_JOB,在功能方面,它比DBMS_JOB提供了更強大的功能和更靈活的機制。

 

DBMS_JOB這個程式包存在的問題是它只能夠處理 PL/SQL 程式碼段,即僅能處理匿名程式塊和儲存程式單元。它不能在資料庫外部處理作業系統命令檔案或可執行檔案中的任何東西。 

 

為此,您將不得不求助於作業系統排程實用工具。另外DBMS_JOB所生成任務程序一旦生成就在資料庫中一直有效,不能在任務結束後自動終止。

 

DBMS_SCHEDULE是直接在資料庫內部的一個作業排程實用程式,強大到足夠處理所有型別的作業,而不只是 PL/SQL 程式碼段。它可以在處理任務執行結束後自動終止。最好的一點是它是資料庫自帶的,無需任何額外的成本,這樣我們在實現上直接使用即可。

 

4 流程圖各部分說明

 

  • 前臺使用者:主要是進行程式排程,主要是任務是把我程式執行時機。

 

  • 任務列表:通過一個普通表實現,該表中主要包括了業務過程執行過程中所需要的入參,引數的形式為‘|’分隔的字串。同時附加了異常及進度資訊。該表是由程式開發人員根據具體的業務定義結構並生成入引數據。

 

  • 程序控制:根據系統引數或業務引數呼叫DBMS_SCHEDULER生成對應個數的服務程序。依據當前程序執行情況,控制任務的重複執行。當出現緊急情況時終止所有服務程序。

 

  • 任務讀取:通過ORACLE的自制事務及鎖特性,實現任務讀取的一致性,即每次服務程序處理一行任務資料的時候,不被其它的服務程序重複讀取。

 

  • 業務過程:該部分同樣由程式開發人員根據具體業務型別開發儲存過程。該過程根據傳入的過程名稱和引數個數動態呼叫業務儲存過程。

 

  • 服務程序:ORACLE自動管理的程序,服務程序的數量取決於“程序控制”建立的程序數。服務程序主要工作1、通過“任務讀取”獲得“業務過程”的入參。2、呼叫“業務過程”生成業務資料。

 

  • 資料儲存:業務過程處理之後生成的結果。

 

  • 程序監視:“前臺使用者”呼叫之後任務執行的監控,包括正在執行情況及最終執行結果。

 

 系統介面設計  

 

1 程式開發介面設計

 

此元件向開發人員公佈3個系統介面,1個除錯介面。

 

 

  • PKG_多執行緒服務.PRC_程序控制

 

入參:

PRM_PROGRAM   即要呼叫的業務過程名稱。

PRM_PARMCOUNT 即對應業務過程的引數個數

 

  • PKG_多執行緒服務.PRC_程序停止

 

直接終止後臺正在執行的多執行緒服務。

 

  • PKG_多執行緒服務.PRC_除錯使用

 

入參:

PRM_PROGRAM   即要呼叫的業務過程名稱。

PRM_PARMS      即對應業務過程的引數字串。

 

因為是動態呼叫儲存過程,所以SC01中的引數個數必須同業務過程個數嚴格對應,提供此方法主要是讓開發人員除錯使用。

 

  • 任務列表SC01

 

開發人員要壓入的任務,即業務過程的引數。引數必須以‘|’分隔,並且保證在多執行緒服務執行的過程中,其他模組不能對SC01進行DML操作,為實現其他模組不能操作SC01,在任何DML操作之前必須執行一個語句如下:

 

SELECTCOUNT(*)

      INTO N_EXISTS

      FROM USER_SCHEDULER_JOBSS

     WHERE S.STATE = 'RUNNING'

AND S.JOB_ACTION = 'PKG_多執行緒服務.PRC_服務程序';

 

綜上所述執行一個ORACLE多執行緒服務,開發人員只需要做一項工作即壓入正確SC01引數,然後直接呼叫即可。

 

2 使用者展示介面設計

 

前臺查詢SC02、SC03檢視

 

 資料庫結構設計  

 

1 資料表設計

 

描述:模組任務分派表Sc01

 

20170103074952198.png

 

2 檢視設計

 

 

  • 描述:執行監視試圖Sc02

 

CREATE OR REPLACE VIEW SC02 AS

SELECT S.JOB_CREATOR        現場建立使用者,

      S.JOB_NAME            執行緒名稱,

      S.JOB_ACTION          過程名稱,

      S.last_start_date           啟動時間,

      S.COMMENTS           備註,

      (SELECT COUNT(*)

         FROM SC01

        WHERE THREAD_NAME = lower(S.JOB_NAME)

          AND STATUS = '0') 未處理數,

      (SELECT COUNT(*)

         FROM SC01

        WHERE THREAD_NAME = lower(S.JOB_NAME)

          AND STATUS = '1') 執行成功數,

      (SELECT COUNT(*)

         FROM SC01

        WHERE THREAD_NAME = lower(S.JOB_NAME)

          AND STATUS = '-1') 執行失敗數

 FROM USER_SCHEDULER_JOBS S

 ORDERBY S.JOB_NAME;

  

  • 描述:執行結果監視試圖sc03

 

CREATE OR REPLACE VIEW SC03 AS

SELECT S.OWNER             使用者名稱,

      S.JOB_NAME          執行緒名稱,

      S.STATUS            執行緒狀態,

      S.LOG_DATE          日誌時間,

      S.ACTUAL_START_DATE 執行緒實際執行時間,

      S.RUN_DURATION      執行緒持續執行時間,

      S.SESSION_ID        會話ID,

      S.SLAVE_PID         程序ID,

      S.ADDITIONAL_INFO   執行緒備註資訊,

      (SELECT COUNT(*) FROM Sc01 WHERE thread_name = lower(S.JOB_NAME) ANDstatus = '0') 未處理數,

      (SELECT COUNT(*) FROM Sc01 WHERE thread_name = lower(S.JOB_NAME) ANDstatus = '1') 執行成功數,

      (SELECT COUNT(*) FROM Sc01 WHERE thread_name = lower(S.JOB_NAME) ANDstatus = '-1')執行失敗數

 FROM USER_SCHEDULER_JOB_RUN_DETAILS S

 ORDER BY S.JOB_NAME;

 

3 資料安全性

 

所需要系統的許可權如下:

grant manage scheduler to AHSIMIS;

grant create any job to AHSIMIS;

 

 尚需解決的問題  

 

如果是RAC環境,程式尚不能跨例項執行。

原文釋出時間為:2017-01-03

 

 

 

本文來自雲棲社群合作伙伴DBAplus

架構 Oracle SQL 執行緒 資料庫 多執行緒 程式設計 儲存過程

 

作者

稀奇古怪

TA的文章

相關文章

https://m.aliyun.com/yunqi/articles/80140

 

 

 

儲存過程中是否有多執行緒的概念 

[複製連結]

IT漁夫

論壇徽章:

23

2014年世界盃參賽球隊: 哥斯大黎加 日期:2014-06-06 15:02:04沸羊羊 日期:2015-06-17 14:51:07天枰座 日期:2015-07-17 09:51:12金牛座 日期:2016-03-21 21:10:40摩羯座 日期:2016-03-29 15:07:30娜美 日期:2016-06-22 19:49:29奧運會紀念徽章:籃球 日期:2016-09-02 09:45:25奧運會紀念徽章:現代五項 日期:2016-09-23 16:25:05布魯克 日期:2017-03-21 09:35:18山治 日期:2018-01-04 21:26:16

電梯直達跳轉到指定樓層

1#

 發表於 2016-3-2 10:07 | 只看該作者 回帖獎勵

本帖最後由 IT漁夫 於 2016-3-2 10:07 編輯

在目前所做的資料庫中,需要接入不同的地區(地區有上百個)的資料,針對每個地區,都會需要建立很多自動JOB,這些JOB針對不同的執行頻率,有的是5分鐘執行一次,有的是10分鐘執行一次,有的是1個小時執行一次,有的是半天執行一次。如果直接在JOB中建立的話,會需要在JOB中建立非常多JOB(如果按100個地區,JOB按執行頻率分5分鐘、10分鐘、半小時、1小時、半天、一天分的話,將會要建立100*6=600個JOB),管理起來非常的繁瑣,有沒有更簡單的辦法建立和管理這些JOB。


ORACLE的儲存過程中,是否有多執行緒處理的概念? 同時處理多個地區的資料,相互間不影響。這樣的話,就只需要針對不同執行頻率,一個執行頻率,建立一個JOB。比如在10分鐘執行頻率的JOB中,呼叫某個計算儲存過程,這個儲存過程中,以多執行緒的方式同時啟動對多個地區的計算,而不同地區的計算相互不影響(而不是按順序對不同地區進行計算,執行完一個地區,再接著執行另外一個)。
 

使用道具 舉報

回覆
   

IT漁夫

論壇徽章:

23

2014年世界盃參賽球隊: 哥斯大黎加 日期:2014-06-06 15:02:04沸羊羊 日期:2015-06-17 14:51:07天枰座 日期:2015-07-17 09:51:12金牛座 日期:2016-03-21 21:10:40摩羯座 日期:2016-03-29 15:07:30娜美 日期:2016-06-22 19:49:29奧運會紀念徽章:籃球 日期:2016-09-02 09:45:25奧運會紀念徽章:現代五項 日期:2016-09-23 16:25:05布魯克 日期:2017-03-21 09:35:18山治 日期:2018-01-04 21:26:16

2#

  樓主| 發表於 2016-3-2 10:23 | 只看該作者

本帖最後由 IT漁夫 於 2016-3-2 11:50 編輯

用DBMS_JOB.SUBMIT 可以實現,但是會造成一個問題,每次的DBMS_JOB.SUBMIT,都是建立一個會話,如果迴圈100個地區,做DBMS_JOB.SUBMIT的話,就會產生100個會話。經過1分鐘後,這些會話會被自動刪除。因此需要把processes引數改得更大。
 
 

使用道具 舉報

回覆
   

隱劍埋名

認證徽章

論壇徽章:

10

射手座 日期:2015-11-23 14:22:242016猴年福章 日期:2016-02-18 09:31:30秀才 日期:2016-02-18 09:24:30雙子座 日期:2016-01-27 10:10:49天枰座 日期:2016-01-13 16:00:59天枰座 日期:2016-01-13 15:48:12秀才 日期:2016-01-06 14:01:09天蠍座 日期:2015-11-25 16:11:14白羊座 日期:2015-11-24 10:35:21技術圖書徽章 日期:2017-09-18 11:45:07

3#

 發表於 2016-3-2 11:35 | 只看該作者

我們做的是建一張JOB表,來管理,然後寫一個儲存過程批量建一遍就行了。
 
 

使用道具 舉報

回覆
   

test_100

認證徽章

論壇徽章:

16

ERP板塊每日發貼之星 日期:2007-08-24 01:03:56秀才 日期:2017-03-02 10:30:14ITPUB14週年紀念章 日期:2015-10-26 17:23:44處女座 日期:2015-09-11 10:28:03獅子座 日期:2015-09-10 09:07:23喜羊羊 日期:2015-06-24 14:33:00慢羊羊 日期:2015-06-15 14:22:442015年新春福章 日期:2015-03-12 17:22:46優秀寫手 日期:2014-11-20 06:00:13茶雞蛋 日期:2013-06-29 22:37:49

4#

 發表於 2016-3-2 13:06 | 只看該作者

用dbms_parallel_execute試試~
 
 

使用道具 舉報

回覆
   

IT漁夫

論壇徽章:

23

2014年世界盃參賽球隊: 哥斯大黎加 日期:2014-06-06 15:02:04沸羊羊 日期:2015-06-17 14:51:07天枰座 日期:2015-07-17 09:51:12金牛座 日期:2016-03-21 21:10:40摩羯座 日期:2016-03-29 15:07:30娜美 日期:2016-06-22 19:49:29奧運會紀念徽章:籃球 日期:2016-09-02 09:45:25奧運會紀念徽章:現代五項 日期:2016-09-23 16:25:05布魯克 日期:2017-03-21 09:35:18山治 日期:2018-01-04 21:26:16

5#

  樓主| 發表於 2016-3-2 15:20 | 只看該作者

test_100 發表於 2016-3-2 13:06 
用dbms_parallel_execute試試~

這個應該不行。。。
 
 

使用道具 舉報

回覆
   

newkid

論壇徽章:

531

奧運會紀念徽章:壘球 日期:2008-09-15 01:28:12生肖徽章2007版:雞 日期:2008-11-17 23:40:58生肖徽章2007版:馬 日期:2008-11-18 05:09:48資料庫板塊每日發貼之星 日期:2008-11-29 01:01:02資料庫板塊每日發貼之星 日期:2008-12-05 01:01:03生肖徽章2007版:虎 日期:2008-12-10 07:47:462009新春紀念徽章 日期:2009-01-04 14:52:28資料庫板塊每日發貼之星 日期:2009-02-08 01:01:03生肖徽章2007版:蛇 日期:2009-03-09 22:18:532009日食紀念 日期:2009-07-22 09:30:00

6#

 發表於 2016-3-3 01:06 | 只看該作者

IT漁夫 發表於 2016-3-2 10:23 
用DBMS_JOB.SUBMIT 可以實現,但是會造成一個問題,每次的DBMS_JOB.SUBMIT,都是建立一個會話,如果迴圈100 ...

多執行緒必然要發起多個會話。
你這樣動態建立一次性JOB的意義何在?還不如事先建立好。
 
 

使用道具 舉報

回覆
   

IT漁夫

論壇徽章:

23

2014年世界盃參賽球隊: 哥斯大黎加 日期:2014-06-06 15:02:04沸羊羊 日期:2015-06-17 14:51:07天枰座 日期:2015-07-17 09:51:12金牛座 日期:2016-03-21 21:10:40摩羯座 日期:2016-03-29 15:07:30娜美 日期:2016-06-22 19:49:29奧運會紀念徽章:籃球 日期:2016-09-02 09:45:25奧運會紀念徽章:現代五項 日期:2016-09-23 16:25:05布魯克 日期:2017-03-21 09:35:18山治 日期:2018-01-04 21:26:16

7#

  樓主| 發表於 2016-3-3 08:07 | 只看該作者

newkid 發表於 2016-3-3 01:06 
多執行緒必然要發起多個會話。
你這樣動態建立一次性JOB的意義何在?還不如事先建立好。

這些JOB太多,要事先建立,管理起來很麻煩。
 
 

使用道具 舉報

回覆
   

 

 

newkid

論壇徽章:

531

奧運會紀念徽章:壘球 日期:2008-09-15 01:28:12生肖徽章2007版:雞 日期:2008-11-17 23:40:58生肖徽章2007版:馬 日期:2008-11-18 05:09:48資料庫板塊每日發貼之星 日期:2008-11-29 01:01:02資料庫板塊每日發貼之星 日期:2008-12-05 01:01:03生肖徽章2007版:虎 日期:2008-12-10 07:47:462009新春紀念徽章 日期:2009-01-04 14:52:28資料庫板塊每日發貼之星 日期:2009-02-08 01:01:03生肖徽章2007版:蛇 日期:2009-03-09 22:18:532009日食紀念 日期:2009-07-22 09:30:00

8#

 發表於 2016-3-3 23:52 | 只看該作者

IT漁夫 發表於 2016-3-3 08:07 
這些JOB太多,要事先建立,管理起來很麻煩。

建立完就被ORACLE管理了,你不用管。
建立的指令碼你自己可以用SQL生成。
 

http://www.itpub.net/thread-2053863-1-1.html

 

 

 

 

[PL/SQL] 如何實現儲存過程多執行緒執行 

[複製連結]

ciwei5525

論壇徽章:

0

電梯直達跳轉到指定樓層

1#

 發表於 2017-11-27 10:09 | 只看該作者 回帖獎勵

儲存過程中會迴圈遍歷一個標準表,通過提取標準表中的sql進行資料抽取並將符合條件的資料新增到另一個表中。標準表中有1000+條資料規則sql是期中的欄位。
大致流程是
begin
  for a in select * from 標準表
    line:=a.sql;   --(sql內容是from XXX where XXX)
    line:='insert into table select 1,2,3,4,5 ' || line;
    EXECUTE IMMEDIATE (line);
end
目前我知道可以用/*+parallel(a,16)*/來進行DML並行,但是我想做這個儲存過程的多執行緒該怎麼做?
我百度了大多儲存過程併發執行需要用job實現但是看的雲裡霧裡,希望大佬們幫幫忙...
 

使用道具 舉報

回覆
   

test_100

認證徽章

論壇徽章:

16

ERP板塊每日發貼之星 日期:2007-08-24 01:03:56秀才 日期:2017-03-02 10:30:14ITPUB14週年紀念章 日期:2015-10-26 17:23:44處女座 日期:2015-09-11 10:28:03獅子座 日期:2015-09-10 09:07:23喜羊羊 日期:2015-06-24 14:33:00慢羊羊 日期:2015-06-15 14:22:442015年新春福章 日期:2015-03-12 17:22:46優秀寫手 日期:2014-11-20 06:00:13茶雞蛋 日期:2013-06-29 22:37:49

2#

 發表於 2017-11-27 13:44 | 只看該作者

本帖最後由 test_100 於 2017-11-27 13:46 編輯
  1.     l_task      := 'XX_000004';
  2.     l_chunk_sql := ' select t.cst_id,t.cst_id from aa_xx_t t ';
  3.     l_sql       := 'Begin proce_name_pck.pro_mut(:start_id,:end_id); End;';
  4.     dbms_output.put_line(l_sql);
  5.     dbms_parallel_execute.create_task(task_name => l_task);
  6.     dbms_parallel_execute.create_chunks_by_sql(l_task, l_chunk_sql, False);
  7.   
  8.     dbms_parallel_execute.run_task(l_task,
  9.                                    l_sql,
  10.                                    dbms_sql.native,
  11.                                    parallel_level  => 16,
  12.                                    job_class       => Null);
  13.     dbms_parallel_execute.drop_task(l_task);
複製程式碼
 

相關推薦

Oracle PLSQLl執行程式設計架構 儲存過程使用執行 定時任務 作業排程計劃 JOB SCHEDULE

  基於Oracle plsql的多執行緒程式設計架構 (附儲存過程) 1年前 1413 作者介紹 馮守東,北京科訊華通科技發展有限公司高階專案經理。超12年Oracle開發及管理經驗,多年運營商和政府企業級系統運維經驗,曾獲得東軟最佳設計方案獎。熟悉Weblogic、TU

Oracle 定時任務 作業排程計劃 DBMS_JOB DBMS_SCHEDULE使用方法

  oracle定時任務dbms_job與dbms_scheduler使用方法 2018年08月20日 13:18:20 風靈使 閱讀數:111 工作中需要一個定時任務來抽取資料,之前採用的是dbms_job包下的過程來建立job,遇到了一些問題。找了下

Oracle儲存過程層巢狀遊標的用法

Oracle sql指令碼程式碼   CREATE OR REPLACE   PROCEDURE P_DELETE_QK (pId in NUMBER, deep in NUMBER) AS   -- pId = 分類ID  deep = 深度,層級   on

oracle儲存過程如何執行動態SQL語句

有時需要在oracle儲存過程中執行動態SQL語句 ,例如表名是動態的,或欄位是動態的,或查詢命令是動態的,可用下面的方法: set serveroutput ondeclare    n number;    sql_stmt varchar2(50);    t varc

資料讀取器具有個欄位。個欄位對於儲存過程的EDM原語或列舉型別無效

報錯程式碼: SqlParameter voteFrom = new SqlParameter("@voteFrom", workFlow.VoteFrom); SqlParameter voteTo = new SqlParameter("@voteTo",

Java執行程式設計核心技術(一)Java執行技能

主題:     這套文章主要是把書上的內容自己消化一遍,把核心內容跟重點挑出來。讀者可以用最少的時間瞭解這本書的內容。        第一章主要講解多執行緒的概念,使用方法,一些基本的api;每小節的內容不超過十句話的總結如下:   層級結構上是:     1.

java執行程式設計--模擬龜兔賽跑過程

剛開始學多執行緒程式設計,課上也沒認真聽,課下去網上找了PPT,又認真的學了一遍。 問題: 編寫龜兔賽跑多執行緒程式,設賽跑長度為100米,每跑完10米輸出一次結果。 採用實現Runnable

MFC筆記(四)——執行程式設計1:模組、程序、執行間的基本概念

一、模組、程序、執行緒 1.1 模組         一段可執行的程式(包括EXE和DLL),其程式程式碼、資料、資源被載入到記憶體中,由系統建立一個數據結構來管理它。這段程式就是一個模組。這裡所說

C++11執行程式設計 第三章: 如何向執行傳參

C++11 Multithreading – Part 3: Carefully Pass Arguments to Threads Varun January 22, 2015 C++11 Multithreading – Part 3: Carefully Pass Ar

C++11執行程式設計 第二章: join 和 detach 執行

  C++11 Multithreading – Part 2: Joining and Detaching Threads Varun January 21, 2015 C++11 Multithreading – Part 2: Joining and De

執行池運用例項——一次錯誤的執行程式設計以及修復過程

寫在前面的話  寫下這篇文章只為了回顧之前在實際工作中犯的一個極其二逼的錯誤,用我的經歷來提示後來者,諸位程式大神,大牛,小牛們看到此文笑笑即可,輕拍輕拍。。。 1 背景 有這麼一個需求,我們的系統(後面簡稱:A系統)需要在後臺執行一個報表匯出任務,在這個任務的執行過程中需要通過CORBA呼

C++——執行程式設計(二)std::mutex 執行同步、解決資源競爭問題

前言 執行緒同步 這裡的“同”不是同時、一起執行的意思,而是指協同、協助、互相配合。執行緒同步是指多個執行緒協同步調,按預定的先後次序進行執行。 執行緒A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B執行;B依言執行,再將結果給A;

Java 執行程式設計設計模式之 Thread Pool(執行池)

Java 中建立一個執行緒往往意味著JVM 會建立相應依賴於宿主機作業系統的本地執行緒(Native Thread)。 Thread Pool 模式的本質是使用極其有限的資源去處理相對無限的任務。核心思想是使用佇列對待處理的任務進行快取,並複用一定數量的工作者

執行程式設計部落格推薦及phread執行的深入理解

###Date:2017/10/31 轉載自: http://blog.csdn.net/lovecodeless/article/details/24468107(該部落格中有詳細的多執行緒程式設

python執行程式設計(3): 使用互斥鎖同步執行

問題的提出 上一節的例子中,每個執行緒互相獨立,相互之間沒有任何關係。現在假設這樣一個例子:有一個全域性的計數num,每個執行緒獲取這個全域性的計數,根據num進行一些處理,然後將num加1。很容易寫出這樣的程式碼: # encoding: UTF-8import

c++11執行程式設計(一):建立執行的三種方法

c++11執行緒庫原始的c++標準僅支援單執行緒程式設計,新的c++標準(c++11或c++0x)於2011年釋出,引入了新的執行緒庫。 編譯器要求 Linux: gcc 4.8.1 (完全併發支援) Windows: Visual Studio 2012 and Min

執行程式設計學習六(Java 的阻塞佇列).

介紹 阻塞佇列(BlockingQueue)是指當佇列滿時,佇列會阻塞插入元素的執行緒,直到佇列不滿;當佇列空時,佇列會阻塞獲得元素的執行緒,直到佇列變非空。阻塞佇列就是生產者用來存放元素、消費者用來獲取元素的容器。 當執行緒 插入/獲取 動作由於佇列 滿/空 阻塞後,佇列也提供了一些機制去處理,或丟擲異常,

C#執行程式設計(一)程序與執行

一、 程序         簡單來說,程序是對資源的抽象,是資源的容器,在傳統作業系統中,程序是資源分配的基本單位,而且是執行的基本單位,程序支援併發執行,因為每個程序有獨立的資料,獨立的堆疊空間。一個程式想要併發執行,開多個程序即可。

Java定時任務Timer排程器【二】 執行原始碼分析(圖文版)

  上一節通過一個小例子分析了Timer執行過程,牽涉的執行執行緒雖然只有兩個,但實際場景會比上面複雜一些。 首先通過一張簡單類圖(只列出簡單的依賴關係)看一下Timer暴露的介面。   為了演示Timer所暴露的介面,下面舉一個極端的例子(每一個介面方法面

Oracle PL/SQL 執行包裡的儲存過程 遊標輸出引數

oracle PL/SQL 如何執行包裡的儲存過程,儲存過程帶遊標輸出引數 [問題點數:40分] 收藏帖子 回覆 mjlwq 結帖率 87.5% create or replace package pkg_