Mysql có tự động đóng kết nối không?

Có rất nhiều hướng dẫn hay nói về loại

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
0 của Go và cách sử dụng nó để thực hiện các truy vấn và câu lệnh cơ sở dữ liệu SQL. Nhưng hầu hết chúng đều che đậy các phương pháp
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
1,
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
2 và
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
3 — mà bạn có thể sử dụng để định cấu hình hành vi của
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
0 và thay đổi hiệu suất của nó

Trong bài đăng này, tôi muốn giải thích chính xác chức năng của các cài đặt này và chứng minh tác động [tích cực và tiêu cực] mà chúng có thể gây ra

Kết nối mở và nhàn rỗi

Tôi sẽ bắt đầu với một nền tảng nhỏ

Đối tượng

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
0 là một nhóm nhiều kết nối cơ sở dữ liệu chứa cả kết nối 'đang sử dụng' và 'nhàn rỗi'. Một kết nối được đánh dấu là đang sử dụng khi bạn đang sử dụng nó để thực hiện một tác vụ cơ sở dữ liệu, chẳng hạn như thực thi một câu lệnh SQL hoặc truy vấn các hàng. Khi tác vụ hoàn thành, kết nối được đánh dấu là không hoạt động

Khi bạn hướng dẫn

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
0 thực hiện một tác vụ cơ sở dữ liệu, trước tiên, nó sẽ kiểm tra xem có bất kỳ kết nối nhàn rỗi nào đã có sẵn trong nhóm không. Nếu có sẵn thì Go sẽ sử dụng lại kết nối hiện có này và đánh dấu nó là đang sử dụng trong suốt thời gian thực hiện nhiệm vụ. Nếu không có kết nối nhàn rỗi nào trong nhóm khi bạn cần, thì Go sẽ tạo thêm một kết nối bổ sung mới

Phương thức SetMaxOpenConns

Theo mặc định, không có giới hạn về số lượng kết nối mở [đang sử dụng + không hoạt động] cùng một lúc. Nhưng bạn có thể thực hiện giới hạn của riêng mình thông qua phương pháp

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
1 như vậy

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
8

Trong mã ví dụ này, nhóm hiện có giới hạn tối đa là 5 kết nối mở đồng thời. Nếu tất cả 5 kết nối đã được đánh dấu là đang sử dụng và cần một kết nối mới khác, thì ứng dụng sẽ buộc phải đợi cho đến khi một trong 5 kết nối được giải phóng và trở nên nhàn rỗi

Để minh họa tác động của việc thay đổi

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
9, tôi đã chạy thử nghiệm điểm chuẩn với các kết nối mở tối đa được đặt thành 1, 2, 5, 10 và không giới hạn. Điểm chuẩn thực thi song song các câu lệnh
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
00 trên cơ sở dữ liệu PostgreSQL và bạn có thể tìm thấy mã trong ý chính này. Đây là kết quả

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
01

Chỉnh sửa. Để làm rõ, mục đích của điểm chuẩn này không phải là để mô phỏng hành vi 'đời thực' của một ứng dụng. Nó chỉ giúp minh họa cách

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
0 cư xử đằng sau hậu trường và tác động của việc thay đổi
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
9 đối với hành vi đó

Đối với điểm chuẩn này, chúng ta có thể thấy rằng càng cho phép nhiều kết nối mở thì càng mất ít thời gian để thực hiện

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
00 trên cơ sở dữ liệu [3129633 ns/op với 1 kết nối mở so với 531030 ns/op đối với kết nối không giới hạn — nhanh hơn khoảng 6 lần . Điều này là do càng nhiều kết nối mở được cho phép, càng có nhiều truy vấn cơ sở dữ liệu có thể được thực hiện đồng thời

Phương thức SetMaxIdleConns

Theo mặc định,

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
0 cho phép giữ lại tối đa 2 kết nối nhàn rỗi trong nhóm kết nối. Bạn có thể thay đổi điều này thông qua phương pháp
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
2 như vậy

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
07

Về lý thuyết, việc cho phép số lượng kết nối nhàn rỗi cao hơn trong nhóm sẽ cải thiện hiệu suất vì ít có khả năng phải thiết lập kết nối mới từ đầu — do đó giúp tiết kiệm tài nguyên

Hãy xem cùng một điểm chuẩn với các kết nối nhàn rỗi tối đa được đặt thành không, 1, 2, 5 và 10 [và số lượng kết nối mở là không giới hạn]

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
08

Khi

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
09 được đặt thành không, một kết nối mới phải được tạo từ đầu cho mỗi
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
00 và chúng tôi có thể thấy từ các điểm chuẩn rằng thời gian chạy trung bình và mức sử dụng bộ nhớ tương đối cao

Việc cho phép chỉ giữ lại và sử dụng lại 1 kết nối nhàn rỗi sẽ tạo ra sự khác biệt lớn đối với điểm chuẩn cụ thể này — nó cắt giảm thời gian chạy trung bình khoảng 8 lần và giảm mức sử dụng bộ nhớ khoảng 20 lần. Tiếp tục tăng kích thước của nhóm kết nối nhàn rỗi giúp hiệu suất thậm chí còn tốt hơn, mặc dù các cải tiến ít rõ rệt hơn

Vì vậy, bạn có nên duy trì một nhóm kết nối nhàn rỗi lớn không?

Điều quan trọng là phải nhận ra rằng việc duy trì một kết nối nhàn rỗi sẽ phải trả giá — nó chiếm bộ nhớ mà có thể được sử dụng cho cả ứng dụng và cơ sở dữ liệu của bạn

Cũng có thể nếu một kết nối không hoạt động quá lâu thì nó có thể không sử dụng được. Ví dụ: cài đặt

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
11 của MySQL sẽ tự động đóng mọi kết nối không được sử dụng trong 8 giờ [theo mặc định]

Khi điều này xảy ra,

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
0 sẽ xử lý nó một cách duyên dáng. Các kết nối không hợp lệ sẽ tự động được thử lại hai lần trước khi bỏ cuộc, tại thời điểm đó, Go sẽ xóa kết nối khỏi nhóm và tạo một kết nối mới. Vì vậy, đặt
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
09 quá cao thực sự có thể dẫn đến kết nối trở nên không sử dụng được và sử dụng nhiều tài nguyên hơn so với khi bạn có nhóm kết nối nhàn rỗi nhỏ hơn [với ít kết nối được sử dụng thường xuyên hơn]. Vì vậy, thực sự bạn chỉ muốn giữ kết nối không hoạt động nếu bạn có thể sẽ sớm sử dụng lại kết nối đó

Một điều cuối cùng cần chỉ ra là

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
09 phải luôn nhỏ hơn hoặc bằng
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
9. Go thực thi điều này và sẽ tự động giảm
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
09 nếu cần

Phương thức SetConnMaxLifetime

Bây giờ chúng ta hãy xem phương pháp

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
3 đặt thời lượng tối đa mà một kết nối có thể được sử dụng lại cho. Điều này có thể hữu ích nếu cơ sở dữ liệu SQL của bạn cũng triển khai thời gian tồn tại của kết nối tối đa hoặc nếu — ví dụ — bạn muốn tạo điều kiện thuận lợi cho việc hoán đổi cơ sở dữ liệu sau bộ cân bằng tải

Bạn sử dụng nó như thế này

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
18

Trong ví dụ này, tất cả các kết nối của chúng tôi sẽ 'hết hạn' sau 1 giờ kể từ khi chúng được tạo lần đầu tiên và không thể sử dụng lại sau khi chúng hết hạn. Nhưng lưu ý

  • Điều này không đảm bảo rằng một kết nối sẽ tồn tại trong nhóm trong cả giờ;
  • Một kết nối vẫn có thể được sử dụng hơn một giờ sau khi được tạo — nó không thể bắt đầu được sử dụng lại sau thời gian đó
  • Đây không phải là thời gian chờ nhàn rỗi. Kết nối sẽ hết hạn sau 1 giờ kể từ khi được tạo lần đầu — không phải 1 giờ sau khi kết nối không hoạt động lần cuối
  • Cứ sau mỗi giây, một thao tác dọn dẹp sẽ tự động chạy để xóa các kết nối 'đã hết hạn' khỏi nhóm

Về lý thuyết,

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
19 càng ngắn thì các kết nối sẽ hết hạn thường xuyên hơn — và do đó — chúng sẽ càng cần được tạo lại từ đầu thường xuyên hơn

Để minh họa điều này, tôi đã chạy điểm chuẩn với

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
19 được đặt thành 100ms, 200ms, 500ms, 1000ms và không giới hạn [được sử dụng lại mãi mãi], với cài đặt mặc định là kết nối mở không giới hạn và 2 kết nối nhàn rỗi. Những khoảng thời gian này rõ ràng là ngắn hơn nhiều so với bạn sử dụng trong hầu hết các ứng dụng nhưng chúng giúp minh họa tốt hành vi

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
11

Trong các điểm chuẩn cụ thể này, chúng ta có thể thấy rằng mức sử dụng bộ nhớ lớn hơn gấp 3 lần với thời gian tồn tại 100 mili giây so với thời gian tồn tại không giới hạn và thời gian chạy trung bình cho mỗi

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
00 cũng dài hơn một chút

Nếu bạn đặt

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
19 trong mã của mình, thì điều quan trọng là phải ghi nhớ tần suất mà các kết nối sẽ hết hạn [và sau đó được tạo lại]. Ví dụ: nếu bạn có tổng số 100 kết nối và thời gian 1 phút là 100, thì ứng dụng của bạn có khả năng hủy và tạo lại tối đa 1. 67 kết nối [trung bình] mỗi giây. Bạn không muốn tần số này lớn đến mức cuối cùng nó cản trở hiệu suất, thay vì giúp ích cho nó

Vượt quá giới hạn kết nối

Cuối cùng, bài viết này sẽ không đầy đủ nếu không đề cập đến điều gì sẽ xảy ra nếu bạn vượt quá giới hạn cứng về số lượng kết nối cơ sở dữ liệu

Để minh họa, tôi sẽ thay đổi tệp

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
15 của mình để chỉ cho phép tổng cộng 5 kết nối [mặc định là 100]

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
16

Và sau đó chạy lại bài kiểm tra điểm chuẩn với các kết nối mở không giới hạn

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
17

Ngay khi đạt đến giới hạn cứng là 5 kết nối, trình điều khiển cơ sở dữ liệu [pq] của tôi ngay lập tức trả về thông báo lỗi

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
18 thay vì hoàn thành
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
00

Để ngăn lỗi này, chúng tôi cần đặt tổng số kết nối mở tối đa [đang sử dụng + không hoạt động] trong

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
0 thành dưới 5. như vậy

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
11

Bây giờ sẽ chỉ có tối đa 3 kết nối được tạo bởi

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
0 tại bất kỳ thời điểm nào và điểm chuẩn sẽ chạy mà không có bất kỳ lỗi nào

Nhưng làm điều này đi kèm với một cảnh báo lớn. khi đạt đến giới hạn kết nối mở và tất cả các kết nối đang được sử dụng, mọi tác vụ cơ sở dữ liệu mới mà ứng dụng của bạn cần thực thi sẽ buộc phải đợi cho đến khi kết nối trở nên miễn phí và được đánh dấu là không hoạt động. Ví dụ: trong ngữ cảnh của một ứng dụng web, yêu cầu HTTP của người dùng sẽ bị 'treo' và thậm chí có khả năng hết thời gian trong khi chờ tác vụ cơ sở dữ liệu được chạy

Để giảm thiểu điều này, bạn phải luôn chuyển đối tượng

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
13 với thời gian chờ cố định, nhanh, khi thực hiện cuộc gọi cơ sở dữ liệu, sử dụng các phương thức hỗ trợ theo ngữ cảnh như
BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
14. Một ví dụ có thể được nhìn thấy trong ý chính ở đây

Tóm tắt

  1. Theo nguyên tắc thông thường, bạn nên đặt giá trị
    BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
    BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
    BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
    BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
    BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
    PASS
    9 một cách rõ ràng. Điều này phải thoải mái dưới bất kỳ giới hạn cứng nào về số lượng kết nối do cơ sở dữ liệu và cơ sở hạ tầng của bạn áp đặt
  2. Nói chung, giá trị
    BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
    BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
    BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
    BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
    BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
    PASS
    9 và
    BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
    BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
    BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
    BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
    BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
    PASS
    09 cao hơn sẽ dẫn đến hiệu suất tốt hơn. Nhưng lợi nhuận đang giảm dần và bạn nên lưu ý rằng việc có một nhóm kết nối nhàn rỗi quá lớn [với các kết nối không được sử dụng lại và cuối cùng trở nên tồi tệ] thực sự có thể dẫn đến giảm hiệu suất
  3. Để giảm thiểu rủi ro từ điểm 2 ở trên, bạn có thể đặt một khoảng thời gian tương đối ngắn là
    BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
    BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
    BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
    BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
    BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
    PASS
    19. Nhưng bạn không muốn điều này quá ngắn dẫn đến các kết nối bị giết và được tạo lại thường xuyên một cách không cần thiết
  4. BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
    BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
    BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
    BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
    BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
    PASS
    09 phải luôn nhỏ hơn hoặc bằng
    BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
    BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
    BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
    BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
    BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
    PASS
    9

Đối với các ứng dụng web vừa và nhỏ, tôi thường sử dụng các cài đặt sau làm điểm bắt đầu, sau đó tối ưu hóa từ đó tùy thuộc vào kết quả kiểm tra tải với mức thông lượng thực tế

BenchmarkMaxOpenConns1-8                 500       3129633 ns/op         478 B/op         10 allocs/op
BenchmarkMaxOpenConns2-8                1000       2181641 ns/op         470 B/op         10 allocs/op
BenchmarkMaxOpenConns5-8                2000        859654 ns/op         493 B/op         10 allocs/op
BenchmarkMaxOpenConns10-8               2000        545394 ns/op         510 B/op         10 allocs/op
BenchmarkMaxOpenConnsUnlimited-8        2000        531030 ns/op         479 B/op          9 allocs/op
PASS
11

Nếu bạn thích bài viết này, bạn có thể muốn xem danh sách hướng dẫn được đề xuất của tôi hoặc xem sách của tôi Hãy bắt đầu và Hãy tiến xa hơn, cuốn sách dạy cho bạn mọi thứ bạn cần biết về cách xây dựng các ứng dụng web và API chuyên nghiệp sẵn sàng cho sản xuất với Go

Điều gì xảy ra nếu bạn không đóng kết nối MySQL?

Nếu bạn không thoát[] ngay sau đó, phần còn lại của tập lệnh sẽ tiếp tục chạy . Khi tập lệnh chạy xong, nó sẽ đóng tất cả các kết nối đang mở [hoặc giải phóng chúng trở lại nhóm nếu bạn đang sử dụng các kết nối liên tục]. Đừng lo lắng về nó.

Bạn có nên đóng kết nối MySQL sau mỗi truy vấn không?

Để có thời gian phản hồi nhanh và thông lượng cao, thực sự tốt nhất là giữ cho các kết nối cơ sở dữ liệu luôn mở và sử dụng lại chúng cho các yêu cầu tiếp theo . Hầu hết các khung cơ sở dữ liệu đều cung cấp một số loại cơ chế nhóm kết nối trong đó trình xử lý yêu cầu có thể nhận kết nối cơ sở dữ liệu cho công việc của nó và sau đó đưa nó trở lại nhóm.

Khi nào tôi nên đóng kết nối MySQL?

Nếu tập lệnh của bạn có khá nhiều xử lý cần thực hiện sau khi tìm nạp kết quả và đã truy xuất toàn bộ tập kết quả , thì bạn chắc chắn nên đóng kết nối. Nếu không, có khả năng máy chủ MySQL sẽ đạt đến giới hạn kết nối khi máy chủ web đang được sử dụng nhiều.

MySQL xử lý quá nhiều kết nối như thế nào?

Nếu máy khách gặp phải lỗi Quá nhiều kết nối khi cố gắng kết nối với máy chủ mysqld, thì tất cả các kết nối khả dụng đều đang được các máy khách khác sử dụng. Số lượng kết nối được phép được kiểm soát bởi biến hệ thống max_connections. Để hỗ trợ nhiều kết nối hơn, hãy đặt max_connections thành giá trị lớn hơn .

Chủ Đề