Vinova tuyển lập trình viên Mobile & Web ở Hà Nội, lương $300-1000

Article: Dùng JCR thay cho DB trong ActiveRecord 2748

ngocdaothanh.myopenid.com 174
Updated 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.

Tìm hiểu thêm:

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{#emotions_dlg.wink}.
  • 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{#emotions_dlg.tongue_out}.
  • 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:

Comments

ngocdaothanh.myopenid.com 174
over 3 years ago

Bản tiếng Anh của bài này vừa được đăng ở dev.day.com, nội dung hơi khác để phù hợp. Mọi người đọc thử.

nhudinhthuan.myopenid.com 6
over 3 years ago

Chuẩn đặc tả design về content trợ giúp tốt cho developer lập trình cũng như xây dựng các hệ thống cao hơn để họ tập trung vào nghiệp vụ xử lý các content. Chúng theo mô hình hierarchical model  nhưng lại base và store vào relational model (tức phải qua một khâu mapping).

Chưa có một implements nào đủ mạnh về performance và memory với khả năng chứa đến hàng chục triệu record mà doibuon nghĩ là tốt. Làm về database, khi lượng record đến đầu triệu thì sẽ biết mùi.

You must login to be able to comment

Uploaded files
Name Size Uploader Time
jars.txt 546 Bytes over 2 years ago
jcr 967 Bytes over 2 years ago
jcr.rb 3.1 KB over 2 years ago

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content