Article:
Dùng JCR thay cho DB trong ActiveRecord
2748
ngocdaothanh.myopenid.com 174Updated over 3 years ago |
Cơ sở dữ liệu (DB), chính xác hơn là cơ sở dữ liệu quan hệ, đã được nghiên cứu và dùng để persist dữ liệu suốt mấy chục năm nay, nên đã cực thịnh. Lưu trữ và truy xuất dữ liệu thì nói chung không có gì tốt hơn DB.
Tuy nhiên, với dữ liệu có cấu trúc cây thư mục tự do như trong các hệ thống quản lí nội dung (CMS), thì về mặt software engineering DB bình thường không tiện cho lập trình lắm, công sức để thực hiện những tính năng như tạo cấu trúc cây tự do, lưu thành phiên bản, search v.v. thường rất lớn.
Phần đầu bài này giới thiệu JCR, giải pháp của Java cho vấn đề trên. Phần sau đề cập cách dùng nó làm backend thay cho DB trong ActiveRecord. Để hiểu phần sau, cần có kinh nghiệm Java và Rails.
JCR là gì?
JCR là viết tắt của Java Content Repository, nghĩa là kho để chứa dữ liệu kiểu nội dung. Nó là chuẩn JSR thứ 170 định nghĩa tập hợp API để chuyên trị dữ liệu có cấu trúc cây.
Theo chuẩn này, JCR có 2 cấp:
- Cấp 1: Chỉ cho phép đọc chứ không cho phép ghi dữ liệu vào kho. Để đọc có thể dùng XPath, SQL, hoặc hàm API để lần mò đến nút cần đọc.
- Cấp 2: Cho phép ghi vào kho.
Thư viện mã nguồn mở JCR nổi tiếng nhất là Jackrabbit với tính năng đáng chú ý:

- Tích hợp Lucene và các thư viện liên quan để tự động trích nội dung lập chỉ mục (index) của plain text, tập tin .pdf, .doc, .ppt v.v.
- Tích hợp WebDAV server.
- Có thư viện OCM (object-content mapping), tương tự ORM (object-relational mapping) như Hibernate.
- JCR là gì
- 10 triệu chứng cho thấy chương trình của bạn thuộc thể loại CMS
- SQL vs. XPath vs. XQuery
- Giới thiệu JCR API
- Tạo phiên bản
- Một số JCR client
- Sling và REST
- JCR vs. JCR2 (XPath bị loại!)
Dùng JCR thay cho DB trong ActiveRecord
Ta dùng Jackrabbit làm JCR server. Có 2 cách dễ để nối với Jackrabbit:
- Nối thẳng tới Jackrabbit trong cùng process của chương trình ta viết (chế độ transient).
- Chạy process Jackrabbit độc lập, rồi từ chương trình ta viết nối tới process đó qua RMI.
Chương trình mẫu đính kém ở dưới:
- Dùng cách sau vì thường phải chạy vài process Rails.
- Gọi hàm API của Jackrabbit thông qua RJB.
- Các tập tin .jar (của Jackrabbit và những thư viện cần thiết) đặt ở lib/java.
- Script để khởi động Jackrabbit process là script/jcr.
- Lớp JCR thừa kế từ ActiveRecord::BaseWithoutTable đặt trong lib/jcr.rb.
- Chương trình không cần dùng DB, để tránh Rails tự động kết nối với DB server khi chương trình khởi động ta thêm dòng require 'activerecord' và config.frameworks -= [:active_record] vào config/environment.rb.
Giả sử muốn lưu bài viết vào JCR, ta khai báo lớp model như sau:
class Article < JCR
column :user_name, :string
column :title, :string
column :body, :string
validates_presence_of :user_name, :title, :body
def to_param
title
end
end
Nhận xét:
- Vì dùng ké ActiveRecord, nên muốn chuyển chương trình dùng DB sang dùng JCR chỉ phải sửa phần model. Tất nhiên chỉ nếu chương trình bạn phân tách rõ ràng MVC
. - Vì JCR không tương thích với DB, nên phải tự viết mã để đọc/ghi. Phần OCM ta tự viết còn đơn giản. Nếu viết được driver để ActiveRecord chạy seamlessly với JCR thì quá tuyệt!
- Với cấu trúc cây phân cấp không sâu (ví dụ chỉ khoảng 2 cấp) hoặc nút có cấu trúc rõ ràng (ví dụ dùng cấu trúc single table inheritance), JCR chơi không lại ActiveRecord với DB cùng các plugin của Rails. Tuy thế, các tính năng của Jackrabbit cho thấy Java mà có JCR là cũng quá tốt rồi
. - Hi vọng những tính năng mới của JCR 2 (vẫn còn đang bàn thảo) sẽ mang đến paradigm mới cho CMS.
Tìm hiểu thêm:
174
over 3 years ago
over 3 years ago