Control the hibernate session(when to close it manually)

hguser picture hguser · Oct 28, 2010 · Viewed 86.9k times · Source

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.

Answer

Pascal Thivent picture Pascal Thivent · Oct 29, 2010

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