Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Control the hibernate session(when to close it manually)

I am new in hibernate,after read the hibernate api and tutorial,it seems that the session should closed when not used.

Like this:

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

I have no question when using it in a standlone application. However I am not sure when using in the web app.

For example, I have a servlet: TestServlet to receive the parameters from the client, then I call a Manager to query something according to the parameters, just like this:

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

Should I close the session in the query method?

Since someone told me that session in hibernate is just like the connection in jdbc. So opening and closing it so frequently is the correct way?

BTW, does the tx.commit() is required each time?

Also what's the thread problem about using session in servlet, since I saw the session is not thread safe in api.

like image 716
hguser Avatar asked Oct 28 '10 07:10

hguser


People also ask

When should I close Hibernate session?

It all depends on how you obtain the session. if you use sessionFactory. getCurrentSession() , you'll obtain a "current session" which is bound to the lifecycle of the transaction and will be automatically flushed and closed when the transaction ends (commit or rollback). if you decide to use sessionFactory.

What happens if Hibernate session is not closed?

When you don't close your Hibernate sessions and therefore do not release JDBC connections, you have what is typically called Connection leak. So, after a number of requests (depending on the size of your connection pool) the server will not be able to acquire a connection to respond your request.

Does Hibernate automatically close connection?

Hibernate needs to check the underlying JDBC Connection auto-commit status, and disable it if the Connection is set to auto-commit.


1 Answers

I am new in hibernate,after read the hibernate api and tutorial,it seems that the session should cloesd when not used.

It should be closed when you're done with (but this can be done automatically for you as we'll see).

I have no question when using it in a standalone application. However I am not sure when using in the web app.

Well, as explained in the section 11.1.1. Unit of work of the documentation, the most common pattern in a multi-user client/server application is session-per-request.

For example, I have a servlet:TestServlet to recieve the parameters from the client,then I call a Manager to query something according to the parameters: just like this (...) Should I close the session in the query method?

It all depends on how you obtain the session.

  • if you use sessionFactory.getCurrentSession(), you'll obtain a "current session" which is bound to the lifecycle of the transaction and will be automatically flushed and closed when the transaction ends (commit or rollback).
  • if you decide to use sessionFactory.openSession(), you'll have to manage the session yourself and to flush and close it "manually".

To implement a session-per-request pattern, prefer the first approach (much easier and less verbose). Use the second approach to implement long conversations.

The wiki page Sessions and transactions is a good complement to the documentation on this topic.

BTW, does the tx.commit() is required each time?

You might want to read Non-transactional data access and the auto-commit mode to clarify a few things but, to put it simply, your Hibernate code has to be executed within a transaction and I'd suggest to use explicit transaction boundaries (i.e. explicit beginTransaction and commit).

Also what's the thread problem about using session in servlet, since I saw the session is not thread safe in api.

Just don't make it an instance variable of the Servlet and you won't have any problem.

References

  • Hibernate Core 3.3 Reference Guide
    • Chapter 11. Transactions and Concurrency
  • Hibernate wiki
    • Sessions and transactions
    • Non-transactional data access and the auto-commit mode
like image 108
Pascal Thivent Avatar answered Sep 16 '22 15:09

Pascal Thivent