ventanas ventana usuario una jframes interfaz interfaces hacer diseƱar conectar como java database oracle hibernate

java - ventana - org.hibernate.HibernateException: no se puede acceder a la secuencia lob



interfaz de usuario en java (6)

A medida que utiliza el subprocesamiento múltiple, supongo que podría tener algún problema con las transacciones. Podría deberse a que algunas transacciones estén comprometidas de alguna manera antes de que haya hecho los cambios necesarios en el objeto. O está intentando acceder al objeto que se está guardando desde un subproceso diferente, eso significa que el objeto no está en el ámbito de la transacción.

Estoy usando hibernate 3.6.7 para hacer la asignación de mis clases a las tablas de Oracle. Normalmente no consigo esta excepción:

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)

Cuando llamo al método saveOrUpdate.

¿Podría alguien por favor darme alguna sugerencia?

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

Lo uso todo por mucho tiempo.

ahora estoy transfiriendo el archivo de forma paralela y luego actualizo el método saveOrUpdate de la base de datos. Aunque hay muchos subprocesos, sincronicé esta parte en mi código. Creo que tenemos conexión con la base de datos todo el tiempo, pero nos da la emoción de la conexión cerrada. ¿Podría alguien por favor darme alguna sugerencia sobre esta excepción? ¿Cuál debería ser el problema?

Pensé que podría debido a usar saveOrUpdate, así que cambié para fusionar, pero parece que tiene el mismo 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

mi código de combinación:

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


Con toda probabilidad, creo que esto se debe a la mala gestión de la Session . Pero sin revisar un montón de código, no puedo decirle cuál es el problema exacto de su implementación actual.

Creo que threadSession es un ThreadLocal. En lugar de hacer esto manualmente, por favor use

sessionFactory.getCurrentSession();

y establecer hilo en el archivo de configuración de hibernación.

Y hacer que tu HibernateUtil sea simple sin todos esos controles. Personalmente creo que esos controles cubrirán la mala gestión de la sesión y otros errores ... Pero bueno, eso podría ser solo yo ...


Creo que tuve este antes.

Cuando un objeto grande (CLOB, BLOB) se carga desde Oracle, se devuelve como una referencia a una secuencia. Si el registro se asigna a hibernación y la sesión se cierra después de que el objeto se haya cargado (de modo que el objeto se desprenda), el blob del campo java se asigna a todavía no contiene los datos; por lo tanto, cuando intenta guardarla de nuevo, no puede funcionar con ella porque el flujo de clob / blob se ha ido.

Para empezar, intente seguir cargando y guardando dentro de la misma sesión.

Si recuerdo bien, otra solución sería "tocar" el campo java de clob / bloc mientras la sesión de carga aún está abierta. Luego los datos serán leídos desde el DB. Pero es dolorosamente ineficiente (es LOB por una razón, es decir, es grande ).

Otra opción más es dividir los datos pequeños y las tablas en dos tablas diferentes, y cargar las hojas solo cuando sea necesario.

Espero que te ayude con la dirección.


Esto podría tener que hacer algo con los controladores JDBC como se explica en este thread . ¿Puede publicar la versión de Oracle y la versión jar de ojdbc que usa en el proyecto?


Intente agregar @Transactional sobre el método de servicio en el que intenta acceder al objeto de campo lob. Funcionó para mí.


Mi suposición es que tienes un campo que es muy grande, por lo que se asigna a sql lob. El mapeo en sí es incorrecto, sospecho. Pero solo sucede cuando intenta guardar la entidad con un valor no nulo. Intenta guardar todas tus entidades con campos no nulos en la aplicación uno por uno. Esto aislará el problema.