2012-01-26 12 views
20

तक पहुंचने में असमर्थ मैं अपने वर्गों से ऑरैक टेबल तक मैपिंग करने के लिए हाइबरनेट 3.6.7 का उपयोग कर रहा हूं।org.hibernate.HibernateException: लॉब स्ट्रीम

org.hibernate.HibernateException: Unable to access lob stream 
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222) 
    at java.util.concurrent.FutureTask.get(FutureTask.java:83) 
    at com.mycompany.TransferFiles.TransferFilesToHadoop(TransferFiles.java:85) 
    at com.mycompany.TransferJob.execute(TransferJob.java:25) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525) 
Caused by: org.hibernate.HibernateException: Unable to access lob stream 
     at org.hibernate.type.descriptor.java.ClobTypeDescriptor.unwrap(ClobTypeDescriptor.java:117) 
    at org.hibernate.type.descriptor.java.ClobTypeDescriptor.unwrap(ClobTypeDescriptor.java:46) 
    at org.hibernate.type.descriptor.sql.ClobTypeDescriptor$3$1.doBind(ClobTypeDescriptor.java:83) 
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:91) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:283) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:278) 
    at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:89) 
    at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2184) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2558) 
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2494) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2821) 
    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:113) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 
    at com.mycompany.HibernateUtil.getSession(HibernateUtil.java:36) 
    at com.mycompany.BasicDaoImpl.saveOrUpdate(BasicDaoImpl.java:34) 
    at com.mycompany.FileCopyRoutine.call(TransferFiles.java:297) 
    at com.mycompany..FileCopyRoutine.call(TransferFiles.java:225) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: java.sql.SQLException: Closed Connection 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) 
    at oracle.sql.CLOB.getDBAccess(CLOB.java:1196) 
    at oracle.sql.CLOB.getCharacterStream(CLOB.java:278) 
    at sun.reflect.GeneratedMethodAccessor29.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.hibernate.engine.jdbc.SerializableClobProxy.invoke(SerializableClobProxy.java:74) 
    at $Proxy2.getCharacterStream(Unknown Source) 
    at org.hibernate.type.descriptor.java.ClobTypeDescriptor.unwrap(ClobTypeDescriptor.java:114) 

जब मैं saveOrUpdate विधि कॉल: मैं आमतौर पर यह अपवाद नहीं मिलता है।

क्या कोई मुझे कुछ सुझाव दे सकता है?

public static synchronized Session getSession() throws DBConnectionException{ 

    Session session = threadSession.get(); 

    if(session==null||!session.isOpen()||!session.isConnected()){ 
     if(sessionFactory==null||sessionFactory.isClosed())initHibernate(); 
     try{ 
      session = sessionFactory.openSession(); 
     }catch(Exception e){ 
      throw new DBConnectionException("Exception caught when trying to generate Hibernate session."); 
     } 
     threadSession.set(session); 
    } 
    if(session.isDirty()){ 
     session.flush();(36 line of HibernateUtil) 
    } 
    session.clear(); 
    return session; 
} 

मैं इसे लंबे समय तक उपयोग करता हूं।

अब मैं समानांतर रूप से फ़ाइल स्थानांतरित कर रहा हूं और फिर डेटाबेस का उपयोग saveOrUpdate विधि अद्यतन करता हूं। इसके अलावा कई धागे हैं, मैंने इस भाग को मेरे कोड में सिंक्रनाइज़ किया है। मुझे लगता है कि हमारे पास हर समय डेटाबेस से कनेक्शन है, लेकिन यह बंद कनेक्शन का उत्साह देता है। क्या कोई मुझे इस अपवाद के बारे में कुछ सुझाव दे सकता है। समस्या क्या होनी चाहिए?

मैंने सोचा कि यह saveOrUpdate का उपयोग करने के कारण हो सकता है, इसलिए मैं विलय करने के लिए बदल गया, लेकिन यह एक ही समस्या है।

Caused by: org.hibernate.HibernateException: Unable to access lob stream 
    at org.hibernate.type.descriptor.java.ClobTypeDescriptor.unwrap(ClobTypeDescriptor.java:117) 
    at org.hibernate.type.descriptor.java.ClobTypeDescriptor.unwrap(ClobTypeDescriptor.java:46) 
    at org.hibernate.type.descriptor.sql.ClobTypeDescriptor$3$1.doBind(ClobTypeDescriptor.java:83) 
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:91) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:283) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:278) 
    at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:89) 
    at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2184) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2558) 
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2494) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2821) 
    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:113) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133) 
    at mycompany.jobsrc.BasicDaoImpl.merge(BasicDaoImpl.java:52) 
    at mycompany.FileCopyRoutine.call(TransferFiles.java:301) 
    at mycompany.FileCopyRoutine.call(TransferFiles.java:226) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
    Caused by: java.sql.SQLException: Closed Connection 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) 
    at oracle.sql.CLOB.getDBAccess(CLOB.java:1196) 
    at oracle.sql.CLOB.getCharacterStream(CLOB.java:278) 
    at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.hibernate.engine.jdbc.SerializableClobProxy.invoke(SerializableClobProxy.java:74) 
    at $Proxy2.getCharacterStream(Unknown Source) 
    at org.hibernate.type.descriptor.java.ClobTypeDescriptor.unwrap(ClobTypeDescriptor.java:114) 
    ... 27 more 

मेरी मर्ज कोड:

public void merge(T t) throws DBConnectionException{ 
    Session session = HibernateUtil.getSession(); 
    Transaction transaction = session.beginTransaction(); 
    session.merge(t); 
    transaction.commit(); 
} 

उत्तर

1

मेरे शुद्ध अनुमान है कि कुछ क्षेत्र है कि बहुत बड़ी है है है, इसलिए यह एसक्यूएल कार्य करने के लिए मैप किया गया है। मैपिंग स्वयं गलत है, मुझे संदेह है। लेकिन यह तब होता है जब आप इकाई को गैर-शून्य मान से बचाने की कोशिश करते हैं। ऐप में एक-एक करके गैर-शून्य फ़ील्ड के साथ अपनी सभी इकाइयों को सहेजने का प्रयास करें। यह समस्या को अलग करेगा।

0

यह thread में चर्चा के अनुसार जेडीबीसी ड्राइवरों के साथ कुछ करना पड़ सकता है। क्या आप ओरेकल संस्करण और ओजेडीबीसी जार संस्करण को प्रोजेक्ट में उपयोग कर सकते हैं।

0

जैसा कि आप मल्टीथ्रेडिंग का उपयोग करते हैं, मेरा अनुमान है कि आपको लेनदेन के साथ कुछ समस्या हो सकती है। ऑब्जेक्ट में आवश्यक परिवर्तन करने से पहले कुछ लेन-देन की वजह से ऐसा कुछ भी हो सकता है। या आप विभिन्न धागे से सहेजे जा रहे ऑब्जेक्ट तक पहुंचने का प्रयास कर रहे हैं, इसका मतलब है कि ऑब्जेक्ट लेनदेन के दायरे में नहीं है।

3

मुझे विश्वास है कि मेरे पास यह पहले था।

जब ओरेकल से एक बड़ी वस्तु (सीएलओबी, बीएलओबी) लोड की जाती है, तो इसे स्ट्रीम के संदर्भ के रूप में वापस कर दिया जाता है। यदि रिकॉर्ड हाइबरनेट करने के लिए मैप किया गया है और ऑब्जेक्ट लोड होने के बाद सत्र बंद हो गया है (इसलिए ऑब्जेक्ट अलग हो जाता है) जावा फ़ील्ड ब्लॉब मैप किया गया है जिसमें डेटा अभी तक नहीं है; इसलिए जब आप इसे वापस सहेजने की कोशिश कर रहे हैं तो यह इसके साथ काम नहीं कर सकता क्योंकि क्लोब/ब्लोब स्ट्रीम चला गया है।

शुरुआत के लिए, लोडिंग और उसी सत्र में सहेजने की कोशिश करें।

यदि मुझे सही याद है, तो लोडिंग सत्र अभी भी खुला होने पर क्लोब/ब्लॉक जावा फ़ील्ड को "स्पर्श" करना होगा। फिर डेटा डीबी से पढ़ा जाएगा। लेकिन यह दर्दनाक रूप से अक्षम है (यह किसी कारण के लिए LOB है, यानी यह बड़ा है)।

फिर भी एक और विकल्प छोटे डेटा और लोब्स को दो अलग-अलग तालिकाओं में विभाजित करना है, और आवश्यकता होने पर केवल लोड लोड करना है।

आशा है कि आपको दिशा में मदद मिलेगी।

+0

'कारण: java.sql.SQLException: stacktrace में बंद कनेक्शन' अन्यथा इंगित करता है .. – Thihara

+0

बंद कनेक्शन मेरा मानना ​​है कि उस रिकॉर्ड से संबंधित कनेक्शन से संबंधित है जो रिकॉर्ड लोड करने के लिए उपयोग किया गया था। वह एक, हां, पहले ही बंद हो गया है जब ऑब्जेक्ट को विलय करने का प्रयास किया जाता है। –

+0

यदि यह सहेजने या अपडेट करने का प्रयास करते समय ऐसा होता है तो आलसी प्रारंभिक से संबंधित नहीं हो सकता है? मुझे लगता है कि समस्या यह है कि सहेजने या अपडेट को बंद सत्र मिल रहा है ... – Thihara

2

सभी संभावनाओं में मेरा मानना ​​है कि यह Session कुप्रबंधन के कारण है। लेकिन बहुत सारे कोड की समीक्षा किए बिना मैं आपको नहीं बता सकता कि आपके वर्तमान कार्यान्वयन की सटीक समस्या क्या है।

मेरा मानना ​​है कि threadSession एक थ्रेडलोकल है। इसके बजाय ऐसा करने का मैन्युअल हाइबरनेट कॉन्फ़िग फ़ाइल में

sessionFactory.getCurrentSession();

और सेट धागा इस्तेमाल करें।

और अपने HibernateUtil को उन सभी चेक के बिना सरल बनाएं। व्यक्तिगत रूप से मुझे लगता है कि उन चेक सत्र सत्र प्रबंधन और अन्य त्रुटियों को कवर करेंगे ... लेकिन अच्छी तरह से यह सिर्फ मुझे हो सकता है ...

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