5

Kết nối Hibernate tới MySQL mà db của tôi không đóng. Sau khi nhấp 10 lần trong 10 giây, tôi nhận được số liệu thống kê kết nối này từ MySQL Workbench (trong máy phát triển của tôi. Tôi là người dùng duy nhất). MySQL Workbench Server Status

Tôi có những người ở vị tríKết nối Hibernate không được đóng ngay cả với phiên bản C3P0 + rõ ràng.close()

  • C3P0 và chạy (kiểm tra từ log4j, không có vấn đề liên quan đến C3P0 và dường như đang chạy)
  • Một ServletReqestListener mà kiểm tra nếu có một phiên mở và đóng nó trong phương thức requestDestroyed().
  • Đối tượng phiên Hibernate đang được giữ trong ThreadLocal, do đó, mọi yêu cầu chỉ có một kết nối, mở ra tại truy vấn đầu tiên và đóng trong ServletRequestListener.
  • Mỗi lần tôi mở một phiên và đóng một phiên, tôi xuất "Session Opened" và "Session Closed" thành System.out như trong đoạn mã ví dụ. Ở mọi yêu cầu, mỗi lần làm mới trang, Tôi nhận được "Phiên mở" và sau "Phiên đóng", repectively. Vì vậy, logic nhỏ của tôi hoạt động. Nhưng kết nối không bị đóng.

hibernate.cfg.xml My

<property name="hibernate.bytecode.use_reflection_optimizer">false</property> 
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
<property name="hibernate.connection.password">officenic</property> 
<property name="hibernate.connection.url">jdbc:mysql://localhost/officenic</property> 
<property name="hibernate.connection.username">officenic</property> 
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> 

<!-- configuration pool via c3p0 --> 
<property name="hibernate.c3p0.acquire_increment">1</property> 
<property name="hibernate.c3p0.idle_test_period">100</property> <!-- seconds --> 
<property name="hibernate.c3p0.max_size">5</property> 
<property name="hibernate.c3p0.max_statements">0</property> 
<property name="hibernate.c3p0.min_size">1</property> 
<property name="hibernate.c3p0.timeout">100</property> <!-- seconds --> 

Mã-block tôi gọi trong mọi nơi tôi muốn đóng phiên.

if (session == null) 
    return; 

if (session.isOpen()) { 

     if (session.isDirty()) 
     session.flush(); 

    session.close(); 
    System.out.println("Session closed"); 
} 

Tôi có bỏ lỡ điều gì đó không?

Trả lời

1
private static final ThreadLocal<Session> session = new ThreadLocal<Session>(); 

public static void closeSession() throws HibernateException { 
    Session s = session.get(); 
    if (s != null) { 
     s.close(); 
     session.remove(); 
    } 
} 

thực sự tôi đang làm như thế này và nó hoạt động

+0

Vâng, tôi cũng giống như vậy, giải pháp tốt. – Seregwethrin

Các vấn đề liên quan