10

Tôi gặp phải một vấn đề lớn ở đây, cũng tại máy chủ của tôi.Hơn 100 kết nối với máy chủ sql 2008 trong trạng thái "ngủ"

Tôi có trang web ASP .net (khung 4.x) chạy trên máy chủ của tôi, tất cả các giao dịch/chọn/cập nhật/chèn được thực hiện bằng ADO.NET.

Vấn đề là sau khi sử dụng một lúc (một vài lần cập nhật/chọn/chèn) đôi khi tôi nhận được hơn 100 kết nối trên trạng thái "ngủ" khi kiểm tra kết nối trên máy chủ sql với truy vấn này:

SELECT 
spid, 
a.status, 
hostname, 
program_name, 
cmd, 
cpu, 
    physical_io, 
    blocked, 
    b.name, 
    loginame 
FROM 
    master.dbo.sysprocesses a INNER JOIN 
    master.dbo.sysdatabases b ON 
    a.dbid = b.dbid where program_name like '%TMS%' 
ORDER BY spid 

Tôi đã kiểm tra mã và đóng mỗi lần tạo kết nối, tôi sẽ thử nghiệm lớp mới, nhưng tôi e rằng vấn đề không được khắc phục.

Giả sử rằng kết nối tổng hợp, giữ kết nối để sử dụng lại chúng, nhưng cho đến khi tôi thấy không sử dụng lại chúng luôn.

Bất kỳ ý tưởng nào ngoài kiểm tra để đóng tất cả các kết nối mở sau khi sử dụng chúng?

SOLVED (bây giờ tôi chỉ có một và kết nối tuyệt đẹp trên "ngủ" trạng thái):

Bên cạnh những anwser của David Stratton, tôi muốn chia sẻ liên kết này giúp giải thích thực sự tốt như thế nào hồ bơi kết nối hoạt động: http://dinesql.blogspot.com/2010/07/sql-server-sleeping-status-and.html

Chỉ cần được ngắn, bạn cần phải đóng tất cả các kết nối (đối tượng kết nối sql) theo thứ tự mà các hồ bơi kết nối có thể tái sử dụng các kết nối và sử dụng chuỗi connectinos cùng, để đảm bảo điều này rất được khuyến khích sử dụng một trong các webConfig.

Hãy cẩn thận với dataReaders bạn nên đóng kết nối của nó để (đó là những gì làm cho tôi điên trong khi).

+0

Bạn có thể nhận được câu trả lời tốt hơn và tốt hơn tại [dba.stackexchange.com] (http://dba.stackexchange.com), nơi toàn thời gian của DBA hang out –

Trả lời

16

Có vẻ như đó là kết nối tổng hợp.

Từ đây: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

Một hồ bơi kết nối được tạo ra cho mỗi chuỗi kết nối độc đáo. Khi một hồ bơi được tạo, nhiều đối tượng kết nối được tạo và thêm vào hồ bơi để yêu cầu kích thước hồ bơi tối thiểu được thỏa mãn. Kết nối được thêm vào hồ bơi nếu cần, tối đa kích thước hồ bơi tối đa được chỉ định (100 là mặc định). Kết nối được phát hành trở lại vào hồ bơi khi chúng được đóng lại hoặc xử lý.

Để đảm bảo bạn không tạo các nhóm không cần thiết, hãy đảm bảo rằng cùng một chuỗi kết nối được sử dụng mỗi khi bạn kết nối - lưu trữ nó trong tệp .config.

Bạn cũng có thể giảm kích thước hồ bơi tối đa nếu muốn.

Thực ra, tôi khuyên bạn chỉ nên đọc toàn bộ bài viết được liên kết ở trên. Nó nói về thanh toán bù trừ các hồ bơi, và cung cấp cho bạn các phương pháp tốt nhất để sử dụng tổng hợp đúng cách.

Chỉnh sửa - thêm vào ngày hôm sau

Các hồ trên máy chủ của bạn đang có vì cách kết nối tổng hợp công trình. Theo các tài liệu liên quan đến ở trên:

Các pooler kết nối loại bỏ một kết nối từ hồ bơi sau khi nó đã được nhàn rỗi trong một thời gian dài, hoặc nếu pooler phát hiện rằng các kết nối với máy chủ đã bị cắt đứt. Lưu ý rằng kết nối bị cắt đứt chỉ có thể được phát hiện sau khi cố gắng liên lạc với máy chủ . Nếu kết nối được tìm thấy không còn được kết nối với máy chủ , nó được đánh dấu là không hợp lệ. Các kết nối không hợp lệ sẽ bị xóa khỏi hồ bơi kết nối chỉ khi chúng bị đóng hoặc bị thu hồi.

Điều này có nghĩa là bản thân máy chủ sẽ dọn sạch các hồ đó sau cùng, nếu chúng vẫn không được sử dụng. Nếu không được làm sạch, l có nghĩa là máy chủ tin rằng các kết nối vẫn đang được sử dụng và được treo vào chúng để tăng hiệu suất của bạn.

Nói cách khác, tôi sẽ không lo lắng về điều đó trừ khi bạn gặp sự cố. Kết nối Pooling đang xảy ra chính xác như nó phải được.

nếu bạn thực sự muốn xóa hồ, một lần nữa, mỗi tài liệu:

Xoá Pool

ADO.NET 2.0 giới thiệu hai phương pháp mới để rõ ràng hồ bơi: ClearAllPools và ClearPool. ClearAllPools xóa các hồ bơi kết nối cho một nhà cung cấp nhất định và ClearPool xóa hồ bơi kết nối được kết hợp với một kết nối cụ thể. Nếu có các kết nối đang được sử dụng tại thời điểm cuộc gọi, chúng được đánh dấu thích hợp. Khi họ đóng cửa, họ sẽ bị loại bỏ thay vì khi được trả lại hồ bơi.

Tuy nhiên, nếu bạn muốn điều chỉnh tổng hợp, Chuỗi kết nối có thể được sửa đổi. Xem trang này, và tìm kiếm cho từ "hồ bơi":

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx

Hoặc bạn có thể tranh thủ một DBA để hỗ trợ và thiết lập tổng hợp tại máy chủ cấp. Đó là off-topic ở đây, nhưng ServerFault.com có ​​thể có người hỗ trợ ở đó.

+0

Xin chào, trước khi yêu cầu tôi kết thúc đọc bài viết đó. Nhưng bạn có ý nghĩa gì với cùng một chuỗi kết nối? bạn có nghĩa là "đối tượng" hoặc chuỗi, tôi sẽ cố gắng sử dụng cũng là webConfig thay vì các thuộc tính trên lớp. Tôi có thể giới hạn hồ bơi kết nối ở đâu? Cảm ơn bạn. – Allende

+0

Tôi đoán tất cả các câu trả lời là ở đây http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx Tôi xin lỗi. Tôi sẽ kiểm tra điều này và cuối cùng cập nhật câu hỏi. – Allende

+0

Tôi không thể chỉ ra đúng cách để sử dụng "cùng một chuỗi kết nối" Tôi sử dụng nó từ cấu hình web bây giờ và vẫn nhận được rất nhiều kết nối về trạng thái "ngủ" – Allende