2010-05-11 40 views
9

Chúng tôi đang chạy ứng dụng spring/hibernate/c3p0 đang được tải. Khi tôi giảm tối đa c3p0 maxPoolSize xuống một số, thấp hơn nhiều so với số lượng người dùng đồng thời, ứng dụng của chúng tôi chỉ bị treo. Không có thông báo lỗi trong nhật ký, nhưng nó cũng không tiến hành.Mất kết nối Hibernate/c3p0

Tôi hy vọng ứng dụng sẽ chậm lại, nhưng không dừng lại hoàn toàn.

Dưới đây là cấu hình C3P0 của chúng tôi:

<bean id="coreDataSource" 
      class="com.mchange.v2.c3p0.ComboPooledDataSource" 
      destroy-method="close" 
      p:driverClass="${core.jdbc.driver}" 
      p:jdbcUrl="${core.jdbc.url}" 
      p:user="${core.jdbc.user}" 
      p:acquireIncrement="5"   
      p:acquireRetryAttempts="10" 
      p:acquireRetryDelay="5000" 
      p:initialPoolSize="52" 
      p:maxIdleTime="3600" 
      p:maxIdleTimeExcessConnections="300" 
      p:minPoolSize="52" 
      p:maxPoolSize="125" 
      p:numHelperThreads="6" 
      p:unreturnedConnectionTimeout="0"> 
      <property name="password"> 
       <bean class="com.docfinity.util.encryption.SpringStringDecrypter" 
        p:decryptFlag="${core.jdbc.decryptPasswordFlag}" 
        p:encryptedString="${core.jdbc.password}" /> 
      </property> 
    </bean> 

này sẽ bị khóa nếu tôi ném một 160 người đã ở đó.

Tôi đã cố gắng thiết lập unreturnedConnectionTimeout thành điều gì đó tích cực (120 giây) và xem các dấu vết ngăn xếp hiển thị trong ứng dụng của chúng tôi. Các dấu vết ngăn xếp là từ các phương pháp khác nhau khác nhau trong ứng dụng của chúng tôi. Nó không giống như có một phương pháp chúng ta có thể chỉ ra và nói rằng đó là các kết nối bị rò rỉ.

Bất kỳ trợ giúp nào gỡ lỗi vấn đề này sẽ được đánh giá cao nhất.

Trả lời

10

Tôi nghi ngờ rằng Hibernate hoặc Spring đang bị rò rỉ kết nối, tôi nghi ngờ một vấn đề cấu hình ở đâu đó đó là làm cho ứng dụng của bạn chạy các kết nối của chúng tôi. Dưới đây là những gì tôi sẽ làm:

  • Giảm số lượng người dùng đồng thời và kích thước nhóm, tôi không chắc chắn vấn đề có liên quan đến tải.

  • Set unreturnedConnectionTimeout đến một giá trị lớn hơn 0 kết hợp với debugUnreturnedConnectionStackTraces để true để tìm ra nơi Connections đang được check-out và không trở lại hồ bơi và đăng một số stacktrace tạo ra.

  • Xác định một luồng nghiệp vụ (một trường hợp sử dụng) mà sự cố xảy ra và chạy thử nghiệm của bạn trên trường hợp này chỉ cho đến khi bạn tìm ra sự cố.

Ngoài ra, tôi muốn cập nhật câu hỏi bằng một hoặc hai stacktraces, có thể ai đó sẽ phát hiện ra điều gì đó hiển nhiên.

2

Hibernate và Spring không phải là kết nối bị rò rỉ, một nơi nào đó trong ứng dụng của bạn bị rò rỉ. Tôi không chắc chắn về C3P0 nhưng BoneCP (http://jolbox.com) có hỗ trợ để phát hiện các kết nối không rõ ràng (và cung cấp cho bạn ngăn xếp dấu vết của nơi bạn đã mở chúng) + sẽ đóng mọi kết nối bị rò rỉ cho bạn khi một sợi bị chết mà không dọn dẹp thích hợp.

0

Query cơ sở dữ liệu của bạn:

select * from pg_stat_activity; 

Và kiểm tra xem truy vấn nào được lâu dài với idle in transaction trạng thái. Cố gắng tìm chúng trong mã của bạn và nghiên cứu tại sao giao dịch không được hoàn thành.


Vài điều cần kiểm tra trong một mã/cấu hình:

  • Cam kết giao dịch một cách rõ ràng hoặc sử dụng @Transactional.Xin lưu ý rằng @Transactional chỉ hoạt động cho các phương thức công khai.

  • Nếu bạn đang sử dụng Hibernate 5.1.0.Final, sau đó persistence.xml nên chứa:

<property name="hibernate.connection.provider_class" value="org.hibernate.c3p0.internal.C3P0ConnectionProvider" />

Thay vì:

<property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" />

  • Nếu bạn đang sử dụng

<property name="hibernate.enable_lazy_load_no_trans" value="true" />

nó có thể gây rò rỉ kết nối khi lười biếng tải. các cuộc thảo luận liên quan:


Kiểm tra liên quan đến bài viết:

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