suspension sale quitar modo laptop hibernar hibernando hibernacion desactivar como hibernate session

hibernate - sale - Controle la sesión de hibernación(cuándo cerrarla manualmente)



mi pc no sale de hibernacion (3)

Soy nuevo en Hibernate, después de leer la api hibernate y el tutorial, parece que la sesión debería clausurarse cuando no se usa.

Debe estar cerrado cuando haya terminado (pero esto se puede hacer automáticamente, como veremos).

No tengo dudas cuando lo uso en una aplicación independiente. Sin embargo, no estoy seguro de cuándo usar en la aplicación web.

Bueno, como se explica en la sección 11.1.1. Unidad de trabajo de la documentación, el patrón más común en una aplicación cliente / servidor multiusuario es sesión por solicitud .

Por ejemplo, tengo un servlet: TestServlet para recibir los parámetros del cliente, luego llamo a un administrador para consultar algo de acuerdo con los parámetros: así (...) ¿Debo cerrar la sesión en el método de consulta?

Todo depende de cómo obtienes la sesión.

  • si usa sessionFactory.getCurrentSession() , obtendrá una "sesión actual" que está vinculada al ciclo de vida de la transacción y se borrará automáticamente y se cerrará cuando la transacción finalice (confirmación o reversión).
  • si decide usar sessionFactory.openSession() , tendrá que administrar la sesión usted mismo y vaciarla y cerrarla "manualmente".

Para implementar un patrón de sesión por solicitud , prefiera el primer enfoque (mucho más sencillo y menos detallado). Use el segundo enfoque para implementar largas conversaciones .

La página wiki Sesiones y transacciones es un buen complemento a la documentación sobre este tema.

Por cierto, ¿se requiere tx.commit () cada vez?

Es posible que desee leer el acceso a datos no transaccionales y el modo autocompromiso para aclarar algunas cosas, pero, para decirlo simplemente, su código Hibernate debe ejecutarse dentro de una transacción y sugeriría usar límites de transacción explícitos (es decir, explícito beginTransaction y commit ).

Además, ¿cuál es el problema del hilo sobre el uso de la sesión en servlet, ya que vi que la sesión no es segura para subprocesos en la API?

Simplemente no lo convierta en una variable de instancia del Servlet y no tendrá ningún problema.

Referencias

Soy nuevo en hibernate, después de leer la api de hibernación y el tutorial, parece que la sesión debería cerrarse cuando no se utiliza.

Me gusta esto:

Session sess=getSession(); Transcration tx=sess.beginTranscration(); //do something using teh session sess.save(obj); tx.commit(); sess.close;

No tengo dudas al usarlo en una aplicación independiente. Sin embargo, no estoy seguro de cuándo usar en la aplicación web.

Por ejemplo, tengo un servlet: TestServlet para recibir los parámetros del cliente, luego llamo a un administrador para consultar algo de acuerdo con los parámetros, así:

class TestServlet{ doGet(HttpServletRequset,httpServletResponse){ String para1=request.getParam...(); String para2=..... new Manager().query(para1,para2); } } class Manager{ public String query(String pa1,String pa2){ Session=....// get the session //do query using para1 and 1 session.close() //Here, I wonder if I should close it. } }

¿Debo cerrar la sesión en el método de consulta?

Como alguien me dijo que la sesión en Hibernate es como la conexión en jdbc. Entonces, ¿abrirlo y cerrarlo con tanta frecuencia es la forma correcta?

Por cierto, ¿se requiere tx.commit () cada vez?

Además, ¿cuál es el problema del hilo sobre el uso de la sesión en servlet, ya que vi que la sesión no es segura para subprocesos en la API?


Podemos hacer uso de ThreadLocal .

public class MyUtil { private static SessionFactory sessionFactory; private static ServiceRegistry serviceRegistry; private static final ThreadLocal<Session> threadLocal; static { try { Configuration configuration = new Configuration(); configuration.configure(); serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); threadLocal = new ThreadLocal<Session>(); } catch(Throwable t){ t.printStackTrace(); throw new ExceptionInInitializerError(t); } } public static Session getSession() { Session session = threadLocal.get(); if(session == null){ session = sessionFactory.openSession(); threadLocal.set(session); } return session; } public static void closeSession() { Session session = threadLocal.get(); if(session != null){ session.close(); threadLocal.set(null); } } public static void closeSessionFactory() { sessionFactory.close(); StandardServiceRegistryBuilder.destroy(serviceRegistry); } }

Aquí, SessionFactory se inicializa solo una vez con el bloque estático. Por lo tanto, cada vez que la clase main realiza una llamada a getSession() , primero se comprueba la presencia del objeto Session en el objeto threadLocal . Por lo tanto, este programa proporciona seguridad de subprocesos. Después de cada operación, closeSession() cerrará la sesión y establecerá el objeto threadLocal en nulo. Finalmente llama a closeSessionFactory() .


Si está recibiendo sesión a través de sessionFactory.openSession() entonces debe cerrarla externamente . La sesión abierta por un período involuntario puede causar filtraciones de datos. Además, puede invitar a la amenaza de seguridad de la aplicación web.