Có nên close session trong Hibernate khi hoàn thành 1 transaction không

Hello mọi người,

Chuyện là em đã học trước Hibernate và em được biết rằng phải close Session khi hoàn thành 1 Transaction nhưng hôm nay thầy em lại dạy: sử dụng 1 Session trong toàn bộ app, em có thử search lại thì trên StackOverFlow cũng nói là nên close Session khi hoàn thành(vote khá cao). Bây giờ em đang cảm thấy bối rối. Mọi người có thể gỡ rối giúp em được không ạ?

Em cảm ơn.
Have a good day.

UPDATE:

my teacher’s code

public class HibernateUtil {

  private static SessionFactory sessionFactory;
  private static Session session;

  public static SessionFactory buildSessionFactory() {
    // build sessionFactory
  }

  public static Session getSession() {

    if (session == null || !session.isOpen) {
       session = buildSessionFactory().openSession();
    }

    return session;
  }

}
1 Like

Ừ, cậu nên close session khi hoàn thành một công việc. Nếu không, cậu sẽ bị memory leak. Thường thì việc đóng session này sẽ được taken care bởi ORM framework, và đôi khi cậu phải tự đóng nó bằng tay nếu như cậu muốn làm gì đó đặc biệt.

Tớ không rõ ý thầy của cậu khi nói:

Cơ mà nếu như đúng như nghĩa đen, thì đó không phải một quyết định kỹ thuật tốt rồi :sweat_smile:

5 Likes

Thật ra thì em cũng không biết ý của thầy là gì. Nhưng mà em thấy thầy không nhắc gì đến việc phải close sau khi hoàn thành.

1 Like

Vì 2 người đang nói đến 2 cách khác nhau:
image
Thầy em có thể đang nói đến SessionFactory.
Cái này chỉ tạo 1 cái(singleton) cho toàn bộ application

5 Likes

Không phải anh ơi. Nếu nói SessionFactory thì em đã không nhờ mọi người gỡ rối ạ.

1 Like

@library
Anh ơi, thầy em nói là bởi vì quá trình open session lâu nên thầy làm vậy. Theo kinh nghiệm của anh thì anh nghĩ thế nào ạ?

Nếu mà close Session sau khi hoàn thành 1 công việc thì first level cache sẽ bị clear. Vậy tác dụng của nó sẽ không còn nữa phải không anh?

Ấy chết, bằng cách nào đó tớ miss câu hỏi này của cậu.

Thầy cậu có đang nhầm lẫn 2 khái niệm DB connection với DB session không? :sweat_smile:
DB connection thì expensive để tạo ra thật, và đó là lý do cậu cần connection pool.
Db session thì không tốn kém tới mức phải hold connection suốt như vậy. Như tớ có đề cập ở comment trước, nếu cậu không đóng session, DB connection không được trả về pool => memory leak + connection pool coi như vô dụng :sweat_smile:
Nếu chỉ có 1 session duy nhất, thì làm thế nào app của cậu phục vụ được 2 request cùng lúc? Khi đó, 1 request đã chiếm connection duy nhất này, và request thứ 2 hẳn nhiên phải chờ.

Ừ cậu, first level cache associate với session level, và khi cậu đóng session (tức là lúc này cậu đã hoàn thành xong công việc liên quan tới database cho 1 request), hẳn nhiên khi đó cậu không cần cache này nữa rồi :smile:

Hope it helps!

6 Likes

Quá tuyệt vời.

Em cảm ơn anh ạ.

Em thử upload code mà thầy em viết để mọi người cùng coi xem không hợp lý ở đoạn nào nhé.

Theo ý mình hiểu thì thầy của cậu muốn sử dụng open session thôi chứ không close vì như vậy sẽ run chương trình nhanh hơn – và có một số lập trình viên cũng sử dụng phương thức này nhưng nó có một số khuyết điểm như bác lib nói và đa số các lập trình viên đều không chọn cách này. Thầy của bạn hình như ưu tiên cho việc tối ưu thời gian hơn, bạn hỏi lại ý thầy xem sao – không thì hiến kế cho thầy tip để chạy chương trình nhanh hơn. Tip bạn có thể hỏi bác @library , mình không thạo cái này.
Bạn có thể tham khảo mấy bạn này nữa: phương án của Trym, Gregd và Raman (không biết bạn biết mấy cách này chưa mình cứ gửi link nhé).

3 Likes

Code này chỉ ok khì Application chỉ có dùng single thread thôi.
Còn nhiều thread thì nên new/close Sesion, do Session không phải thread safe

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?