2012-03-27 24 views
7

मैं डेटाबेस में बड़े अनुलग्नक (500 एमबी, शायद, यदि संभव हो, यहां तक ​​कि> 2 जीबी) को सहेजना चाहता हूं। मुझे पता है कि ऐसा करने के पेशेवरों और विपक्षों पर अक्सर चर्चा की जाती है, लेकिन यह मेरे प्रश्न का ध्यान नहीं है।ईजेबी से डेटाबेस (एक मेमोरी कुशल तरीके से) से स्ट्रीम का उपयोग करके ब्लॉब सहेजें

जेपीए साथ EJB3 में ब्लॉब क्षेत्रों के भंडारण के परंपरागत तरीके से निम्नलिखित के रूप में एक कोड का उपयोग करने के लिए है:

@Lob 
private byte[] data; 

यह जब विशाल डेटा स्रोतों से निपटने, क्योंकि पूरे बाइट सरणी स्मृति में सहेजा गया है एक समस्या बन जाता है।

मैं ब्लॉब करने के लिए इसे बदलने की कोशिश की:

@Lob 
private Blob data; 

लेकिन यह एक ही समस्या का परिणाम है।

// session: Hibernate session. 
// Actually, I'd like to stay with JPA's abstraction and not 
// reference Hibernate directly, if possible 
Blob data = session.createBlob(inputStream, lengthOfStream); 

createBlob विधि इनपुटस्ट्रीम से बाइटअरे बनाता है।

ओआरएम मानचित्रण के कारण, मुझे आश्चर्य है कि डेटा के सम्मिलन को कैसे संभालना है। एक विचार एक इकाई चर

@Lob 
private byte[] data; 

कि मैं का उपयोग कभी नहीं होगा बनाने के लिए किया गया था। इस तरह, डेटाबेस स्कीमा का निर्माण हो जाता है। लेकिन क्योंकि @ लॉब एनोटेशन आलसी है, यह मेरी याददाश्त को मिटा नहीं देगा।

और फिर

entityManager.persist(dataObject); 
// The following lines are _completely_ imaginatory!! 
query.prepare("update DataObject d set d.data = :dataInputStream where d = :dataObject"); 
query.setProperty("dataObject", dataObject); 
query.setProperty("dataInputStream", someDataInputStream); 

एक समाधान मैं भर में अच्छा लग रहा है, लेकिन जेपीए का उपयोग नहीं करता ठोकर खाई लिखें: Grooviest way to store a BLOB in a database?

किसी को भी ऐसा करने के तरीके पर एक सलाह है?

+0

क्या आपके पास फ़ाइल पथ के चरण में ब्लॉब का उपयोग करने का कोई कारण है? – siebz0r

+0

हां, पोर्टेबिलिटी। विचार डेटाबेस में डेटा को स्टोर करना और फाइल सिस्टम पर कैश करना है। इस तरह, केवल डीबी और जार को एक नई प्रणाली में कॉपी किया जाना चाहिए - फ़ाइलों को स्वचालित रूप से फाइल सिस्टम में डीबी से कैश किया जाएगा। –

+0

मुझे नहीं लगता कि यह भंडारण का एक प्रभावी तरीका है। यदि स्टोरेज का पथ कॉन्फ़िगर करने योग्य है तो डेटाबेस में पथ केवल प्रारंभिक पथ का पोस्टफिक्स होना चाहिए। नकारात्मकता यह है कि आपको डीबी, जार और फाइलों को स्थानांतरित करने की आवश्यकता है। लेकिन मुझे लगता है कि पेशेवर यहां विपक्ष से अधिक हैं। – siebz0r

उत्तर

1

@ लॉब एनोटेशन को एक सीरियलज़ेबल ऑब्जेक्ट पर लागू किया जा सकता है। फिर आप की घोषणा कर सकता है:

@Lob 
private MySmartLOB data; 

और

public class MySmartLOB implements Serializable { 
    private void writeObject(java.io.ObjectOutputStream out) 
      throws IOException { 
     // tranfer data from local storage to 'out' 
    } 
    private void readObject(java.io.ObjectInputStream in) 
      throws IOException, ClassNotFoundException { 
     // tranfer data from 'in' to local storage 
    } 
} 

यह काम कर सकता था, उम्मीद अंतर्निहित जेपीए कार्यान्वयन बहुत चालाक एक ObjectOutputStream सीधे JDBC धारा को पहुंचाया आपूर्ति है कि और नहीं किसी प्रकार का बदसूरत ByteArrayOutputStream