
اگر با پایگاه داده Oracle کار کرده باشید، احتمالاً با سناریوهایی روبهرو شدهاید که در آن چند Session یا برنامه مختلف باید با هم ارتباط برقرار کنند.
برای مثال یک فرآیند در دیتابیس کاری را انجام میدهد و فرآیند دیگری باید منتظر بماند تا از پایان آن مطلع شود. Oracle برای چنین موقعیتهایی مکانیزمی به نام DBMS_PIPE ارائه کرده است.
پکیج DBMS_PIPE یکی از ابزارهای داخلی Oracle برای ارسال و دریافت پیام بین Sessionهای مختلف در پایگاه داده است.
این ابزار نوعی ارتباط بین پردازشی (Inter‑Process Communication) فراهم میکند که به برنامهها اجازه میدهد بدون نیاز به جدول یا فایل واسط، با یکدیگر ارتباط برقرار کنند.
در این مقاله آموزش Oracle در بخش آموزش پکیج های اوراکلی، بررسی میکنیم که DBMS_PIPE در Oracle چیست،
آیا تا به حال برایتان پیش آمده که یک کوئری در دیتابیس اوراکل روزها با سرعت عالی اجرا شود و ناگهان بدون هیچ تغییری در کد، سرعت آن افت کند؟
این کابوس بسیاری از مدیران دیتابیس (DBA) است که معمولاً به دلیل تغییر در پلن اجرایی توسط Optimizer رخ میدهد. خبر خوب این است که اوراکل با پکیج DBMS_SPM راهکاری قدرتمند برای پایان دادن به این بیثباتیها در اختیار ما قرار داده است.
پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
DBMS_PIPE یک پکیج داخلی در Oracle است که برای انتقال پیام بین Sessionهای مختلف دیتابیس استفاده میشود. این پیامها از طریق کانالی به نام Pipe منتقل میشوند.
Pipe در واقع یک کانال ارتباطی نامدار است که پیامها در آن قرار میگیرند و Sessionهای دیگر میتوانند آنها را دریافت کنند.
این پیامها در حافظه SGA دیتابیس نگهداری میشوند و موقتی هستند. بنابراین اگر دیتابیس Restart شود، همه پیامها از بین میروند.
به طور ساده فرآیند به این شکل انجام میشود:
یک Session پیام را در Pipe قرار میدهد → پیام در حافظه دیتابیس ذخیره میشود → Session دیگر آن پیام را دریافت میکند.
این مکانیزم به صورت FIFO کار میکند؛ یعنی اولین پیام ارسال شده، اولین پیامی است که دریافت میشود.
مهمترین کاربردهای پکیج DBMS_PIPE
DBMS_PIPE در سناریوهای مختلفی در Oracle استفاده میشود. برخی از مهمترین کاربردهای آن عبارتاند از:
- ارتباط بین چند Session در Oracle
- ارسال پیام بین برنامههای مختلف
- هماهنگسازی پردازشها و Jobها
- اطلاعرسانی بین فرآیندهای دیتابیس
- Debug و مانیتورینگ سیستمهای پیچیده
- ارتباط Oracle با برنامههای خارجی
برای مثال در یک سیستم پردازش داده ممکن است یک فرآیند بعد از پایان کار خود پیامی ارسال کند تا فرآیند دیگری پردازش بعدی را آغاز کند.
مهمترین توابع DBMS_PIPE در Oracle
برای استفاده از DBMS_PIPE چند تابع اصلی وجود دارد که در ادامه آنها را بررسی میکنیم.
PACK_MESSAGE
تابع PACK_MESSAGE برای قرار دادن داده در بافر Pipe استفاده میشود.
DBMS_PIPE.PACK_MESSAGE('Hello World');
در واقع این تابع داده را آماده میکند تا در Pipe ارسال شود.
SEND_MESSAGE
تابع SEND_MESSAGE پیام را به Pipe ارسال میکند.
DBMS_PIPE.SEND_MESSAGE(
pipename IN VARCHAR2,
timeout IN INTEGER DEFAULT MAXWAIT
)
پارامترها:
- pipename : نام Pipe
- timeout : زمان انتظار برای ارسال پیام
مقدار بازگشتی این تابع:
- ۰ : ارسال موفق
- ۱ : Timeout
RECEIVE_MESSAGE
برای دریافت پیام از Pipe از این تابع استفاده میشود.
DBMS_PIPE.RECEIVE_MESSAGE(
pipename IN VARCHAR2,
timeout IN INTEGER
)
اگر پیام موجود نباشد، Session تا مدت زمان مشخص شده منتظر میماند.
UNPACK_MESSAGE
بعد از دریافت پیام باید داده از Pipe استخراج شود.
DBMS_PIPE.UNPACK_MESSAGE(variable)
این تابع دادهای را که قبلاً با PACK_MESSAGE ارسال شده بود، بازیابی میکند.
CREATE_PIPE
اگر بخواهید Pipe را به صورت دستی ایجاد کنید میتوانید از این دستور استفاده کنید.
DBMS_PIPE.CREATE_PIPE('MY_PIPE');
REMOVE_PIPE
برای حذف Pipe از این متد استفاده میشود.
DBMS_PIPE.REMOVE_PIPE('MY_PIPE');
مثال از ارسال و دریافت پیام در Oracle
برای درک بهتر، یک مثال ساده از ارتباط بین دو Session در Oracle بررسی میکنیم.
فرض کنید نام Pipe برابر MY_PIPE است.
ارسال پیام (Session اول)
DECLARE
status NUMBER;
BEGIN
DBMS_PIPE.PACK_MESSAGE('Hello from session 1');
status := DBMS_PIPE.SEND_MESSAGE('MY_PIPE');
DBMS_OUTPUT.PUT_LINE('Status: ' || status);
END;
اگر مقدار status برابر صفر باشد، پیام با موفقیت ارسال شده است.
دریافت پیام (Session دوم)
DECLARE
status NUMBER;
msg VARCHAR2(200);
BEGIN
status := DBMS_PIPE.RECEIVE_MESSAGE('MY_PIPE',10);
DBMS_PIPE.UNPACK_MESSAGE(msg);
DBMS_OUTPUT.PUT_LINE('Received: ' || msg);
END;
خروجی:
Received: Hello from session 1
ارسال چند نوع داده در DBMS_PIPE
یکی از قابلیتهای مهم DBMS_PIPE این است که میتوان چند نوع داده مختلف ارسال کرد.
انواع داده قابل ارسال شامل موارد زیر است:
- VARCHAR2
- NUMBER
- DATE
- RAW
مثال:
DECLARE
status NUMBER;
BEGIN
DBMS_PIPE.PACK_MESSAGE('Ali');
DBMS_PIPE.PACK_MESSAGE(1000);
DBMS_PIPE.PACK_MESSAGE(SYSDATE);
status := DBMS_PIPE.SEND_MESSAGE('EMP_PIPE');
END;
دریافت دادهها:
DECLARE
name VARCHAR2(50);
salary NUMBER;
d DATE;
BEGIN
DBMS_PIPE.RECEIVE_MESSAGE('EMP_PIPE');
DBMS_PIPE.UNPACK_MESSAGE(name);
DBMS_PIPE.UNPACK_MESSAGE(salary);
DBMS_PIPE.UNPACK_MESSAGE(d);
DBMS_OUTPUT.PUT_LINE(name || ' ' || salary || ' ' || d);
END;
Pipe عمومی و خصوصی در Oracle
Pipeها در Oracle میتوانند عمومی یا خصوصی باشند.
Pipe عمومی (Public Pipe)
اگر Pipe از قبل ایجاد نشده باشد، Oracle به صورت خودکار آن را ایجاد میکند و همه Sessionها میتوانند از آن استفاده کنند.
Pipe خصوصی (Private Pipe)
در این حالت فقط مالک Pipe میتواند از آن استفاده کند.
DBMS_PIPE.CREATE_PIPE(
pipename => 'PRIVATE_PIPE',
private => TRUE
);
مفهوم Timeout در RECEIVE_MESSAGE
اگر هنگام دریافت پیام، Pipe خالی باشد، Session تا زمان مشخصی منتظر میماند.
DBMS_PIPE.RECEIVE_MESSAGE('MY_PIPE',10)
در این مثال Session تا ۱۰ ثانیه منتظر پیام میماند.
مقدار بازگشتی:
- ۰ : پیام دریافت شد
- ۱ : Timeout رخ داده است
تفاوت DBMS_PIPE و DBMS_ALERT
Oracle دو مکانیزم برای ارتباط بین Sessionها ارائه میدهد: DBMS_PIPE و DBMS_ALERT.
DBMS_PIPE برای ارسال پیام و انتقال داده استفاده میشود، در حالی که DBMS_ALERT بیشتر برای ارسال اعلان و اطلاعرسانی کاربرد دارد.
در DBMS_PIPE امکان ارسال چند نوع داده و مدیریت پیامها وجود دارد، اما DBMS_ALERT بیشتر برای سیگنالدهی ساده طراحی شده است.
محدودیتهای پکیج DBMS_PIPE
با وجود کاربردهای مفید، این ابزار محدودیتهایی نیز دارد:
- پیامها در حافظه SGA ذخیره میشوند و دائمی نیستند
- با Restart شدن دیتابیس پیامها حذف میشوند
- برای حجم بالای پیام مناسب نیست
- قابلیت مدیریت صف پیشرفته ندارد
جایگزینهای مناسب برای DBMS_PIPE
در معماریهای جدید معمولاً از ابزارهای پیشرفتهتر استفاده میشود، از جمله:
- Oracle Advanced Queuing (DBMS_AQ)
- Oracle Streams
- Kafka
- RabbitMQ
این ابزارها امکاناتی مانند ذخیره دائمی پیامها، مقیاسپذیری بالا و مدیریت پیشرفته صفها را فراهم میکنند.
سوالات متداول درباره پکیج DBMS_PIPE در اوراکل
DBMS_PIPE یک پکیج داخلی در پایگاه داده Oracle است که برای برقراری ارتباط بین Sessionهای مختلف استفاده میشود.
این پکیج به برنامهها اجازه میدهد پیامهایی را از طریق کانالی به نام Pipe ارسال و دریافت کنند. DBMS_PIPE معمولاً برای هماهنگسازی پردازشها، ارسال سیگنال بین برنامهها و ارتباط بین فرآیندهای دیتابیس به کار میرود.
در DBMS_PIPE یک Session میتواند با استفاده از تابع PACK_MESSAGE داده را آماده کند و سپس با SEND_MESSAGE آن را به یک Pipe ارسال کند.
Session دیگر با استفاده از RECEIVE_MESSAGE پیام را از همان Pipe دریافت کرده و با UNPACK_MESSAGE داده را استخراج میکند. این پیامها در حافظه SGA دیتابیس ذخیره میشوند و به صورت موقت هستند.
DBMS_PIPE برای ارسال پیام و انتقال داده بین Sessionها طراحی شده است و امکان ارسال انواع داده مانند VARCHAR2، NUMBER و DATE را دارد.
در مقابل، DBMS_ALERT بیشتر برای ارسال اعلان (Notification) استفاده میشود و معمولاً برای اطلاعرسانی ساده بین Sessionها کاربرد دارد.
به طور کلی DBMS_PIPE انعطافپذیری بیشتری برای انتقال داده دارد.
خیر. پیامهای DBMS_PIPE در حافظه SGA ذخیره میشوند و دائمی نیستند.
به همین دلیل با Restart شدن دیتابیس تمام Pipeها و پیامهای موجود در آن حذف میشوند.
اگر نیاز به سیستم پیامرسانی پایدار داشته باشید، بهتر است از ابزارهایی مانند Oracle Advanced Queuing (DBMS_AQ) استفاده کنید.
جمعبندی
پکیج DBMS_PIPE یکی از ابزارهای داخلی Oracle برای برقراری ارتباط بین Sessionهای مختلف دیتابیس است.
این پکیج امکان ارسال و دریافت پیام از طریق Pipe را فراهم میکند و در سناریوهایی مانند هماهنگسازی پردازشها، ارسال سیگنال بین برنامهها و ارتباط بین فرآیندهای دیتابیس کاربرد دارد.
اگرچه در سیستمهای مدرن ابزارهای پیشرفتهتری برای مدیریت پیامها وجود دارد، اما DBMS_PIPE همچنان یکی از مفاهیم مهم در معماری داخلی Oracle محسوب میشود و آشنایی با آن برای توسعهدهندگان و متخصصان دیتابیس بسیار مفید است.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید