2013-12-16 7 views
6

के साथ भाग में ब्लॉब डेटा पढ़ें/लिखें Hibernate का उपयोग कर blob से पढ़ने और लिखने का कोई तरीका है। अभी मुझे OutOfmemoryException मिल रहा है क्योंकि पूरे ब्लॉब डेटा को स्मृति में byte[] में लोड किया गया है।हाइबरनेट

अधिक विशिष्ट होने के लिए, मान लीजिए कि मैं File नामक डेटाबेस तालिका में एक बड़ी फ़ाइल को सहेजना चाहता हूं।

public class File { 
    private byte[] data; 
} 

मैं फ़ाइल को FileInputStream में खोलता हूं और फिर क्या? मैं हाइबरनेट को कैसे बताऊं कि मुझे सामग्री स्ट्रीम करने की आवश्यकता है और पूरे byte[] सरणी को एक बार में नहीं देगी? क्या मुझे byte[] के बजाय Blob का उपयोग करना चाहिए? वैसे भी मैं सामग्री को कैसे स्ट्रीम कर सकता हूं?

पढ़ने के संबंध में, क्या मैं एक हाइबरनेट बता सकता हूं कि (आलसी लोडिंग के अलावा) मुझे ब्लॉब को हिस्सों में लोड करने की आवश्यकता है, इसलिए जब मैं अपना File पुनर्प्राप्त करता हूं तो मुझे OutOfMemoryException नहीं देना चाहिए।

मैं उपयोग कर रहा हूँ:

  • ओरेकल 11.2.0.3.0
  • हाइबरनेट 4.2.3 अंतिम
  • ओरेकल ड्राइवर 11,2

उत्तर

11

हैं ब्लॉब मार्ग से जा रहा है, तो आप उपयोग करने की कोशिश की है Hibernate की LobHelpercreateBlob विधि, जो InputStream लेती है? ब्लॉब बनाने और डेटाबेस पर बने रहने के लिए, आप FileInputStream ऑब्जेक्ट और बाइट्स की संख्या प्रदान करेंगे।

आपकी फ़ाइल सेम/संस्था वर्ग इस तरह ब्लॉब (जेपीए एनोटेशन का उपयोग) से मैप कर सकते:

@Lob 
@Column(name = "DATA") 
private Blob data; 

// Getter and setter 

और व्यापार तर्क/डेटा का उपयोग वर्ग इस तरह अपने सेम/संस्था वस्तु के लिए ब्लॉब बना सकते हैं, देखभाल करने के डेटाबेस के लिए बने पहले इनपुट स्ट्रीम बंद नहीं करने के लिए:

FileInputStream fis = new FileInputStream(file); 
Blob data = getSession().getLobHelper().createBlob(fis, file.length()); 
fileEntity.setData(data); 
// Persist file entity object to database 

अन्य तरीके से जाने के लिए और मात्रा में एक धारा के रूप में डेटाबेस से ब्लॉब पढ़ने के लिए, आप ब्लॉब के getBinaryStream विधि कह सकते हैं, तो आप दे रही है इनपुटस्ट्रीम और आपको सेट करने की इजाजत देता है बफर आकार बाद में अगर जरूरत:

InputStream is = fileEntity.getData().getBinaryStream(); 

Struts 2 has a convenient configuration available that can set the InputStream result's buffer size

+0

मैं hbm.xml में @Lob को परिभाषित कैसे कर सकता हूं (हम hbm.xml फ़ाइलों में हमारे डोमेन ऑब्जेक्ट को परिभाषित करते हैं)? – Atticus

+0

मेरा मानना ​​है कि @ लॉब एनोटेशन वैकल्पिक है जब तक आप कहते हैं कि यह टाइप = "ब्लॉब" –

+1

कौन सा स्ट्रीम बंद करने जा रहा है? –