2010-05-05 48 views
11

Bối cảnh: Tôi đang chuyển ứng dụng của mình từ npgsql v1 sang npgsql v2.0.9. Sau một vài phút chạy ứng dụng của tôi, tôi nhận được một System.Exception: Timeout trong khi nhận được kết nối từ nhóm.npgsql Rò rỉ Postgres DB Kết nối: Cách để theo dõi kết nối?

Web tuyên bố rằng điều này là do các kết nối bị rò rỉ (mở một kết nối db, nhưng không đóng đúng cách).

Vì vậy,

Tôi đang cố gắng chẩn đoán rò rỉ kết nối postgres trong npgsql.

Từ các tài liệu web khác nhau xung quanh; một cách để chẩn đoán các kết nối bị rò rỉ là thiết lập đăng nhập trên npgsql và tìm thông báo cảnh báo kết nối bị rò rỉ trong nhật ký. Vấn đề là, tôi không thấy thông báo này trong nhật ký ở bất cứ đâu.

Tôi cũng tìm thấy tiện ích theo dõi kết nối npgsql nhưng không ổn định và bị treo.

Vì vậy, tôi đã kiểm tra mã theo cách thủ công. Đối với mọi nơi tạo ra một kết nối npgsql, có một khối cuối cùng xử lý nó. Đối với mọi nơi mở trình quản lý dữ liệu, CommandBehavior.CloseConnection được sử dụng (và trình quản lý dữ liệu được xử lý).

Bất kỳ địa điểm nào khác để kiểm tra hoặc ai đó có thể giới thiệu cách tìm kiếm các kết nối bể bị rò rỉ?

+0

Tôi gặp vấn đề tương tự. Nhưng tôi thấy các kết nối chỉ bị rò rỉ khi tôi sử dụng DbConnection.BeginTransaction và DbTransaction.Commit/Rollback. Tôi chắc chắn rằng tôi đóng/bỏ tất cả các kết nối đúng cách nhưng không giúp đỡ. Tôi nghĩ rằng đó là một vấn đề với chính Npgsql chứ không phải mã của chúng tôi. Hãy cho tôi biết nếu bạn đã tìm thấy giải pháp. Cảm ơn. – Fung

Trả lời

7

CẬP NHẬT: Tôi đang làm việc theo cách tốt hơn để kiểm tra nơi các kết nối bị rò rỉ được phân bổ. Vui lòng kiểm tra bài đăng của tôi về điều đó: http://fxjr.blogspot.com/2012/11/better-tracing-of-npgsql-connection.html Tôi hy vọng điều đó sẽ hữu ích.

EDIT: Bạn có thể thử phiên bản beta mới nhất 2.0.11.91 của chúng tôi. Chúng tôi đã thêm một số mã khác để cải thiện hồ bơi kết nối có thể giúp bạn.

Hmmmm, điều này rất lạ .... Bạn sẽ nhận được một số tin nhắn.

Các thư đó chỉ xuất hiện khi thời gian chạy ms.net hoàn tất đối tượng. Bạn có thể sử dụng nhiều hơn các kết nối tối đa mặc định cùng một lúc không? Ý tôi là, mức sử dụng tối đa của bạn có thể lớn hơn 20 kết nối số tối đa ...

Tôi hy vọng điều đó sẽ hữu ích.

Vui lòng cho tôi biết bạn sẽ nhận được gì.

+0

Ngay cả khi tôi quây lên các kết nối đến 100, tôi vẫn kết thúc với ngoại lệ này. Tôi khá tích cực, chúng tôi không sử dụng nhiều kết nối. – Alan

+1

Bạn có thể thử tắt kết nối tổng hợp và kiểm tra xem bạn có thấy kết nối đang nổi trong máy chủ không? Bạn có thể vô hiệu hóa gộp bằng cách thêm Pooling = false trong chuỗi kết nối của bạn. Nếu sau khi sử dụng ứng dụng của bạn trong một thời gian bạn nhìn thấy các kết nối trong máy chủ pg, bạn có thể đang bị rò rỉ kết nối. Tôi hy vọng điều đó sẽ hữu ích. –

+2

Xin chào Francisco, Cảm ơn sự giúp đỡ của bạn. Tôi vô hiệu hóa tổng hợp bằng cách sử dụng Pooling = false như bạn đã đề xuất. Để theo dõi các kết nối, tôi đang sử dụng truy vấn SQL 'SELECT * FROM pg_stat_activity'. Hầu hết các kết nối tôi thấy là 11, sau đó nó quay trở lại 1 (đối với truy vấn sql) nảy lên đến 3 hoặc 4 và quay trở lại. Là một bên, vô hiệu hóa tổng hợp thực sự làm chậm hiệu suất của npgsql/postgres. – Alan

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