Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

org.hibernate.HibernateException: Unable to access lob stream

I am using hibernate 3.6.7 to do mapping from my classes to oracle tables. I don't usually get this exception:

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) 

When I call saveOrUpdate method.

Could anyone please give me some suggestion?

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; } 

I use it all for a long time.

now I am transferring file parallelly and then update database use saveOrUpdate method.Althrough there are many threads, I snychronized this part in my code. I think we have connection to the database all the time, but it gives excpetion of closed connection. Could anyone please give me some suggestion about this exception.What the problem should be?

I thought it could because of using saveOrUpdate, so I changed to merge, but it sames to have the same problem.

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 

my merge code:

public void merge(T t) throws DBConnectionException{     Session session = HibernateUtil.getSession();     Transaction transaction = session.beginTransaction();     session.merge(t);     transaction.commit(); } 
like image 544
lucky_start_izumi Avatar asked Jan 26 '12 19:01

lucky_start_izumi


1 Answers

Try adding @Transactional over the service method where you are trying to access lob field object. It worked for me.

like image 84
RahuL Sharma Avatar answered Sep 20 '22 23:09

RahuL Sharma