2010-01-14 12 views
5

मैं एक ServletOutputStream के माध्यम से एक ब्लॉब के एक द्विआधारी धारा भेजना है +। ओरेकल 11, WebSphere 7, Springframework 2.5.5, हाइबरनेट 3.3.SP1:वसंत MVC + ओरेकल LOBs स्ट्रीमिंग

मैं निम्नलिखित प्रौद्योगिकियों और सॉफ्टवेयर का उपयोग कर रहा हूँ।

दो ओरेकल डेटाबेस हैं। पहले दस्तावेजों में मुझे दस्तावेजों के विवरण के लिए टेबल शामिल हैं, और दूसरा - दस्तावेज़ों की सामग्री।

मैं वसंत में WebSphere और JtaTransactionManager में XA datasources के लिए भी कॉन्फ़िगर किया है समर्थन करते हैं।

मैं किसी दस्तावेज़ के लिए एक संदर्भ प्राप्त करने और एक लेन-देन ही सामग्री।

JDBC विनिर्देश हमें बताता है कि LOBs व्यवहार वस्तुओं रहे हैं और पोर्टेबल अनुप्रयोगों लेनदेन के भीतर इस तरह की वस्तुओं का उपयोग करना चाहिए।

और मैं निम्नलिखित प्रश्न हैं:

  1. यह लेन-देन संबंधी विधि के भीतर ब्लॉब के इनपुट धारा निकालते हैं और यह शीर्ष स्तर के गैर लेन-देन विधि को पारित करने के लिए कानूनी है? कुछ इस तरह:

    @Transactional 
    public InputStream getContent(Long docId) { 
     Blob blob = getBlob(...); 
     return blob.getBinaryStream(); 
    } 
 

    public ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) { 
     Long docId = ServlerRequestUtils.getRequiredLongParameter(req); 
     InputStream is = service.getContent(docId); 
     copy(is, resp.getOutputStream()); 
     return null; 
    } 
  1. अगर यह कानूनी अंत उपयोगकर्ता के लिए ब्लॉब के बाइनरी धारा स्थानांतरित करने का तरीका अगर ब्लॉब की सामग्री काफी बड़ी है नहीं है और एप्लिकेशन सर्वर में पूर्वसंरचित लेनदेन टाइमआउट है? क्या मुझे मैन्युअल रूप से लेनदेन को संभालना है और टाइमआउट को शून्य पर सेट करना है (लेनदेन कभी समय समाप्त नहीं होता है)?

  2. सबसे अच्छा तरीका है इस तरह के एक मामले में अंतिम उपयोगकर्ता को ब्लॉब के बाइनरी धारा हस्तांतरण करने के लिए क्या है?

उत्तर

5

तुम लौट बूँद की धारा एक अच्छा विचार है सही में है कि अपने tx विधि से बाहर नहीं ... यह कुछ निश्चित परिस्थितियों में काम कर सकते हैं, डेटाबेस निर्भर करता है, लेकिन यह जोखिम भरा है।

समाधान समस्या को अंदर से बदलना है। अपने लेनदेन विधि में सर्वलेट के OutputStream पास करें। यह लेन-देन समस्या से बचने के लिए, और एक ही स्थान पर अपनी स्ट्रीम से निपटने रखता है:, मैं कुछ इसी तरह किया है

@Transactional 
public void getContent(Long docId, OutputStream outputStream) { 
    Blob blob = getBlob(...); 
    InputStream blobStream = blob.getBinaryStream(); 
    copy(blobStream, outputStream); 
    blobStream.close(); // ignoring the usual stream closing try/catch stuff for brevity 
} 

public ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) { 
    Long docId = ServlerRequestUtils.getRequiredLongParameter(req); 
    service.getContent(docId, resp.getOutputStream()); 
    return null; 
} 
+0

धन्यवाद एक बहुत है और अब मैं लेनदेन टाइमआउट बारे में चिंतित हूँ, खासकर जब प्रयोक्ता के कनेक्शन पर्याप्त धीमा है और मुझे हस्तांतरण करने वाली सामग्री काफी बड़ी है। क्या लेन-देन टाइमआउट को "लेनदेन कभी समय समाप्त नहीं" करना ठीक है? – szhem

+0

बिल्कुल, कोई समस्या नहीं है – skaffman

+0

एक स्वीकार्य समाधान खोजने में मदद के लिए एक बार फिर धन्यवाद :) – szhem

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