org.mise en veille prolongée.HibernateException: Impossible d'accéder lob flux
Je suis de l'utilisation d'hibernate 3.6.7 de faire la cartographie de mes cours de tables oracle.
Je n'ai pas l'habitude de faire cette 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)
Quand je l'appelle saveOrUpdate méthode.
Quelqu'un pourrait-il me donner quelques suggestions?
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;
}
Je l'utilise depuis longtemps.
maintenant, je suis à transférer le fichier en parallèle et ensuite mettre à jour la base de données utiliser saveOrUpdate méthode.Bien qu'il existe de nombreux fils, je snychronized cette partie de mon code.
Je pense que nous avons de la connexion à la base de données de tous les temps, mais il donne excpetion de connexion fermée.
Quelqu'un pourrait-il me donner quelques suggestions au sujet de cette exception.Ce que le problème devrait être?
Je pensais qu'il avait raison de l'utilisation de saveOrUpdate, donc j'ai changé pour une fusion, mais il sames avoir le même problème.
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
mon code de fusion:
public void merge(T t) throws DBConnectionException{
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
session.merge(t);
transaction.commit();
}
Vous devez vous connecter pour publier un commentaire.
Essayez d'ajouter @Transactional plus de la méthode de service où vous essayez d'accéder à lob champ objet.
Il a travaillé pour moi.
Je crois que j'ai eu ce avant.
Quand un objet de grande taille (CLOB, BLOB) est chargé de Oracle, il est retourné comme une référence à une rivière. Si l'enregistrement est mappé à hibernate et la fermeture de la session après que l'objet est chargé (de sorte que l'objet se détache) la java champ blob est mappé à ne contenant pas de données encore; ainsi, lorsque vous êtes en essayant de sauver ce qu'il ne peut pas travailler avec elle parce que le clob/blob flux est allé.
Pour commencer, essayez de garder le chargement et l'enregistrement au sein de la même session.
Si je me souviens bien, une autre solution serait de "toucher" les clob/bloc java champ, tandis que le chargement de la session est toujours ouverte. Ensuite, les données seront lues à partir de la DB. Mais il est terriblement inefficace (c'est LOB pour une raison, c'est-à - grand).
Encore une autre option est de séparer les données de petite taille et de lobs dans deux tables différentes, et de la charge de lobs uniquement lorsque cela est nécessaire.
Espère que vous aide à l'orientation.
Caused by: java.sql.SQLException: Closed Connection
dans la stacktrace implique le contraire...Selon toute probabilité, je crois que cela est dû à
Session
la mauvaise gestion. Mais sans passer en revue beaucoup de code je ne peux pas vous dire quel est le problème exact de votre implémentation actuelle est.
Je crois
threadSession
est un ThreadLocal. Au lieu de le faire manuellement, veuillez utilisersessionFactory.getCurrentSession();
et fixer le fil dans le fichier de configuration hibernate.
Et faire de votre HibernateUtil est simple, sans tous ces contrôles. Personnellement, je pense que ces contrôles couvrent la Session de mauvaise gestion et d'autres erreurs... Mais bon que peut-être juste moi...
Mon pure conjecture est que vous avez un domaine qui est très grande, de sorte qu'il est mappé à sql lob. La cartographie elle-même est incorrect, je soupçonne. Mais il ne se produit lorsque vous essayez d'enregistrer une entité avec une valeur non null. Essayez d'enregistrer toutes vos entités non null dans les champs d'application, un par un. Cela permettra d'isoler le problème.
Cette puissance a faire quelque chose avec les pilotes JDBC comme indiqué dans le présent fil. Vous pouvez poster la version Oracle et ojdbc jar version que vous utilisez dans le projet.
Que vous utilisez le multithreading, je suppose que vous pourriez avoir un problème avec les transactions. Il pourrait être à cause de certaines transactions est en quelque sorte engagé avant que vous l'aviez fait les changements nécessaires à l'objet. Ou vous essayez d'accéder à l'objet d'être sauvé de l'autre thread, cela signifie que l'objet n'est pas dans le champ d'application de la transaction.
Si l'aide de printemps, en ajoutant les propriétés de l'application de la faire fonctionner pour nous: