Problema con Hibernate y pool de conexiones

hola tengo una aplicacion con jsf y hibernate y Oracle tengo configurado de esta manera el archivo cfg donde se usa c3po como pool de conexiones:

    <property name="connection.provider_class">
      org.hibernate.connection.C3P0ConnectionProvider
    </property>
    <property name="c3p0.min_size">5</property>
    <property name="c3p0.max_size">20</property>
    <property name="c3p0.timeout">300</property>
    <property name="c3p0.max_statements">50</property>
    <property name="c3p0.idle_test_period">3000</property>

cuando se usa para las transacciones en las demas pantallas funciona de maravilla, pero en una pantalla me han pedido hacer que digitando un numero unico busque el registro y lo modifique y luego de eso muestro la lista en una grid todo va de maravilla hasta que se modifica el registro y hace un update en hibernate cuando vuelvo a llamar a la lista de datos da este error.

Caused by: java.sql.SQLException: You can't operate on a closed Statement!!!

y luego da esta

java.sql.SQLRecoverableException: Juego de resultados cerrado: next

el error se da cuando se hace el select a la tabla luego de realizar el update en sql me esta diciendo que he cerrado el resulset pero con hibernate estoy usando criteria hago un par de equal para obtener la lista deseada y luego devuelvo la lista para que se llene el grid pero no siempre tira ese error a veces cuando actualizo y espero un momento funciona pero cuando se vuelve a buscar al instante da esos errores.

lo probe sin c3p0 con el pool rudimentario que trae hibernate y no da esos errores es mas funciona..... y cabe destacar que a veces funciona y a veces no usando c3p0, la base de datos esta en un servidor remoto.

el orden de las transacciones es esta
primero busco el registro por su numero unico
luego lo muestro en pantalla
el usuario lo modifica y ejecuta update de hibernate
luego trato de mostrar los datos y los busca
pero vuelvo a buscar por el numero unico y es ahi donde dice esos errores

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

sesiones

En hibernate manejas sesiones. La sesión maneja por debajo una conexión a la base de datos, tomada del datasource (pool o lo que sea). Esos errores suenan como que la sesión sigue abierta pero la conexión se cerró. O que ya cerraste la sesión y quieres seguir usando objetos (típico que obtuviste un objeto con una sesión y le quieres dar update usando otra sesión distinta).

Imagen de radamanthys360

revisare las sesiones

estaba revisando y cuando actualizo el objeto e inmediatamente lo traigo con un criteria tira esta excepcion
java.sql.SQLException: Juego de resultados agotado

y es cuando hace el query de traer toda la lista para llenar el grid, la sesion de hibernate solamente la cierro cuando el usuario cierra su sesion no se si estara mal hacerlo en ese punto, y cuando no uso c3p0 funciona bien no tira ninguna excepcion noce si sera que se cierra la conexion ya que tiene un tiempo de espera en la configuracion

Imagen de Nopalin

Entiendo que es escribir

Entiendo que es escribir demasiado código, tedioso, cansado y seguramente algunos dirán que una mala práctica, pero yo creo que nunca es bueno que el cliente maneje las entidades directamente, presisamente por que luego se generan error de este tipo si no tienes cuidado, por eso lo mejor es siempre manejar dto's entre lo que visualizas y las entidades. Osea que cada entidad tiene su dto representativo, pero en vez de tener relaciones, tiene el id y las propiedades que ocupes de la relacion, lo malo que estos dto's los tienes que definir en xml's.

De esta forma te asegura que el cliente no lleve ninguna entidad que haga referencia a sessiones de hibernate, o a datos sin inicializar.

sobres

Imagen de radamanthys360

las entidades de hibernate

las entidades de hibernate son muy aparte de mis bean porque no toda la informacion de la entidad es necesario mostrarla yo en mi bean tengo las propiedades que deseo que muestre la vista y luego cuando las muestro guardo la primaria del registro para luego hacer un sesion.get y traerme el objeto y modificar las propiedades que trae la vista a la entidad fijate que creo que el problema esta en la configuracion del pool porque acabo de probarlo con el que trae hibernate y no da ningun problema.

Imagen de radamanthys360

Solucion

hola despues de una semana de pruebas y ir descartando el problema encontre mi solucion pues bien no es el pool de conexiones ni la sesion de hibernate tambien por un momento pense que era el bean de spring pero tampoco, viendo el comportamiento de la aplicacion me fije en algo curioso que en realidad funcionaba pero cuando habia concurrencia era donde daba errores investigando las excepciones que me daba eran de sql una porque intentabada hacer una consulta con una conexion cerrada luego que los resultados estaban agotados y tambien que no podia recorrer el resulset si ya se habia cerrado, el metodo esta hecho con criteria unos simples eq y luego traerme la lista encontrada.

Luego de analizar todo esto pense que probablemente habia un multihilo a la hora de llamar el metodo y efectivamente eso pasaba varias peticiones intentaban entrar al metodo por eso cuando hacia un debug con netbeans funcionaba porque iba llamada tras llamada no las hace de un solo, la solucion fue sincronizar los metodos lo he probado y efectivamente ya no da esas excepciones y hace su trabajo bien seguire investigando si es una solucion optima espero me haya dado a entender y si hay sugerencias con gusto las escuchare

No seguí toda la historia ,

No seguí toda la historia , pero me llama la atención tu comentario:

....eso pasaba varias peticiones intentaban entrar al metodo...

Pero ¿por que varios hilos intentaban usar el mismo objeto? Sería mejor que cada hilo usara su propio objeto y con eso eliminar el problema de la concurrencia.

Por que no investigas mejor este camino en vez de agregarle un cuello de botella.

De nuevo no tengo todo el contexto, quizá lo que acabo de escribir no aplica.

Saludos.

Imagen de radamanthys360

....eso pasaba varias peticiones intentaban entrar al metodo...

muy cierto lo que respondes se puede generar un cuello de botella ,el problema se daba tambien cuando el mismo usuario hacia la accion de modificar el registro cuando esa accion pasaba llamaba al metodo de llamar todos los registros para mostrarlos en la grid, al hacerlo repetidas veces y una tras de otra en un lapso corto de tiempo se generaban las excepciones mencionas anteriormente por un momento pense que era el pool porque con C3p0 ocurria ese error pero si lo corria con el pool que trae hibernate no sucedia.

el bean que llama a la clase donde esta el metodo es request "Los objetos con este ámbito son accesibles desde el inicio de la solicitud hasta el final" noce si estara erroneo el concepto