2008-11-10 42 views
22

Khi tôi hồ sơ ứng dụng của mình bằng cách sử dụng SQL Server Profiler, tôi thấy rất nhiều thông báo và Kiểm tra đăng xuất cho các kết nối đến cùng một cơ sở dữ liệu. Tôi tự hỏi, điều này cho thấy rằng có gì đó sai với kết nối tổng hợp của tôi? Lý do tôi hỏi, là vì tôi thấy điều này trong tài liệu MSDN liên quan đến kết nối tổng hợp:Kết nối và kiểm tra kết nối SQL Đăng nhập/Đăng xuất

Đăng nhập và đăng xuất sự kiện sẽ không được huy động trên máy chủ khi kết nối được lấy từ hoặc quay trở lại hồ bơi kết nối. Điều này là do kết nối không thực sự bị đóng khi kết nối được trả về hồ bơi kết nối. Để biết thêm thông tin, hãy xem Kiểm tra Đăng nhập Sự kiện và Kiểm tra Sự kiện Đăng xuất Sự kiện Lớp trong Sách SQL Server Trực tuyến.

http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

Ngoài ra, không ai có bất cứ lời khuyên để xác định hiệu quả của tổng hợp kết nối cho một máy chủ SQL được? Tôi có rất nhiều cơ sở dữ liệu trên một máy chủ duy nhất và tôi biết điều này có thể có tác động rất lớn, nhưng tôi tự hỏi liệu có một cách dễ dàng để có được số liệu về hiệu quả của việc kết nối tổng hợp của tôi hay không. Cảm ơn trước!

Trả lời

14

Hãy nhớ rằng các kết nối được gộp chung cho mỗi chuỗi kết nối. Nếu bạn có nhiều cơ sở dữ liệu và kết nối bằng nhiều kết nối, ứng dụng của bạn sẽ tạo một kết nối mới khi không tồn tại với chuỗi kết nối chính xác. Sau đó, nó sẽ bơi kết nối đó và, nếu hồ bơi là đầy đủ, bump một kết nối hiện có. Mặc định Max Pool Size là 100 kết nối, vì vậy nếu bạn thường xuyên nảy qua hơn 100 cơ sở dữ liệu, bạn sẽ đóng và mở các kết nối mọi lúc.

Nó không lý tưởng, nhưng bạn có thể giải quyết vấn đề bằng cách luôn kết nối với một cơ sở dữ liệu (một chuỗi kết nối) và sau đó chuyển đổi bối cảnh db 'SỬ DỤNG [DBName]'. Có những hạn chế:

  • Bạn mất khả năng chỉ định người dùng/chuyển cho mỗi chuỗi kết nối (người dùng ứng dụng của bạn cần quyền đối với tất cả cơ sở dữ liệu).
  • SQL của bạn trở nên phức tạp hơn (đặc biệt nếu bạn đang sử dụng ORM ngoài hoặc hộp lưu trữ).

Bạn có thể thử nghiệm với việc tăng Kích thước hồ bơi tối đa nếu số lượng cơ sở dữ liệu của bạn không lớn. Nếu không, nếu một số cơ sở dữ liệu được sử dụng thường xuyên trong khi những người khác thì không, bạn có thể tắt tính gộp chung trên các dbs không thường xuyên. Cả hai mục được định cấu hình qua connectionstring.

Theo như số liệu, theo dõi sự kiện đăng nhập và đăng xuất trên SQL Server là một khởi đầu tốt. Nếu ứng dụng của bạn được tổng hợp độc đáo, bạn sẽ không thấy nhiều ứng dụng.

+0

Điều này làm rõ rất nhiều cho tôi. Cảm ơn. Có lẽ bạn có thể giúp tôi với điều này: sự khác biệt giữa các ứng dụng va chạm một kết nối gộp khi đạt kích thước hồ bơi tối đa so với ném một ngoại lệ là "tối đa kích thước hồ bơi đã đạt được" là gì? – motto

+0

@motto - bạn sẽ thấy ngoại lệ "kích thước bể bơi tối đa ..." khi kết nối không bị đóng. Ngay cả với một hồ bơi, bạn cần .Đóng các kết nối để đưa chúng trở lại hồ bơi. Một ngoại lệ có thể ngăn chặn cuộc gọi của bạn .Đóng cuộc gọi nếu nó không nằm trong khối "cuối cùng" hoặc "đang sử dụng": http://blogs.msdn.com/tolong/archive/2006/11/21/max-pool-size- was-reach.aspx. Hãy nhớ rằng một số lệnh Command hoặc Adapter sử dụng một kết nối ngầm và cần phải được đóng một cách an toàn là tốt. Ngoài ra, hãy cẩn thận tạo đối tượng DB trong vòng lặp. –

+3

Tôi cũng sẽ thêm rằng khi thực hiện "exec sp_reset_connection" các sự kiện kiểm tra LOGIN/LOGOUT ĐƯỢC kích hoạt, mặc dù kết nối chưa thực sự bị ngắt kết nối. – Martin

30

Trong khi bài viết MSDN nói rằng sự kiện này sẽ chỉ được nâng lên cho các kết nối không tái sử dụng, tài liệu SQL Server mâu thuẫn với tuyên bố này:

"Các lớp sự kiện Audit Login chỉ ra rằng người dùng đã đăng nhập thành công cho Microsoft SQL Server. Các sự kiện trong lớp này được kích hoạt bởi các kết nối mới hoặc bởi các kết nối được tái sử dụng từ một nhóm kết nối. "

Cách tốt nhất để đo lường hiệu quả của tổng hợp là thu thập thời gian dành cho việc kết nối và không có tổng hợp.Với việc gộp nhóm, bạn sẽ thấy rằng kết nối đầu tiên chậm và các kết nối tiếp theo cực kỳ nhanh. Nếu không có tổng cộng, mọi kết nối sẽ mất rất nhiều thời gian.

Nếu bạn muốn theo dõi sự kiện Đăng nhập kiểm tra, bạn có thể sử dụng cột dữ liệu EventSubClass để đăng nhập bằng kết nối được sử dụng lại hay kết nối mới. Giá trị sẽ là 1 cho một kết nối thực và 2 cho một kết nối tái sử dụng từ pool.application.

+0

Khi tôi tạo một dấu vết profiler sql cột EventSubClass không xuất hiện cho các sự kiện kiểm tra đăng nhập và kiểm tra đăng xuất .... bất cứ ai biết tại sao? – Rory

+2

Có một hộp kiểm "Hiển thị tất cả các cột" khi thiết lập dấu vết, EventSubClass sau đó trở thành một tùy chọn trên cả các sự kiện Đăng nhập kiểm tra và Đăng xuất Auddit. –

+0

rotary_engine: bạn đang sử dụng phiên bản SSMS và SQL Server nào? Tôi có thể thấy cột EventSubClass, nhưng nó không phải là một tùy chọn cho "Kiểm toán Đăng nhập". Cảm ơn – motto

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