post-image

Connection Pool – Vũ Khí Tối Thượng Kết Nối Database

1. Tổng quan

Thuở mới dấn thân vào con đường lập trình lắm chông gai và đầy trắc trở, tôi đã từng vỗ ngực tự hào khi học tất cả những điều thầy cô dạy trên lớp, làm ra một project cuối kì đẹp “nung ninh” bằng Swing, Database thiết kế gọn gàng theo đúng chuẩn. Những tưởng như vậy mình đã thuộc dạng pro, tôi trở nên lười biếng và tự mãn.

Lúc đó, tôi kiểu như cái thằng: mới bắt được con ve sầu mà cứ ngỡ nắm cả mùa hè trong tay, nhìn thấy miệng giếng nhỏ lại tưởng bầu trời bé tí,… Khi đi thực tập lần đầu tiên, tôi đã bị thực tế vả cho sml và song hành cùng điều đó, tôi cũng học được nhiều thứ mới mẻ và hay ho, Connection Pool là một ví dụ như vậy.

Bài toán về Connection

Trên lớp, khi học tới phần kết nối cơ sở dữ liệu, anh em chúng ta được các thầy cô hướng dẫn tận tình cách làm ra sao, sử dụng những câu lệnh thế nào,… Tuy nhiên, những bài tập đó chỉ sử dụng duy nhất 1 Connection cho mục đích đọc và ghi dữ liệu vào database. Lớn lên một chút nữa, anh em sẽ học tới thiết kế server, cụ thể là một con server nho nhỏ cho 10 client kết nối một lúc chẳng hạn.

Vậy với nhiều connection một lúc như những server nhiều người dùng thì sao? Dĩ nhiên là chúng ta không thể cho từng request kết nối đến database theo thứ tự được rồi, việc khởi tạo và đóng một connection cũng phải mất vài giây, còn chưa kể những nghiệp vụ khác nữa. Thế rốt cuộc phải làm sao để có thể tăng tốc độ ghi và lấy data từ database bây giờ?
Nói dễ hiểu hơn nhé, bạn là người quản lý ô tô, yêu cầu là đưa 100 khách đi từ A đến B trong vòng 10 phút, tuy nhiên xe của bạn chỉ có 30 chỗ và thời gian đi từ A đến B là 7 phút, bạn sẽ làm như thế nào? Anh em hãy suy nghĩ nhé. :v

Connection Pool giải bài toán đó thế nào?

Quay trở lại bài toán phía trên, làm sao anh em có thể chở 100 người đi từ A đến B với thời gian ngắn nhất? Đúng rồi, chúng ta dùng nhiều xe một lúc. Và connection pool cũng tương tự như vậy. 

Để cho ví dụ rõ ràng và sinh động hơn, anh em hãy liên tưởng tới việc anh em đi taxi, những kết nối bình thường cũng giống việc anh em book một chiếc và đi đến Nội Bài, những người khác muốn đến Nội Bài, họ phải chờ cái xe đó quay về mới có thể sử dụng. Và như thế thì … toang chứ còn gì nữa @@. Thay vì đứng trồng cây si như một thằng thất bại chờ một chiếc Taxi duy nhất trở về, chúng ta có thể nhanh chóng book chiếc Taxi khác có sẵn quanh đó, công việc mất chưa đến vài phút. Và bạn có thể hiểu, công ty cung cấp dịch vụ taxi đó có hoạt động giống như một Connection Pool, anh cần taxi, chúng tôi cung cấp taxi cho anh. Với Connection Pool, bạn cần connection, Pool cung cấp connection cho bạn.

Suy cho cùng, lập trình cũng chỉ là việc mô phỏng những gì mà cuộc sống, xã hội đang áp dụng, đang diễn ra hằng ngày. Vậy nên thi thoảng đi ra ngoài và thăm thú đó đây, đừng ru rú ở nhà ôm cái máy tính.

Connection pool cho phép ta tạo một tập các connection trong bộ nhớ đệm, với mỗi request đến database, connection pool sẽ “phân phát” cho request đó một connection trong số các connection đang rảnh. Mỗi một connection sau khi hoàn thành nhiệm vụ sẽ không bị đóng mà sẽ quay về pool và chờ để thực hiện những kết nối tiếp theo. Trường hợp mà tất cả các connection trong pool đều bận, request phải chờ cho có ít nhất 1 connection trong pool hoàn thành nhiệm vụ mới có thể kết nối vào database.

                                                             

Tự làm một Connection Pool đơn giản

Để làm một connection pool, chúng ta cần hiểu nguyên lý hoạt động của pool.

  • Khi khởi tạo một connection pool, connection pool sẽ khởi tạo một số connection trong pool để sẵn sàng sử dụng. Connection pool có thể lưu các connection ở một Araylist, một Blocking queue, …..
  • Khi có một request đến, pool sẽ tự động lấy ra một connection đang ở trạng thái chờ. Nếu trong pool không có connection sẵn sàng và số connection tạo ra nhỏ hơn số connection tối đa, một connection mới được tạo ra, bỏ vào trong pool và lấy ra.
  • Song song với quá trình cung cấp các connection, pool tạo  một thread để loại bỏ các connection timeout và thay thế chúng bằng connection mới.
  • Connection sau khi hoàn thành nhiệm vụ sẽ được đưa trở lại pool để phục vụ những kết nối tiếp theo.

Những công cụ có sẵn

Trên kia là code đơn giản để anh em biết cách hoạt động của connection pool và thực tế, không ai đi phát minh lại cái bánh xe cả. Java có rất nhiều thư viện có thể hỗ trợ tốt cho connection pool như 

  • Hikari
  • C3p0
  • Apache commons DBCP
  • ……….

Việc sử dụng những thư viện có sẵn sẽ giúp anh em hạn chế bug và có hiệu năng tốt hơn. Và sử dụng ra sao thì anh em có thể search google, bài viết của mình dài quá rồi nên không tiện lan man thêm :v

Tạm Kết

Như vậy, qua bài viết này, tôi muốn giới thiệu đến anh em một công cụ lợi hại : Connection pool và lợi ích nó mang lại. 

Anh em có thắc mắc hay góp ý, nhận xét thì xin comment ở bên dưới, mình rất sẵn lòng lắng nghe ý kiến của anh em để có những bài viết tốt hơn trong tương lai.

Nguồn: codelearn.io

Leave a Reply

Your email address will not be published.