2009-01-13 7 views
15

मुझे जावा में एक (वास्तव में) उच्च प्रदर्शन मेमोरी डेटाबेस/स्टोरेज तंत्र को लागू करने के लिए विचारों की आवश्यकता है। 20,000+ जावा वस्तुओं को संग्रहित करने की सीमा में, हर 5 या तो सेकंड में अपडेट किया जाता है।
कुछ विकल्प मैं कर रहा हूँ खोलने के लिए:जावा में उच्चतम प्रदर्शन डेटाबेस

शुद्ध JDBC/डेटाबेस संयोजन

JDO

जेपीए/ORM/डेटाबेस संयोजन

एक वस्तु डाटाबेस

अन्य भंडारण तंत्र

मेरा सबसे अच्छा विकल्प क्या है? आपके अनुभव क्या हैं?

संपादित करें: मैं भी इन वस्तुओं

उत्तर

12

आप Prevayler जैसे कुछ कोशिश कर सकते हैं (मूल रूप से एक इन-मेमोरी कैश जो आपके लिए क्रमबद्धता और बैकअप को संभालता है ताकि डेटा बनी रहती है और लेनदेन से सुरक्षित है)। अन्य समान परियोजनाएं हैं। मैंने इसे एक बड़ी परियोजना के लिए उपयोग किया है, यह सुरक्षित और बेहद तेज़ है।

यदि यह 20,000 ऑब्जेक्ट्स का एक ही सेट है, या कम से कम 20,000 नई ऑब्जेक्ट्स हर 5 सेकंड में नहीं हैं लेकिन बहुत सारे बदलाव हैं, तो आप बदलावों को कैश करने और बैच मोड में समय-समय पर परिवर्तन लिखने से बेहतर हो सकते हैं (jdbc बैच अपडेट बहुत अधिक हैं व्यक्तिगत पंक्ति अद्यतन से तेज़)। इस पर निर्भर करता है कि क्या आपको प्रत्येक लेखन को लेनदेन से लपेटने की आवश्यकता है, और क्या आपको परिवर्तन लॉग या केवल कुल परिवर्तनों के रिकॉर्ड की आवश्यकता होगी।

संपादित: के रूप में अन्य पदों Prevayler उल्लेख किया है मैंने सोचा कि मैं यह क्या करता है पर एक नोट छोड़ चाहते हैं: मूल रूप से आप एक खोज/serializable वस्तु (आमतौर पर किसी प्रकार का मानचित्र) बना है जो एक Prevayler में लपेटा जाता है उदाहरण, जो डिस्क पर क्रमबद्ध है। अपने मानचित्र पर सीधे परिवर्तन करने के बजाय, आप अपने प्रीवायलर इंस्टेंस को अपने परिवर्तन का एक क्रमिक रिकॉर्ड भेजकर परिवर्तन करते हैं (केवल एक ऑब्जेक्ट जिसमें परिवर्तन निर्देश होता है)। प्रीवायलर का लेनदेन का संस्करण डिस्क में अपने क्रमिक परिवर्तनों को लिखना है ताकि विफलता की स्थिति में यह अंतिम पूर्ण बैकअप लोड कर सके और फिर उसके खिलाफ परिवर्तनों को फिर से चला सके। यह सुरक्षित है, हालांकि आपके पास अपने सभी डेटा को लोड करने के लिए पर्याप्त मेमोरी है, और यह काफी पुरानी एपीआई है, इसलिए दुर्भाग्य से कोई सामान्य इंटरफ़ेस नहीं है। लेकिन निश्चित रूप से स्थिर और विज्ञापित के रूप में काम करता है।

+0

Prevayler में बहुत रुचि रखते हैं ... किसी भी अच्छे ट्यूटोरियल के बारे में पता है? – systemoutprintln

+0

साइट पर प्रलेखन बहुत व्यापक नहीं है, लेकिन लाइब्रेरी डाउनलोड में डेमो शामिल हैं। उपयोग बहुत सरल है। –

+0

स्टीव, क्या आप प्रीवायलर के बारे में मेरे प्रश्न को देख सकते हैं? http://stackoverflow.com/questions/454294/what-are-synchronizing-strategies-for-prevayler – Sergey

4

निम्नलिखित का प्रयास करें क्वेरी में सक्षम होना चाहते की जरूरत है, यह हाइबरनेट साथ वास्तव में अच्छा प्रदर्शन करता है और अन्य ORM चौखटे

http://hsqldb.org/

1

आप सभी संग्रहीत करना चाहते हैं स्मृति में आपके डेटा का, आप Prevayler को देखना चाहेंगे।

मैंने इसे कभी भी उपयोग नहीं किया है, लेकिन यह उन मामलों के लिए एक संबंधपरक डेटाबेस का उपयोग करने से बेहतर समाधान की तरह लगता है जिसमें आपका सभी डेटा स्मृति में संग्रहीत किया जा सकता है।

7

मुझे नहीं पता कि यह सबसे तेज़ विकल्प है, लेकिन जब भी मैंने इसका उपयोग किया है, तो मैं H2 से बहुत संतुष्ट हूं। यह उसी व्यक्ति द्वारा लिखा गया है जिसने मूल रूप से हाइपरोनिक लिखा (जो बाद में एचएसक्यूएलडीबी बन गया)।

कथित तौर पर बहुत तेज़ विकल्प Prevayler है।

+0

prevayler एक डेटाबेस नहीं है:

यहाँ वास्तविक संख्या के साथ कुछ हाल के प्रदर्शन अनुसंधान कर रहे हैं? विषय = PrevaylerIsNotADatabase – nes1983

+1

"डेटाबेस" की आपकी परिभाषा पर निर्भर करता है। यह निश्चित रूप से एक संबंधपरक डेटाबेस नहीं है, लेकिन यह डेटाबेस के न्यूनतम परिभाषा को पूरा करने के लिए प्रतीत होता है। –

+0

अच्छी तरह से, मुझे लगता है कि यह सच है। मेरा मतलब था कि यह रैम में जितना डेटा हो सकता है उतना ही डेटा रखता है। – nes1983

1

hsqldb काफी तेज़ है, लेकिन यह एसीआईडी ​​लेनदेन-सुरक्षित नहीं है। सबसे तेज़ जावा-डेटाबेस मुझे पता है db4o: benchmarks

संपादित करें: कृपया ध्यान दें कि प्रीवायरर डेटाबेस नहीं है, http://www.prevayler.org/wiki.jsp?topic=PrevaylerIsNotADatabase देखें। यदि आप रैम से बाहर हैं, तो आप भाग्य से बाहर हैं।

1

Berkeley DB for Java स्मृति डेटाबेस में तेज़ है, जो साधारण ऑब्जेक्ट ग्राफ़ के लिए बेहद उपयोगी है।

+2

हम्म। बीडीबी एक मेमोरी डेटाबेस नहीं है, लेकिन डिस्क-समर्थित एक है। यह स्पष्ट रूप से मेमोरी में अपनी अधिकांश सामग्री को कैश कर सकता है, जैसे कि सभी उत्पादन-तैयार डीबी, लेकिन मुझे नहीं पता कि इसमें स्मृति-केवल मोड भी है या नहीं। – StaxMan

2

टेराकोटा भी आपके लिए जवाब हो सकता है। यह कई वीएम ऑब्जेक्ट्स को साझा करने की इजाजत देता है ताकि आप लोड इत्यादि वितरित कर सकें ...

8

मैं अत्यधिक अनुशंसा करता हूं H2। यह मूल लेखकों में से एक द्वारा किए गए एचएसक्यूएलडीबी का "दूसरा पीढ़ी" संस्करण है। एच 2 हमें वास्तविक डीएओओ परत को एक वास्तविक PostgreSQL डेटाबेस की आवश्यकता के बिना यूनिट-टेस्ट करने की अनुमति देता है, जो भयानक है।

वहाँ एक सक्रिय शुद्ध समूह और मेलिंग सूची है, और लेखक थॉमस मुलर प्रश्नों का बहुत संवेदनशील है (हां, थोड़ा वहाँ यमक।)

+0

यह समर्थन multithreads? – MadMad666

0

आप CSQL (खुला स्रोत और उद्यम संस्करण के तहत उपलब्ध है) की कोशिश कर सकते यह डिस्क आधारित डेटाबेस सिस्टम पर 30X प्रदर्शन सुधार प्रदान करता है और जेडीबीसी इंटरफ़ेस प्रदान करता है। इसे स्टैंड अकेले मुख्य मेमोरी डेटाबेस या MySQL, Postgres, Oracle डेटाबेस में एक पारदर्शी कैश के रूप में काम करने के लिए कॉन्फ़िगर किया जा सकता है।

+0

क्या आप मुझे ओपन सोर्स संस्करण के लिए एक लिंक प्रदान कर सकते हैं? – systemoutprintln

2

तुम भी बाहर की जाँच कर सकते हैं db4o

1

एच 2 सही मायने में शानदार है, वास्तव में, स्मृति, सामान्य सर्वर और व्यवहार में, आप यह सब किया है। हालांकि यह ऑब्जेक्ट डेटाबेस में प्रदर्शन में तुलना नहीं करता है, मुझे लगता है कि डीबी 4o ने उल्लेख किया है, वास्तव में नियोडैटिस के साथ मेरा बेहतर प्रदर्शन हुआ है, और सब कुछ अच्छी तरह से मैवेन रिपॉजिटरीज़ में स्थापित है। यद्यपि बहुत मजबूत नहीं, फेरारी की तरह, तेज़ लेकिन ओरेकल जैसे ट्रक नहीं।

5

यह एक पुराना सवाल है, लेकिन इन दिनों वहां बहुत सारे डेटाबेस हैं जिनमें 20,000/एस के प्रदर्शन का स्तर है। चुनने के लिए कौन सा डेटाबेस डेटा संरचना और उन प्रश्नों के प्रकार पर निर्भर करता है जिन्हें आप बनाना चाहते हैं। यह समग्र मात्रा पर भी निर्भर करता है।

हमें बड़ी मात्रा में समय श्रृंखला डेटा, लगभग 300,000 रिक/एस के साथ समान समस्या थी और हमने सरल पर्याप्त एपीआई और सभ्य प्रदर्शन के साथ एक नया डेटाबेस NFSdb लिखना समाप्त कर दिया। यह लगभग 2,000,000 ऑब्जेक्ट लिख सकता है और हमने ओआरएम के बिना दूर किया।

JournalFactory factory = new JournalFactory("/mnt1/data/tick"); 

MyObject o = new MyObject(); 
try (JournalWriter<MyObject> writer = factory.writer(MyObject.class)) { 

    o.setBlah(...); 
    writer.append(o); 

    // more appends here 
    // 
    writer.commit(); 
} 
+0

अहह .. यही वह प्रयास है जिसे मैं ढूंढ रहा था। – kromit

+1

जब मैंने वेबसाइट पर जाने का प्रयास किया, तो मुझे "डेटाबेस कनेक्शन स्थापित करने में त्रुटि" मिली .. विडंबना! –

+0

ऐसा लगता है कि इसे https://www.questdb.org/ पर ले जाया गया है –

3

Chronicle Map किसी एम्बेड शुद्ध जावा लगातार डेटाबेस, एक सरल java.util.Map इंटरफेस प्रदान कर रहा है: संग्रहण एपीआई तरह दिखता है। यह 1 मिलियन प्रति सेकंड से एक थ्रेड से लगातार पढ़ने/लिखने के प्रदर्शन और मशीनों में कोर की संख्या के लिए रैखिक रूप से स्केल करता है।http://www.prevayler.org/wiki.jsp: