Thiết lập kết nối cơ sở dữ liệu là một quá trình rất tốn tài nguyên và đòi hỏi nhiều chi phí. Hơn nữa, trong một môi trường đa luồng, việc mở và đóng nhiều kết nối thường xuyên và liên tục ảnh hưởng rất nhiều đến performance và tài nguyên của ứng dụng. Bài này sẽ giới thiệu với các bạn Connection Pool trong ứng dụng Java.

1. Connection Pooling là gì?

  • Connection pool (vùng kết nối) : là kỹ thuật cho phép tạo và duy trì 1 tập các kết nối dùng chung nhằm tăng hiệu suất cho các ứng dụng bằng cách sử dụng lại các kết nối khi có yêu cầu thay vì việc tạo kết nối mới.

2. Cách làm việc của Connection pooling?

  • Connection Pool Manager (CPM) là trình quản lý vùng kết nối, một khi ứng dụng được chạy thì Connection pool tạo ra một vùng kết nối, trong vùng kết nối đó có các kết nối do chúng ta tạo ra sẵn. Và như vậy, một khi có một request đến thì CPM kiểm tra xem có kết nối nào đang rỗi không? Nếu có nó sẽ dùng kết nối đó còn không thì nó sẽ đợi cho đến khi có kết nối nào đó rỗi hoặc kết nối khác bị timeout. Kết nối sau khi sử dụng sẽ không đóng lại ngay mà sẽ được trả về CPM để dùng lại khi được yêu cầu trong tương lai.

Ví dụ:

  • Một connection pool có tối đa 10 connection trong pool. Bây giờ user kết nối tới database (DB), hệ thống sẽ kiểm tra trong connection pool có kết nối nào đang rảnh không?
  • Trường hợp chưa có kết nối nào trong connection pool hoặc tất cả các kết nối đều bận (đang được sử dụng bởi user khác) và số lượng connection trong connection < 10 thì sẽ tạo một connection mới tới DB để kết nối tới DB đồng thời kết nối đó sẽ được đưa vào connection pool.
  • Trường hợp tất cả các kết nối đang bận và số lượng connection trong connection pool = 10 thì người dùng phải đợi cho các user dùng xong để được dùng.

Sau khi một kết nối được tạo và sử dụng xong nó sẽ không đóng lại mà sẽ duy trì trong connection pool để dùng lại cho lần sau và chỉ thực sự bị đóng khi hết thời gian timeout (lâu quá không dùng đến nữa).

Screenshot 2024-12-06 155050.png

3. So sánh sử dụng Connection pool với không sử dụng

Sử dụng Connection Pool

Connection Pool là một tập hợp các kết nối được tái sử dụng để giao tiếp với cơ sở dữ liệu. Khi một ứng dụng cần truy cập vào cơ sở dữ liệu, nó sẽ lấy một kết nối từ pool thay vì tạo một kết nối mới.

Ưu điểm:

  • Hiệu suất cao hơn: kết nối được tái sử dụng, giảm thời gian thiết lập kết nối (overhead) khi thực hiện truy vấn
  • Quản lý tài nguyên tốt hơn: Pool giới hạn số lượng kết nối tối đa, tránh việc quá tải tài nguyên cho máy chủ cơ sở dữ liệu
  • Ổn định hơn: ngăn trạng tình trạng bùng nổ kết nối khi có nhiều yêu cầu đồng thời
  • Tuỳ chỉnh linh hoạt: có thể cấu hình số lượng kết nối tối thiểu, tối đa, thời gian chờ, và cơ chế kiểm tra kết nối để duy trì hiệu suất ổn định

Nhược điểm:

  • Bộ nhớ chiếm dụng: Connection pool tiêu tốn bộ nhớ để duy trì các kết nối
Không dùng Connection Pool

Khi không sử dụng connection pool, mỗi lần ứng dụng cần truy cập cơ sở dữ liệu, nó sẽ tạo một kết nối mới và đóng kết nối sau khi hoàn thành.

Ưu điểm:

  • Đơn giản: không cần cấu hình, chỉ cần gọi trực tiếp API tạo kết nối.
  • Phù hợp với hệ thống nhỏ: hệ thống có ít yêu cầu đồng thời hoặc chỉ chạy các tác vụ không thường xuyên

Nhược điểm:

  • Hiệu suất kém hơn: mỗi lần kết nối cơ sở dữ liệu cần thiết lập lại từ đầu, gây tốn thời gian và tài nguyên
  • Tiêu tốn tài nguyên: dễ dẫn đến bùng nổ kết nối nếu có nhiều yêu cầu đồng thời
  • Không ổn định: hệ thống dễ bị quá tải khi số lượng kết nối tăng đột ngột
  • Không tối ưu cho ứng dụng lớn: gây chậm trễ và làm giảm khả năng mở rộng

4. Tại sao cần Connection Pool?

- Database Connection được khởi tạo với chi phí đắt đỏ, nên thay vì tạo chúng ở mỗi request thì ta sẽ khởi tạo trước và gọi đến bất cứ khi nào cần truy cập vào Database.
  • Database là tài nguyên được chia sẻ, do đó việc tạo 1 pool của connections và chia sẻ chúng trên tất cả các transaction là điều hợp lý.
  • Datatabase Connection Pool thì giới hạn lượng truy cập vào Database tại 1 thời điểm giúp giảm thiểu việc Database Server bị treo.

5. Tổng kết

Sử dụng connection pool là cần thiết cho các ứng dụng lớn hoặc có lượng truy cập cao, trong khi không sử dụng có thể phù hợp với các ứng dụng nhỏ, đơn giản.