2009-01-16 87 views
5

Tôi quan tâm đến việc biết cơ sở dữ liệu xử lý các kết nối không được đóng thực sự rõ ràng bởi thực thể đã khởi tạo kết nối như thế nào.Cơ sở dữ liệu và kết nối

  1. Giả sử tôi có cơ sở dữ liệu chỉ có thể chấp nhận 2 kết nối đồng thời tại một thời điểm. Tôi có một đoạn mã mở một kết nối và không bao giờ đóng nó. Đoạn mã này chạy mãi mãi, nhưng nó chỉ sử dụng kết nối một lần trong vòng đời của nó nhưng đối tượng kết nối không bao giờ nằm ​​ngoài phạm vi, vì vậy nó không phải là rác được thu thập. Giả sử tôi chạy 2 phiên bản của mã này. Điều đó có nghĩa là cho đến khi chương trình bị chấm dứt hoặc kết nối hết thời gian (do không hoạt động), cơ sở dữ liệu có thể chấp nhận không có thêm kết nối?

  2. Trong trường hợp trên nếu đối tượng kết nối được thu thập rác, thì kết nối có bị ngắt tự động hay không phụ thuộc vào trình điều khiển cơ sở dữ liệu mà tôi đang sử dụng hoặc kết nối không bị chấm dứt cho đến khi đóng hoàn toàn?

  3. Nếu tôi mở kết nối bằng đoạn mã và tôi không đóng kết nối một cách rõ ràng, nhưng chương trình chấm dứt thì cơ sở dữ liệu sẽ xác nhận lại kết nối đó như thế nào?

Trả lời

4

Giao thức cơ bản cho kết nối cơ sở dữ liệu thường dựa trên TCP/IP. Kết nối có thể bị chấm dứt theo một trong nhiều cách:

  1. Máy chủ đóng nó một cách duyên dáng và nhận được xác nhận từ khách hàng;
  2. Khách hàng đóng cửa là duyên dáng và nhận được xác nhận từ máy chủ;
  3. Thời gian kết nối. Máy khách và máy chủ đều được nói riêng bởi hệ điều hành tương ứng của chúng mà kết nối đã bị đóng;
  4. Kết nối bị đóng mạnh bởi hai bên.

Trong trường hợp (3), các kết nối TCP phải được giữ nguyên bằng cách gửi thông điệp giả thường xuyên để tránh hết thời gian chờ. Kết nối của bạn có thể hết thời gian chờ vì không có bên nào làm việc này (và đối với kết nối cơ sở dữ liệu, đó không phải là điều bạn thường muốn làm).

Hoàn toàn có thể dành thời gian cho một bên để nghĩ rằng kết nối bị đóng và phía bên kia vẫn tin rằng nó đang mở. Tin nhắn có thể được gửi trong những trường hợp đó (và thường bị loại bỏ).

Mỗi kết nối ("socket") sử dụng tài nguyên hệ điều hành được gọi là mô tả tệp (theo cách UNIX, hệ điều hành của bạn có thể gọi nó là cái gì khác), đó là một xử lý đối với tài nguyên I/O và điều tương tự được sử dụng cho một tập tin mở (một lần nữa, hệ điều hành có thể thay đổi).

Giới hạn trên các kết nối trên cơ sở dữ liệu của bạn sẽ là thấp nhất:

  • Giới hạn cấu hình cho hệ điều hành;
  • Trình mô tả tệp tối đa được phép cho quy trình đó (trừ bất kỳ việc nào được sử dụng cho hoạt động I/O); và
  • (có thể) cài đặt hệ thống hoặc chính sách về giới hạn kết nối.

Nếu kết nối không dựa trên TCP (ví dụ ổ cắm hệ thống tệp thường được sử dụng với hệ thống MySQL trên UNIX), nguyên tắc thực tế là rất nhỏ.

Dù sao, đạo đức của câu chuyện để lấy từ điều này là kết nối cơ sở dữ liệu - bất kể biểu mẫu của nó - liên quan đến tài nguyên hệ điều hành của một số loại. Chương trình của bạn được yêu cầu trực tiếp hoặc gián tiếp cho tài nguyên đó. Nếu chương trình chết, hệ điều hành sẽ lấy lại nó (có lẽ không phải ngay lập tức nhưng cuối cùng). Nếu kết nối bị thu gom rác thì tài nguyên sẽ được giải phóng theo cùng một cách như thể nó đã bị buộc phải đóng cửa.

Tài nguyên bên ngoài đó (và không phải mã mà khách hàng của bạn đang sử dụng) giữ kết nối mở và điều khiển mọi giới hạn.

4

Để trả lời câu hỏi của bạn theo thứ tự:

  1. Vâng, có lẽ. Trừ khi "kết nối đồng thời" bạn thực sự có nghĩa là "truy vấn đồng thời". Nếu yo're giữ kết nối cơ sở dữ liệu mở, nó đang mở.

  2. Bộ sưu tập rác có thể hoặc không làm sạch kết nối. Phụ thuộc vào ngôn ngữ và trình điều khiển cơ sở dữ liệu được sử dụng. (Bộ sưu tập rác có thể bị giới hạn trong việc thu hồi bộ nhớ, chứ không phải các tài nguyên như kết nối TCP.)

  3. Khi chương trình của bạn chấm dứt, thường là hệ điều hành chịu trách nhiệm dọn sạch tất cả các tài nguyên được sử dụng. Điều này bao gồm đóng kết nối TCP, vv. Vì vậy, đối với hầu hết các loại kết nối, cơ sở dữ liệu sẽ được thông báo rằng phía bên kia đã đóng kết nối.

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