Sto utilizzando Hibernate 3.6.7 per eseguire il mapping dalle mie classi alle tabelle di Oracle. Io di solito non ottengo questa eccezione:org.hibernate.HibernateException: impossibile accedere al flusso lob
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)
Quando chiamo il metodo saveOrUpdate.
Qualcuno potrebbe darmi qualche suggerimento?
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;
}
Uso tutto a lungo.
ora sto trasferendo il file parallelamente e quindi aggiorno il database utilizzando il metodo saveOrUpdate.Althrough ci sono molti thread, ho sincronizzato questa parte nel mio codice. Penso che abbiamo sempre una connessione al database, ma dà l'opportunità di una connessione chiusa. Qualcuno potrebbe darmi qualche suggerimento su questa eccezione. Qual è il problema?
Ho pensato che avrebbe potuto utilizzare saveOrUpdate, quindi ho deciso di unirmi, ma sames ha lo stesso problema.
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
il mio codice di unione:
public void merge(T t) throws DBConnectionException{
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
session.merge(t);
transaction.commit();
}
'Causato da: java.sql.SQLException: Closed Connection' nello stacktrace implica altrimenti .. – Thihara
La connessione chiusa, credo, riguarda la connessione che apparteneva alla sessione utilizzata per caricare il record. Quello, sì, già chiuso quando l'oggetto viene tentato di unirsi. –
Se si verifica quando si tenta di salvarlo o aggiornarlo, non può essere correlato all'inizializzazione pigro, giusto? Il problema è che il salvataggio o l'aggiornamento sta ricevendo una sessione chiusa ... – Thihara