2012-03-07 12 views
6

क्या एक प्रक्रिया से ओरेकल (ओसीआई के माध्यम से) से कनेक्ट होने की संभावना है, फिर किसी अन्य प्रक्रिया से उसी डेटाबेस सत्र से कनेक्ट करें?क्या मैं दो ओसीआई ग्राहकों से एक ओरेकल सत्र बनाए रख सकता हूं?

मेरे वर्तमान ऐप में, डेटाबेस तक पहुंचने के दो तरीके हैं: एक तुल्यकालिक एक और एक असीमित एक (एक अलग प्रक्रिया का उपयोग करके, सॉकेट के माध्यम से संचार)। समस्या अलग-अलग सत्रों को लागू करने वाली दो विधियां है।

यदि मैं उदाहरण का प्रयास करता हूं एक सत्र पर एक अपडेट, फिर बिना किसी अन्य सत्र से उसी तालिका को अपडेट करने का प्रयास करें, मुझे ओसीआई कॉल पर लटका मिलता है।

इससे भी बदतर, यदि एक सत्र चर एक सत्र से सेट किया गया है - दूसरा सत्र इसे नहीं देखता है (जो नाम कहता है ...)।

उत्तर

6

यदि आप 11 जी डेटाबेस का उपयोग कर रहे हैं, तो आप पहले सत्र द्वारा शुरू किए गए लेन-देन में शामिल होने के लिए DBMS_XA package का उपयोग कर सकते हैं। टिम हॉल डीमोमनस्ट्रेट्स के रूप में, आप एक सत्र में लेनदेन शुरू कर सकते हैं, उस लेनदेन में किसी अन्य सत्र से जुड़ सकते हैं, और लेनदेन में किए गए असामान्य परिवर्तनों को पढ़ सकते हैं। दुर्भाग्यवश, हालांकि, यह सत्र चर के साथ मदद नहीं करेगा (यह मानते हुए कि "सत्र चर" का मतलब पैकेज चर है जिसमें सत्र स्कोप है)।

पैकेज और टेबल बनाएं:

CREATE TABLE foo(col1 NUMBER); 

create or replace package pkg_foo 
as 
    g_var number; 
    procedure set_var(p_in number); 
end; 

create or replace package body pkg_foo 
as 
    procedure set_var(p_in number) 
    as 
    begin 
    g_var := p_in; 
    end; 
end; 

सत्र 1 में, हम एक वैश्विक लेन-देन शुरू करते हैं, पैकेज चर सेट, और (वैश्विक लेन-देन को निलंबन से पहले तालिका में एक पंक्ति सम्मिलित जो दूसरे सत्र की अनुमति देता है सत्र 2 में यह फिर से शुरू करने)

SQL> ed 
Wrote file afiedt.buf 

    1 declare 
    2 l_xid dbms_xa_xid := dbms_xa_xid(1); 
    3 l_ret integer; 
    4 begin 
    5 l_ret := dbms_xa.xa_start(l_xid, dbms_xa.tmnoflags); 
    6 pkg_foo.set_var(42); 
    7 dbms_output.put_line('Set pkg_foo.g_var to ' || pkg_foo.g_var); 
    8 insert into foo values(42); 
    9 l_ret := dbms_xa.xa_end(l_xid, dbms_xa.tmsuspend); 
10* end; 
SQL>/
Set pkg_foo.g_var to 42 

PL/SQL procedure successfully completed. 

, हम वैश्विक लेन-देन, टेबल से पढ़ने को फिर से शुरू, सत्र चर पढ़ा है, और वैश्विक लेन-देन होता है। ध्यान दें कि तालिका के विरुद्ध क्वेरी हमारे द्वारा डाली गई पंक्ति को देखती है लेकिन पैकेज परिवर्तनीय परिवर्तन दिखाई नहीं दे रहा है।

SQL> ed 
Wrote file afiedt.buf 

    1 declare 
    2 l_xid dbms_xa_xid := dbms_xa_xid(1); 
    3 l_ret integer; 
    4 l_col1 integer; 
    5 begin 
    6 l_ret := dbms_xa.xa_start(l_xid, dbms_xa.tmresume); 
    7 dbms_output.put_line('Read pkg_foo.g_var as ' || pkg_foo.g_var); 
    8 select col1 into l_col1 from foo; 
    9 dbms_output.put_line('Read COL1 from FOO as ' || l_col1); 
10 l_ret := dbms_xa.xa_end(l_xid, dbms_xa.tmsuccess); 
11* end; 
SQL>/
Read pkg_foo.g_var as 
Read COL1 from FOO as 42 

PL/SQL procedure successfully completed. 

सत्र के बीच सत्र स्थिति को साझा करने के लिए, यह पैकेज वैरिएबल का उपयोग कर के बजाय एक global application context का उपयोग करना संभव हो सकता है? यदि आप डेटाबेस टेबल और सत्र स्थिति दोनों को पढ़ना चाहते हैं तो आप इसे DBMS_XA पैकेजों के साथ जोड़ सकते हैं।

संदर्भ और गेटर और सेटर

CREATE CONTEXT my_context 
    USING pkg_foo 
    ACCESSED GLOBALLY; 

create or replace package pkg_foo 
as 
    procedure set_var(p_session_id in number, 
        p_in   in number); 
    function get_var(p_session_id in number) 
    return number; 
end; 

create or replace package body pkg_foo 
as 
    procedure set_var(p_session_id in number, 
        p_in   in number) 
    as 
    begin 
    dbms_session.set_identifier(p_session_id); 
    dbms_session.set_context('MY_CONTEXT', 'G_VAR', p_in, null, p_session_id); 
    end; 
    function get_var(p_session_id in number) 
    return number 
    is 
    begin 
    dbms_session.set_identifier(p_session_id); 
    return sys_context('MY_CONTEXT', 'G_VAR'); 
    end; 
end; 

सत्र 1 में साथ पैकेज बनाएँ, सत्र 12345

begin 
    pkg_foo.set_var(12345, 47); 
end; 

अब, सत्र 2 के लिए संदर्भ से 47 चर G_VAR का मान सेट संदर्भ

1* select pkg_foo.get_var(12345) from dual 
SQL>/

PKG_FOO.GET_VAR(12345) 
---------------------- 
        47 
+0

हाँ, "सत्र चर" का मान पैकेज मान से पढ़ सकता है iable कि सत्र स्कोप है ... तो यह दृष्टिकोण एक समाधान नहीं है। फिर भी धन्यवाद! – user581243

+0

@ user581243 - कोई भी मौका आप पैकेज चर के बजाय वैश्विक संदर्भों का उपयोग कर सकते हैं? मैंने उस संभावना के साथ अपना जवाब अपडेट किया। –

+0

फिर से धन्यवाद। यह बहुत दिलचस्प है। हालांकि मुझे इसे C++ कोड परत पर हल करने की आवश्यकता है, न कि pl/sql कोड परत पर। यह एक बंद स्थिति नहीं है, यह ऐसा कुछ है जो अक्सर होता है। हमारे ऐप के लिए, सी ++ कोड को पीएल/एसक्यूएल कोड से बहुत कम संशोधित किया गया है और यही कारण है कि मैं जटिलता को pl/sql कोड में स्थानांतरित नहीं करना चाहता हूं। – user581243

संबंधित मुद्दे

 संबंधित मुद्दे