2010-01-21 19 views
11

Công cụ tốt để điều tra việc sử dụng Kết nối Cơ sở dữ liệu trong Java là gì?Công cụ tốt để điều tra việc sử dụng kết nối cơ sở dữ liệu trong Java là gì?

Nhà phát triển đang hỗ trợ một chương trình Java phức tạp, số lượng kết nối cơ sở dữ liệu sẵn có ở mức ocassionally. Kể từ khi vấn đề là lẻ tẻ nó sẽ hữu ích để biết được chủ đề đã mở nhiều kết nối với cơ sở dữ liệu để tập trung nỗ lực trong lĩnh vực này.

Cuối cùng, sửa lỗi chính xác có vẻ là viết lại chương trình để sử dụng lại các kết nối và không mở nhiều kết nối cho mỗi chuỗi.

Tôi hỏi, nhà phát triển nên có những công cụ nào trong hộp công cụ của mình để có thể điều tra tài nguyên tức là Kết nối cơ sở dữ liệu đã được chỉ định bởi một chuỗi.

Trả lời

3

Không phải là công cụ cụ thể, mà là kỹ thuật gỡ lỗi để theo dõi mã nào chịu trách nhiệm về kết nối mở hoặc tài nguyên khác.

Tôi giả sử bạn đang sử dụng một phương pháp nhất quán ở phía bên java để nhận kết nối db (gộp chung hoặc không quan trọng).

Ý tưởng là tạo lớp bao bọc rất nhẹ xung quanh nhà máy/hồ bơi kết nối của bạn hoặc bất kể nó là gì.Trình bao bọc sẽ thực hiện bất kỳ giao diện jdbc nào có ý nghĩa, do đó bạn có thể trao đổi nó cho đối tượng kết nối bình thường của bạn nhưng hầu hết các phương thức sẽ chỉ gọi/trả về kết nối cơ bản một cách minh bạch.

Nếu bạn đang sử dụng một số loại khung công tác IoC (ví dụ: mùa xuân), bạn sẽ có thể dễ dàng trao đổi lớp kết nối/nhà máy ở cấp cấu hình. Bây giờ tất cả mã java của bạn sẽ sử dụng trình bao bọc kết nối db mới của bạn.

Nếu bạn đang sử dụng một hồ bơi, sau đó gọi connection.close() thường chỉ trả về đối tượng vào hồ bơi thay vì hủy kết nối. Vì vậy, kỹ thuật này hoạt động cho rò rỉ kết nối bình thường hoặc chỉ là "không trả lại cho hồ bơi (hồ bơi kiệt sức)" rò rỉ.

Bây giờ chúng ta chỉ cần ghi lại các bit thú vị và đặt bẫy cho các kết nối bị rò rỉ.

Stack trace để xác định tác giả

Trong constructor hoặc phương pháp nhà máy cho wrapper kết nối của bạn tạo ra một đối tượng mới Throwable và lưu nó như là một biến địa phương trong wrapper của bạn cho sau này. Chúng tôi sử dụng Throwable vì nó nhanh hơn/rẻ hơn sử dụng Thread.currentThread().getStackTrace().

Đặt "cái bẫy"

Thực hiện phương pháp finally trong lớp wrapper của bạn. Đây là phương thức dọn dẹp được gọi bởi GC khi đối tượng đang bị hủy vì nó không còn được sử dụng nữa.

Phương pháp finally nên kiểm tra "Tôi có đóng cửa không?". Nếu đã đóng, thì mọi thứ đều ổn ... tuy nhiên nếu kết nối đang được GC và nó không bị đóng ... thì đây là kết nối "bị rò rỉ".

Bây giờ, Throwable sẽ hoạt động trở lại. Chúng ta có thể lấy Throwable và xuất ra một thông điệp tường trình tốt đẹp nói một cái gì đó như: "Tôi là một kết nối bị rò rỉ và đây là một dấu vết ngăn xếp liên quan đến tác giả của tôi."

Mở rộng ý tưởng

Phương pháp này có thể được điều chỉnh cho nhiều tình huống khác nhau. Tất nhiên, bạn có thể giữ các loại dữ liệu khác trong trình bao bọc của bạn để khắc phục sự cố cụ thể của bạn. Ví dụ thời gian tạo. Sau đó, bạn có thể thăm dò ý kiến ​​cho các kết nối lâu dài và một lần nữa ngụ ý người sáng tạo. Hoặc bạn có thể thăm dò các kết nối hiện có và phân tích các dấu vết ngăn xếp Throwable để nhận dữ liệu trên mã nào đang sử dụng số lượng kết nối theo thời gian.

Có lẽ một công cụ có sẵn cũng có thể làm những việc này, nhưng số lượng mã cần thiết để áp dụng kỹ thuật này là rất tối thiểu trong hầu hết các trường hợp (giả sử bạn có cách dễ dàng để hoán đổi db kết nối nhà máy mà không cần tìm kiếm thay thế toàn bộ codebase của bạn).

7

Hãy xem log4jdbc. Nó cho phép bạn có một cái nhìn tại tất cả các công cụ đi qua jdbc của bạn, bao gồm cả các kết nối mở/đóng cũng như thông tin số kết nối.

4

Có người chỉ cho tôi ConnLeakFinder thời gian gần đây, "một công cụ đơn giản để xác định rò rỉ kết nối jdbc trong mã java". Tôi chưa tự mình thử nghiệm nhưng cho phép bạn Để xem ai không đóng kết nối sau khi sử dụng. Xem Connection+Leak+How+To+Find.htm.

Nhưng thực tế, bạn nên sử dụng nhóm kết nối (ví dụ: c3p0).

0

P6Spy là khung công tác nguồn mở để hỗ trợ các ứng dụng chặn và tùy ý sửa đổi các câu lệnh cơ sở dữ liệu.

Từ http://www.p6spy.com/about.html
phân phối Các P6Spy bao gồm các thành phần sau:

  • P6Log. P6Log chặn và ghi lại các câu lệnh cơ sở dữ liệu của bất kỳ ứng dụng nào sử dụng JDBC. Ứng dụng này đặc biệt hữu ích cho các nhà phát triển để theo dõi các câu lệnh SQL được tạo ra bởi các máy chủ EJB, cho phép nhà phát triển viết mã đạt được hiệu quả tối đa trên máy chủ. P6Spy được thiết kế để cài đặt trong vài phút và không yêu cầu thay đổi mã.
  • P6Outage. P6Outage phát hiện các câu lệnh chạy dài có thể là dấu hiệu của một sự cố ngừng hoạt động của cơ sở dữ liệu và sẽ ghi lại bất kỳ câu lệnh nào vượt quá ranh giới thời gian có thể cấu hình trong khi thực thi nó. P6Outage được thiết kế để giảm thiểu bất kỳ hình phạt nào về hiệu năng ghi nhật ký bằng cách ghi lại các câu lệnh chạy dài.
+2

Trong khi P6Spy là một công cụ tốt, tôi không thấy nó giúp với các vấn đề rò rỉ kết nối săn bắn. –

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