Alibaba Druid: connection pool Java có SQL parser
Alibaba Druid đáng dùng khi một connection pool thông thường là chưa đủ và bạn muốn nhìn thấy SQL nào đang chạy qua nó. SQL parser và WallFilter của Druid bắt được các kiểu SQL injection mà HikariCP hoàn toàn không xem xét, còn trang Web monitoring của StatFilter hiện số liệu pool và query mà không cần gắn thêm công cụ khác. Điểm trừ: README chính mặc định bằng tiếng Trung, và druid-admin là một thành phần nữa cần được bảo mật riêng.
Alibaba Druid là gì
Alibaba Druid là connection pool database cho Java do đội DataWorks của Alibaba xây dựng, gộp JDBC pooling, SQL parser, tường lửa SQL và giám sát vào một thư viện. Thay vì chỉ cấp và thu hồi connection như HikariCP hay c3p0, Druid phân tích mỗi câu SQL thành AST trước, nên nó còn định dạng, viết lại và kiểm tra SQL. Druid có thể dùng trực tiếp qua DruidDataSource hoặc qua starter Spring Boot cho các phiên bản 2.x, 3.x và 4.x.
Tính năng chính
- ✓DruidDataSource pool JDBC connection với physical connection warmup, PSCache và KeepAlive tích hợp sẵn.
- ✓SQL parser hỗ trợ 30 dialect cơ sở dữ liệu và dựng AST đầy đủ cho từng câu lệnh.
- ✓WallFilter chặn SQL injection và các thao tác nguy hiểm bằng cách phân tích AST đó, không dựa vào so khớp text.
- ✓StatFilter theo dõi thực thi SQL và trạng thái pool theo thời gian thực, hiển thị trên trang Web monitoring.
- ✓Filter-Chain có thể cắm thêm module log, mã hoá hoặc thống kê riêng mà không đụng vào phần pool.
- ✓Starter Spring Boot có cho bản 2.x, 3.x và 4.x, mỗi bản tự cấu hình DruidDataSource từ application.yml.
- ✓HighAvailableDataSource cân bằng tải giữa nhiều datasource kèm health check và failover.
Thêm Druid vào dự án Maven
Thêm Druid như một Maven dependency thường: groupId com.alibaba, artifactId druid, version 1.2.24. Nếu dùng Spring Boot, thay bằng starter đúng phiên bản — druid-spring-boot-starter cho Spring Boot 2.x, druid-spring-boot-3-starter cho 3.x, hoặc druid-spring-boot-4-starter cho 4.x — cùng version 1.2.24. Build từ source cần Java 8+ JDK và Apache Maven 3.6+: clone repo rồi chạy mvn clean install. README không hướng dẫn cấu hình Gradle, nên bạn phải tự chuyển đổi tọa độ Maven nếu dùng Gradle.
Cấu hình DruidDataSource trực tiếp và với Spring Boot
Có hai cách cấu hình DruidDataSource. Trực tiếp: khởi tạo DruidDataSource, gọi setUrl, setUsername, setPassword, setInitialSize, setMaxActive, setMinIdle, rồi gọi init() trước khi lấy connection qua getConnection(). Với Spring Boot: thêm starter tương ứng và cấu hình spring.datasource.druid trong application.yml — initial-size, max-active, min-idle và max-wait điều khiển pool, còn filter.stat.enabled (kèm log-slow-sql và slow-sql-millis) bật giám sát, filter.wall.enabled bật tường lửa SQL. Riêng SQLUtils.parseStatements() và SQLUtils.format() hoạt động trực tiếp trên chuỗi SQL, không cần đụng đến pool — hữu ích nếu bạn chỉ cần phần parser.
Điểm mạnh
- ✓Một dependency duy nhất lo cả pooling, SQL parsing, tường lửa và giám sát, thay vì bốn thư viện riêng.
- ✓WallFilter đánh giá dựa trên AST đã phân tích, không dùng regex, trước khi gắn cờ một query là nguy hiểm.
- ✓Starter Spring Boot theo kịp cả 2.x, 3.x và 4.x, nên nâng cấp Spring Boot không làm gãy phần tích hợp.
- ✓SQLUtils dùng độc lập được cho việc format và phân tích SQL trong tooling không đụng gì tới pool.
Hạn chế và các vấn đề bảo trì cần lưu ý
- △README chính mặc định bằng tiếng Trung; nội dung tiếng Anh nằm ở README_EN.md riêng và một trang wiki FAQ riêng, nên team không đọc được tiếng Trung phải chủ động chuyển file.
- △Trang Web monitoring cũng là một bề mặt cần khoá lại — WallFilter bảo vệ SQL, không kiểm soát ai được xem số liệu pool và query của bạn.
- △Gradle không được tài liệu hoá.
So sánh Druid với HikariCP, c3p0 và DBCP2
Khi nào Druid là lựa chọn phù hợp
Druid phù hợp với team Java đang dùng MySQL, PostgreSQL, Oracle hoặc một trong 30 dialect khác mà Druid hỗ trợ, muốn có giám sát pool và chống SQL injection cơ bản mà không cần thêm agent APM hay firewall riêng. Nó cũng hợp với ai cần parse hoặc viết lại SQL bằng code — SQLUtils hoạt động độc lập với phần pool. Druid không hợp nếu bạn chỉ cần một pool nhanh, đơn giản nhất và không quan tâm đến việc nhìn thấy SQL bên trong — đó là việc của HikariCP, không phải của Druid.
Câu hỏi thường gặp
SQL parser của Alibaba Druid hỗ trợ 30 dialect cơ sở dữ liệu, gồm các hệ quan hệ phổ biến như MySQL, PostgreSQL, Oracle, SQL Server, engine phân tích như ClickHouse, StarRocks, và engine tính toán như Hive, Spark, Presto.
Alibaba Druid có starter riêng cho từng bản: druid-spring-boot-starter cho Spring Boot 2.x, druid-spring-boot-3-starter cho 3.x, và druid-spring-boot-4-starter cho 4.x, mỗi starter tự động cấu hình sẵn nên bạn không cần tự khai báo DruidDataSource làm bean.
README của Alibaba Druid không dùng cụm từ production ready, nhưng mô tả Druid là dự án do đội DataWorks của Alibaba xây dựng riêng để giám sát connection pool, phát hành theo giấy phép Apache-2.0 và có starter Spring Boot từ 2.x đến 4.x.
WallFilter của Alibaba Druid phân tích mỗi câu SQL thành AST thay vì so khớp text thô, sau đó đối chiếu AST đó với các quy tắc phát hiện injection và thao tác nguy hiểm trước khi query chạm tới cơ sở dữ liệu, rồi chặn thay vì chỉ ghi log.
README của Alibaba Druid không công bố số liệu benchmark so với HikariCP, nên phần hiệu năng không được tài liệu hoá rõ ràng. Khác biệt thực tế nằm ở phạm vi: HikariCP là pool tối giản, còn Druid xử lý thêm SQL parsing, tường lửa và giám sát trên mỗi query.
Bật trang Web monitoring của Alibaba Druid bằng cách bật StatFilter — với Spring Boot, đặt filter.stat.enabled thành true (có thể thêm log-slow-sql và slow-sql-millis) trong application.yml; StatFilter sẽ thu thập số liệu thực thi SQL và trạng thái pool cho trang monitoring.
Vấn đề mà Druid giải quyết
Alibaba Druid được đội DataWorks của Alibaba xây dựng để trả lời câu hỏi mà các JDBC pool thường như DBCP2 hay c3p0 không trả lời được: bên trong pool và trong SQL chạy qua nó thực sự đang xảy ra chuyện gì? Một pool thông thường chỉ cấp rồi thu hồi connection, không cho biết query nào chậm, không parse SQL để biết query đó làm gì, và không chặn được một câu lệnh bị injection trước khi nó chạm tới cơ sở dữ liệu. Druid gộp pooling, SQL parser, WallFilter và StatFilter vào một dependency duy nhất thay vì phải ghép nhiều công cụ riêng lẻ.
Trường hợp sử dụng tốt nhất
- •Thay một JDBC pool thường bằng Druid để có thêm khả năng chặn SQL injection qua WallFilter, thay vì gắn thêm firewall riêng.
- •Chẩn đoán query chậm bằng log-slow-sql của StatFilter và trang monitoring có sẵn, thay vì cài thêm agent APM.
- •Parse, format hoặc viết lại SQL qua nhiều dialect trong tooling, dùng SQLUtils độc lập với phần pool.
- •Chạy nhiều datasource sau một pool duy nhất với HighAvailableDataSource để cân bằng tải và failover.
Vẫn đang phân vân về druid?
Một cú bấm sẽ gửi câu hỏi kèm trang này cho AI — xem AI nói gì về druid.
