2010-09-19 10 views
8

मेरे पास डेटा है जो डिस्क से स्ट्रीम किया गया है और जावा एप्लिकेशन द्वारा स्मृति में संसाधित किया गया है और अंततः SQL सर्वर में कॉपी करने की आवश्यकता है। डेटा काफी बड़ा हो सकता है (इसलिए स्ट्रीमिंग) और डालने के लिए कई 100,000 पंक्तियों की आवश्यकता हो सकती है। लगता है कि सबसे तेज़ समाधान SQL सर्वर की थोक-प्रति सुविधा का उपयोग कर रहा है। हालांकि, मुझे जावा प्रोग्रामों को आसानी से या लगभग तेज़ करने के लिए कोई रास्ता नहीं मिला है।जावा से SQL सर्वर में थोक-प्रतिलिपि करने का सबसे प्रभावी तरीका क्या है?

  • .NET में SqlBulkCopy वर्ग का उपयोग करना:

    यहाँ कुछ तरीके कि मैं पहले से ही जांच की है कर रहे हैं। यह बहुत ही कुशल है क्योंकि आप डेटा स्रोत से सीधे डेटा स्ट्रीम कर सकते हैं और सीधे SQL सर्वर पर स्ट्रीम कर सकते हैं। इस दृष्टिकोण के साथ समस्या यह है कि आपको .NET चलाने की आवश्यकता है। शायद इसका उपयोग जावा का उपयोग .NET ब्रिज से किया जा सकता है। हालांकि, मैं रनटाइम के बीच डेटा को मार्शल करने की लागत के बारे में सोचता हूं।

  • बल्क INSERT TSQL कथन का उपयोग करना। इसके साथ समस्या यह है कि आपको डिस्क पर एक उचित रूप से स्वरूपित फ़ाइल बनाने की आवश्यकता है। मैंने इसका उपयोग करके जेडीबीसी के बैच सम्मिलन पर कुछ छोटे प्रदर्शन लाभ देखे हैं। इसके अलावा, यह केवल स्थानीय रूप से उपयोगी है।

  • डिस्क पर फ़ाइलों को लिखें और बीसीपी कमांड लाइन उपयोगिता का उपयोग करें। अभी भी जेडीबीसी बैच डालने से थोड़ा तेज है लेकिन इतना नहीं। मैं इस विधि के साथ लेनदेन का उपयोग करने की क्षमता भी खो देता हूं।

  • C API का उपयोग करें। फिर, बहुत ही कुशल, लेकिन आपको सी का उपयोग करने की आवश्यकता है। जेएनआई के माध्यम से इसका उपयोग करने का एक तरीका होगा। अगर वहाँ कुछ मुफ्त जावा लाइब्रेरी है जो ऐसा करता है, तो मैं इसके बारे में जानना चाहता हूं।

मैं सबसे तेज़ समाधान की तलाश में हूं। स्मृति एक मुद्दा नहीं है।

धन्यवाद!

+0

जब आप कहते हैं कि डेटा का स्रोत जावा है - क्या आप विस्तृत कर सकते हैं? क्या जावा एप्लिकेशन/एप्लेट की याद में डेटा है? – InSane

+0

शेन में आपके उत्तर के लिए धन्यवाद। मैंने सवाल थोड़ा और विस्तृत किया है। –

उत्तर

1
  • .NET उत्तर के लिए मैं IKVM की अनुशंसा करता हूं। फिर आपका जावा कोड .NET कोड होगा और आप किसी भी .NET कोड को कॉल कर सकते हैं।
  • बल्क इंसर्ट को यह भी आवश्यक है कि थोक फ़ाइल SQL सर्वर से पहुंच योग्य हो। यह केवल एक स्थानीय विकल्प है। बैच अपडेट से प्रदर्शन अलग-अलग जेडीबीसी ड्राइवरों के बीच भिन्न हो सकता है।
  • देशी कॉल के लिए मुझे जेएनए (जावा मूल पहुंच) का उपयोग करने की सिफारिश की जाएगी। फिर आपको कोई सी कोड लिखने की आवश्यकता नहीं है।
+0

अगर मैं कभी भी उन समाधानों में से किसी एक के साथ जाता हूं तो इस उत्तर में कुछ उपयोगी जानकारी है। यह बहुत अच्छा होगा अगर किसी ने पहले से ही एक अच्छी मुफ्त लाइब्रेरी लिखी है जो सी एपीआई को एक अच्छे इंटरफ़ेस में लपेटती है। मैं इसे खुद कर सकता हूं। –

0

मेरे लिए सबसे अच्छा विकल्प मानक JDBC साथ DataDirect से वाणिज्यिक एसक्यूएल सर्वर JDBC ड्राइवर का उपयोग किया गया कॉल लिनक्स और विंडोज के पार चला addBatch/executeBatch - https://blogs.datadirect.com/2012/05/how-to-bulk-insert-jdbc-batches-into-microsoft-sql-server-oracle-sybase.html

मैंने देखा है लोड समय 7 से में सुधार घंटे 30 मिनट से कम।

0

SQL सर्वर के लिए माइक्रोसॉफ्ट जेडीबीसी ड्राइवर के संस्करण 4.2 के बाद, com.microsoft.sqlserver.jdbc.SQLServerBulkCopy नामक एक वर्ग है जो .NET के SqlBulkCopy वर्ग जैसा ही है।

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

  • कोई संबंधित समस्या नहीं^_^