Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Khi SIGTERM được gửi đi, tiến trình con có đóng kết nối mysql không?

Khi một quá trình hoàn tất (vì nó thoát hoặc nó bị kết thúc bằng cách sử dụng một tín hiệu), tất cả các tệp và kết nối mà nó vẫn mở sẽ được hệ điều hành tự động đóng lại. Nó không được đóng sạch, bằng cách sử dụng giao thức MySQL để đóng các kết nối (giả sử có một). Nó đơn giản bị rơi ở cấp TCP / IP và máy chủ ở phía bên kia chỉ phát hiện ra nó đang nói chuyện với một cánh cửa đóng. Điều đó không phải lúc nào cũng xảy ra ngay lập tức, đôi khi phải mất một khoảng thời gian cho đến khi máy chủ thông báo rằng đối tác thảo luận đã biến mất. Khi điều này xảy ra, nó coi như kết nối bị ngắt và dọn dẹp mọi thứ về phía nó.

Không mở kết nối MySQL trong quy trình mẹ trước khi sử dụng fork() . fork() sao chép cấu trúc dữ liệu được sử dụng để quản lý phía cục bộ của kết nối và kết quả là không thể đoán trước. Thậm chí nhiều hơn nữa, khi con hoàn thành (bất kể bằng cách nào), nó đóng kết nối (hoặc OS loại bỏ nó), máy chủ MySQL cũng đóng phần cuối của nó và tiến trình mẹ phát hiện ra nó đang nói chuyện với không ai cả.

Đóng kết nối MySQL trong quy trình mẹ trước khi sử dụng fork() sau đó mở các kết nối riêng biệt trong quy trình chính và trong quy trình con, nếu cần.

Ngoài ra, hãy gói mọi giao tiếp MySQL với máy chủ trong quy trình mẹ giữa:

pcntl_sigprocmask(SIG_BLOCK, array(SIGCHLD));

pcntl_sigprocmask(SIG_UNBLOCK, array(SIGCHLD));

Nếu không, khi một quy trình con hoàn thành, quy trình mẹ sẽ được thông báo bằng SIGCHLD dấu hiệu. Một tín hiệu đã nhận sẽ tiếp tục nó từ trạng thái ngủ (nếu nó tình cờ bị dừng trong sleep() gọi khi có tín hiệu). Thư viện MySQL sử dụng sleep() như một phần của giao thức MySQL để giao tiếp với máy chủ. Nếu một sleep() như vậy buộc phải trả về sớm hơn mức cần thiết (vì tín hiệu đã nhận), thư viện MySQL bị nhầm lẫn và kết thúc là báo cáo các lỗi lạ (như "máy chủ MySQL đã biến mất") thực sự không đúng.

Hãy xem câu trả lời này để được giải thích chi tiết.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để chuyển đổi mảng byte thành blob

  2. Sự cố với AES_DECRYPT của MySQL

  3. Tạo cơ sở dữ liệu trực quan với MySQL Workbench

  4. tại sao tôi phải sử dụng mb_convert_encoding ($ name, 'ISO-8859-15', 'utf-8') để hiển thị các ký tự có dấu?

  5. Mã thông báo FCM (nhắn tin đám mây firebase) dành cho một thiết bị hay cho một tài khoản?