2013-06-21 5 views
5

हमारे पास सी और प्रो * सी में लिखा गया एक एप्लीकेशन है जो मेजबान सरणी और थोक प्रविष्टि का उपयोग करके लॉग फ़ाइलों से डेटा को ओरेकल 11.2 डेटाबेस में सम्मिलित करता है। यह सीधे पथ सम्मिलन का लाभ उठाने और उत्पन्न रेडो की मात्रा को कम करने के लिए APPEND और NOLOGGING संकेतों का उपयोग करता है। NOLOGGING इसके लिए समझ में आता है यह एक अस्थायी स्टेजिंग टेबल है और आवश्यकता होने पर डेटा लॉग फ़ाइलों से पुनर्प्राप्त किया जा सकता है।क्या जेडीबीसी/जावा के साथ सीधी पथ सम्मिलन का उपयोग करना संभव है?

हम जावा में इस कार्यक्षमता को दोहराने की कोशिश कर रहे हैं लेकिन बड़ी संख्या में रिकॉर्ड्स के प्रत्यक्ष पथ सम्मिलन का उपयोग करने में असमर्थ रहे हैं। जावा/जेडीबीसी के साथ यह संभव है?

चीजें हैं जो मैं करने की कोशिश की और जांच की है कर रहे हैं:

  • JDBC बैचिंग (दोनों मानक बैचिंग और Oracle's extensions)। यह दृष्टिकोण राउंड ट्रिप के समय पर बचाता है लेकिन यह नगण्य है क्योंकि एप्लिकेशन डेटाबेस के समान मशीन पर है। यह प्रत्यक्ष पथ का भी उपयोग नहीं करता है।
  • APPEND_VALUES संकेत। यह वादा करता है लेकिन थोड़ा समझ में आता है क्योंकि जेडीबीसी बैचिंग वास्तव में कई रिकॉर्डों के "सरणी" डालने के लिए प्रकट नहीं होती है।

जो मैं समझता हूं, सीधे पथ प्रविष्टियां केवल the subquery syntax and not the VALUES clause का समर्थन करती हैं। इसका उपयोग नहीं किया जा सकता है क्योंकि डेटा डालने के लिए अभी तक डेटाबेस में मौजूद नहीं है।

मैं जावा के किसी भी संदर्भ को होस्ट एरे स्टाइल लोडिंग का उपयोग करने में सक्षम नहीं हूं जो Pro * C उपयोग करता है।

एक तरफ, हम बाहरी टेबल लोडिंग या एसक्यूएल * लोडर की जांच कर रहे हैं और सराहना करते हैं कि ये उपकरण सीधे पथ लोड करने में सक्षम हैं, लेकिन यह प्रश्न वास्तव में एक निश्चित उत्तर प्राप्त करने के बारे में है कि जावा से प्रत्यक्ष पथ सम्मिलन भी संभव है या नहीं । जावा एपीआई की सीमाओं को समझना न केवल इस परियोजना के लिए बल्कि भविष्य की परियोजनाओं के लिए उपयोगी है।

तो सवाल दोहराने के लिए, क्या कोई तरीका है कि मैं जावा से प्रत्यक्ष पथ सम्मिलन का उपयोग कर सकता हूं?

संबंधित प्रश्न:

+0

क्या आपको jdbc के माध्यम से प्रत्यक्ष-सम्मिलित करने का कोई तरीका मिला है? – Denis

+0

नहीं। ऐसा नहीं लगता है कि यह संभव है। हम बस संयोज का उपयोग कर समाप्त हो गए टियोनल पथ लोडिंग और समानांतर। मुझे अभी भी उम्मीद है कि कोई भी साथ आएगा और कुछ याद करेगा जो मुझे याद आया। –

+0

मुझे लगता है कि एसएमबी इसका परीक्षण करने में सक्षम था, हालांकि यह उसके मामले में उपयोगी नहीं था: http://asanga-pradeep.blogspot.com/2014/10/appendvalues-hint-and-jdbc.html – Denis

उत्तर

0

ओरेकल प्रलेखन स्पष्ट रूप से इस में कहा गया है:

If you are performing an INSERT with the VALUES clause, specify the APPEND_VALUES hint in 
each INSERT statement immediately after the INSERT keyword. Direct-path INSERT with the VALUES 
clause is best used when there are hundreds of thousands or millions of rows to load. The 
    typical usage scenario is for array inserts using OCI. Another usage scenario might be inserts in a FORALL statement in PL/SQL 

तो आपके प्रश्न का उत्तर एपीपी END_VALUES संकेत है। मैं आपकी पोस्ट में देख सकता हूं कि आपने इसे आजमाया है लेकिन यह नहीं समझ सकता कि आपको किस समस्या का सामना करना पड़ा।

इसके अलावा आपकी पोस्ट में यह दावा सही नहीं है "जो मैं समझता हूं, उससे सीधे पथ प्रविष्टियां केवल सबक्वायरी वाक्यविन्यास का समर्थन करती हैं, न कि VALUES खंड।"Oracle प्रलेखन इस उदाहरण देता है:

निम्नलिखित PL/SQL कोड टुकड़ा APPEND_VALUES का उपयोग करने का एक उदाहरण है संकेत:

FORALL i IN 1..numrecords 
    INSERT /*+ APPEND_VALUES */ INTO orderdata 
    VALUES(ordernum(i), custid(i), orderdate(i),shipmode(i), paymentid(i)); 
COMMIT; 

ओरेकल प्रलेखन के लिए लिंक: http://docs.oracle.com/cd/E11882_01/server.112/e25494/tables004.htm#i1009100

नमूना कोड:

dbConnection.setAutoCommit(false);//commit trasaction manually 

String insertTableSQL = "INSERT /*+ APPEND_VALUES */ INTO DBUSER" 
      + "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES" 
      + "(?,?,?,?)";    
PreparedStatement = dbConnection.prepareStatement(insertTableSQL); 

preparedStatement.setInt(1, 101); 
preparedStatement.setString(2, "test1"); 
preparedStatement.setString(3, "system"); 
preparedStatement.setTimestamp(4, getCurrentTimeStamp()); 
preparedStatement.addBatch(); 

preparedStatement.setInt(1, 102); 
preparedStatement.setString(2, "test2"); 
preparedStatement.setString(3, "system"); 
preparedStatement.setTimestamp(4, getCurrentTimeStamp()); 
preparedStatement.addBatch(); 
preparedStatement.executeBatch(); 

dbConnection.commit(); 
+1

मैंने कोशिश की है यह और यह प्रत्यक्ष-पथ सम्मिलित नहीं करता है, क्योंकि आप अभी भी एक समय में केवल एक रिकॉर्ड डाल रहे हैं, एक सरणी नहीं (जैसा कि ओपी द्वारा उल्लिखित है और पीएल/एसक्यूएल उदाहरण में दिखाया गया है)। –

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