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
設計原則和方法
原則:
-
提供一個脫離業務、通用性強的功能元件。
-
易於複用,程式碼修改少,可配置滿足不同要求。
-
對控制重複執行有所考慮。
-
元件提供人性化的客戶互動介面,解決進度情況展示的問題。
-
能有一個實現和效率之間的平衡。
方法:
此元件中的並行執行遵循了幾乎相同的邏輯。通常可以將某個大“任務”劃分為較小的部分,並且併發地執行各個部分。例如,如果需要計算一大批結果並把資料儲存到資料庫中,那麼完全可以建立4 個或更多並行會話(P001~P004)來一起執行儲存過程,任務的分派有一個任務分派器來做,分派器可以按照每個程序的負載情況均勻的分派任務。每個會話分別呼叫預定義的業務過程來執行分派器分派的任務。當需要提交處理結果的時候,可以在每個業務過程內進行儲存。
此元件作為一種實現架構,可以使一些要求吞吐量大、執行效率高的的操作得到大幅改善,使其能夠呈數量級提高。由於此架構對系統資源要求較高,通常情況下應該在非高峰期而且有足夠資源的情況下之用。
2 系統整體架構
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
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的文章
相關文章
- PLSQL Developer軟體使用大全
- PLSQL Developer軟體使用大全
- PLSQL_Oracle Exception異常分類、異常丟擲、異常處理、異常傳播(概念)
- Oracle之PL/SQL程式設計_流程控制語句
- think in java interview-高階開發人員面試寶典(九)
https://m.aliyun.com/yunqi/articles/80140
儲存過程中是否有多執行緒的概念[複製連結] |
論壇徽章: 23 |
1# 發表於 2016-3-2 10:07 | 只看該作者
|
|
回覆 | ||
論壇徽章: 23 |
2# 樓主| 發表於 2016-3-2 10:23 | 只看該作者
|
|
回覆 | ||
認證徽章 論壇徽章: 10 |
3# 發表於 2016-3-2 11:35 | 只看該作者
|
|
回覆 | ||
認證徽章 論壇徽章: 16 |
4# 發表於 2016-3-2 13:06 | 只看該作者
|
|
回覆 | ||
論壇徽章: 23 |
5# 樓主| 發表於 2016-3-2 15:20 | 只看該作者
|
|
回覆 | ||
論壇徽章: 531 |
6# 發表於 2016-3-3 01:06 | 只看該作者
|
|
回覆 | ||
論壇徽章: 23 |
7# 樓主| 發表於 2016-3-3 08:07 | 只看該作者
|
|
回覆 | ||
論壇徽章: 531 |
8# 發表於 2016-3-3 23:52 | 只看該作者
|
|
http://www.itpub.net/thread-2053863-1-1.html
[PL/SQL] 如何實現儲存過程多執行緒執行[複製連結] |
論壇徽章: 0 |
1# 發表於 2017-11-27 10:09 | 只看該作者
|
|
回覆 | ||
認證徽章 論壇徽章: 16 |
2# 發表於 2017-11-27 13:44 | 只看該作者
|
|
相關推薦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_ |