2013-02-22 38 views
6

Chúng tôi có một ứng dụng 3 tầng với máy khách C#, lớp dịch vụ web C# WCF và cơ sở dữ liệu SQL Server. Dịch vụ web kết nối với cơ sở dữ liệu với ADO.NET. Tất cả mã C# của chúng tôi đều sử dụng .NET Framework 2.0.Giám sát ADO.NET Connection Thời gian mở

Gần đây, khách hàng đã thực hiện kiểm tra căng thẳng trên ứng dụng của chúng tôi. Trong quá trình thử nghiệm, máy chủ web tạo ra nhiều lỗi như sau:

Không thể kết nối với cơ sở dữ liệu cho chuỗi kết nối '...'. Thời gian hết hạn. Khoảng thời gian chờ trôi qua trước khi hoàn thành thao tác hoặc máy chủ không phản hồi.

Tôi biết có nhiều cách để bắt lỗi kết nối khi nhóm kết nối đầy và thử lấy kết nối bên ngoài hồ bơi kết nối. Chúng tôi cũng tìm thấy một số truy vấn cần được điều chỉnh, nhưng chúng không giải thích thời gian chờ kết nối máy chủ web.

Chúng tôi đang cố gắng tìm ra lý do máy chủ web định thời gian kết nối với cơ sở dữ liệu. Tôi đã thiết lập máy chủ web để bật tất cả các ADO.NET performance counters. Tuy nhiên, tôi không thấy bất cứ điều gì liên quan đến thời gian cần thiết để kết nối hoặc kết nối thời gian chờ hoặc tương tự. Lý tưởng nhất, chúng tôi sẽ có thể vẽ đồ thị thời gian kết nối trong perfmon bên cạnh các bộ đếm ADO.NET khác.

Có cách nào để theo dõi hiệu suất ADO.NET trong các kết nối có được không?

Tôi tưởng tượng chúng ta có thể tạo bộ đếm hiệu suất "thời gian mở kết nối trung bình" của riêng mình bằng cách cố gắng mở kết nối, nhưng tôi muốn sử dụng thứ gì đó đã tồn tại.

+0

Trợ giúp SQL Profiler có liên quan đến vấn đề này không? –

+0

@MrMoose: Hồ sơ đã giúp rất nhiều trong việc tìm kiếm một số truy vấn vấn đề. Nhưng tôi cần một cái gì đó cụ thể để theo dõi thời gian kết nối để xem khi họ đi lên và khi họ bắt đầu thời gian ra ngoài. –

Trả lời

2

Bạn có thể sử dụng perfmon để nhận thông tin này. Bạn sẽ cần phải đính kèm màn hình User Connections dưới SQL Server: General Statistics. Here is the blog post Tôi lấy nó từ. Điều này sẽ cho bạn biết vào thời điểm nào các kết nối đang được mở.

Sau đó, bạn sẽ cần phải tương quan với các tác vụ ứng dụng (tức là những thứ bạn đang làm trong ứng dụng khi bạn nhìn thấy chúng liên tục leo lên).

Một khi bạn đã làm điều đó bạn sẽ muốn để có được những kết nối bên trong một tuyên bố using nếu bạn chưa:

using (SqlConnection cn = new SqlConnection("some connection string")) 
{ 
    cn.Open(); 
    ... 
} 

bằng cách làm này bạn sẽ không cần phải đưa ra một Close và bạn sẽ không phải lo lắng về việc chúng bị xử lý đúng cách.

Tóm lại, bộ đếm hiệu suất sẽ giúp bạn theo dõi mã trong ứng dụng gây ra sự cố, nhưng nó sẽ không bị giảm xuống dòng cho mỗi lần nói, nó sẽ tốn nhiều công sức hơn nữa từ đó.

+0

Cảm ơn bạn, nhưng tôi không lo lắng về việc nhúng kết nối ứng dụng. Tôi khá chắc chắn đối tượng dữ liệu của chúng tôi đang làm điều đó một cách chính xác. Tôi tự hỏi tại sao đôi khi phải mất một thời gian dài để kết nối với cơ sở dữ liệu. Cụ thể, tôi muốn theo dõi thời gian có được kết nối thông qua perfmon để tôi có thể so khớp các lần chuyển đổi kết nối với một số loại số cơ sở dữ liệu như sử dụng I/O hoặc CPU đang chờ xử lý hoặc tương tự. Tôi không thấy cách nào khác để làm điều này ngoài việc tạo ra bộ đếm của riêng tôi. –

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