Máy ứng dụng của Google cho Java - Phần 3: Lưu giữ lâu bền và các mối
Tóm tắt: Lưu giữ lâu bền dữ liệu là một phần quan trọng của việc phân phối ứng
dụng có khả năng mở rộng trong các môi trường doanh nghiệp. Trong bài viết cuối
cùng của loạt bài giới thiệu của mình về Máy ứng dụng của Google (Google App
Engine) cho Java™, Rick Hightower chấp nhận các thách thức của các khung
công tác lưu giữ lâu bền dựa trên Java hiện có của Máy ứng dụng (App Engine).
Tìm hiểu các chi tiết về tại sao việc lưu giữ lâu bền bằng Java trong bản các phát
hành trước đây chưa phải là hoàn toàn sẵn sàng cho thời kỳ cao điểm, đồng thời
cũng nhận được một trình diễn làm việc thực sự về những gì mà bạn có thể làm để
lưu giữ lâu bền dữ liệu trong các ứng dụng của Máy ứng dụng cho Java. Chú ý
rằng bạ
Máy ứng dụng cho Java cố gắng loại bỏ mối lo phải viết một tầng lưu giữ lâu bền
cho các ứng dụng Web mở rộng được, nhưng nó thực hiện mục đích đó đến mức
nào? Trong bài viết này, tôi kết thúc bài giới thiệu của mình về Máy ứng dụng cho
Java với một tổng quan về khung công tác lưu giữ lâu bền của nó, dựa trên các đối
tượng dữ liệu Java (Java Data Objects-JDO) và API lưu giữ lâu bền của Java (Java
Persistence API-JPA). Mặc dù ban đầu tỏ ra nhiều hứa hẹn, việc lưu giữ lâu bền
dựa trên Java của Máy ứng dụng hiện tại có một số nhược điểm nghiêm trọng mà
tôi sẽ giải thích và chứng tỏ các nhược điểm đó. Bạn sẽ tìm hiểu xem việc lưu giữ
lâu bền của Máy ứng dụng cho Java hoạt động như thế nào, những thách thức là gì
và bạn có những tùy chọn lưu giữ lâu bền nào khi làm việc với nền tảng đám mây
của Google dành cho các nhà phát triển Java.
look it up first, contact = pm.getObjectById(Contact.class, contact.getId()); pm.deletePersistent(contact); pm.currentTransaction().commit(); } catch (Exception ex) { pm.currentTransaction().rollback(); throw new RuntimeException(ex); } finally { pm.close(); } } public void updateContact(Contact contact) { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); String name = contact.getName(); String phone = contact.getPhone(); String email = contact.getEmail(); try { pm.currentTransaction().begin(); // We don't have a reference to the selected Product. // So we have to look it up first, contact = pm.getObjectById(Contact.class, contact.getId()); contact.setName(name); contact.setPhone(phone); contact.setEmail(email); pm.makePersistent(contact); pm.currentTransaction().commit(); } catch (Exception ex) { pm.currentTransaction().rollback(); throw new RuntimeException(ex); } finally { pm.close(); } } } Theo từng phương thức Bây giờ chúng ta hãy xem xét những gì đang xảy ra với mỗi một trong các phương thức trong Liệt kê 3. Bạn sẽ thấy rằng trong khi các tên phương thức có thể là mới, hành động của chúng phần nhiều là đã quen thuộc. Trước tiên, để truy cập vào PersistenceManager, bạn đã tạo ra một PersistenceManagerFactory tĩnh. Nếu bạn đã làm việc với JPA từ trước, PersistenceManager tương tự với một EntityManager trong JPA. Nếu bạn đã làm việc với Hibernate, PersistenceManager tương tự như một phiên Hibernate. Về bản chất, PersistenceManager là giao diện chính cho hệ thống lưu giữ lâu bền JDO. Nó đại diện cho một phiên làm việc với cơ sở dữ liệu. Phương thức getPersistenceManagerFactory() trả về PersistenceManagerFactory, được khởi tạo tĩnh, như chỉ ra trong Liệt kê 4: Liệt kê 4. getPersistenceManagerFactory() trả về PersistenceManagerFactory private static final PersistenceManagerFactory pmfInstance = JDOHelper .getPersistenceManagerFactory("transactions-optional"); public static PersistenceManagerFactory getPersistenceManagerFactory() { return pmfInstance; } Phương thức addContact() bổ sung thêm một mối liên hệ mới vào kho lưu trữ dữ liệu này. Để làm điều này, nó cần phải tạo ra một cá thể của PersistenceManager và sau đó gọi phương thức makePersistence() của PersistenceManager này. Phương thức makePersistence() lấy đối tượng Contact tạm thời (mà người dùng sẽ phải điền vào trong GWT GUI) và làm cho nó thành một đối tượng lưu giữ lâu bền. Tất cả những việc này được thể hiện trong Liệt kê 5: Liệt kê 5. addContact() public void addContact(Contact contact) { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); try { pm.makePersistent(contact); } finally { pm.close(); } } Chú ý trong Liệt kê 5 persistenceManager được gói trong một khối finally như thế nào. Điều này đảm bảo nó xóa nguồn tài nguyên kết hợp với persistenceManager. Phương thức listContact(), được hiển thị trong Liệt kê 6, tạo ra một đối tượng truy vấn từ persistenceManager mà nó tìm kiếm. Nó gọi phương thức execute(), trả về danh sách các Contact từ kho lưu trữ dữ liệu. Liệt kê 6. listContact() @SuppressWarnings("unchecked") public List listContacts() { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); String query = "select from " + Contact.class.getName(); return (List) pm.newQuery(query).execute(); } Phương thức removeContact() tìm kiếm mối liên hệ bằng mã nhận dạng (ID) trước khi nó loại bỏ mối liên hệ ấy khỏi kho lưu trữ dữ liệu, như chỉ ra trong Liệt kê 7. Nó phải làm điều này chứ không phải chỉ xóa ngay mối liên hệ vì đối tượng Contact đến từ GWT GUI không biết gì về JDO. Bạn phải lấy ra một Contact được kết hợp với một vùng nhớ nhanh (cache) của PersistenceManager trước khi bạn có thể xóa nó. Liệt kê 7. removeContact() public void removeContact(Contact contact) { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); try { pm.currentTransaction().begin(); // We don't have a reference to the selected Product. // So we have to look it up first, contact = pm.getObjectById(Contact.class, contact.getId()); pm.deletePersistent(contact); pm.currentTransaction().commit(); } catch (Exception ex) { pm.currentTransaction().rollback(); throw new RuntimeException(ex); } finally { pm.close(); } } Phương thức updateContact(), trong Liệt kê 8, tương tự như phương thức removeContact(), ở chỗ là nó cũng tìm kiếm Contact. Phương thức updateContact() sau đó sao chép các thuộc tính từ Contact. Các thuộc tính này được chuyển như một đối số đến Contact, đã được tìm kiếm với trình quản lý lưu giữ lâu bền. PersistenceManager kiểm tra các thay đổi của các đối tượng được tìm kiếm. Nếu một đối tượng đã thay đổi, các thay đổi này được PersistenceManager trút sang cơ sở dữ liệu khi một giao dịch cam kết. Liệt kê 8. updateContact() public void updateContact(Contact contact) { PersistenceManager pm = getPersistenceManagerFactory() .getPersistenceManager(); String name = contact.getName(); String phone = contact.getPhone(); String email = contact.getEmail(); try { pm.currentTransaction().begin(); // We don't have a reference to the selected Product. // So we have to look it up first, contact = pm.getObjectById(Contact.class, contact.getId()); contact.setName(name); contact.setPhone(phone); contact.setEmail(email); pm.makePersistent(contact); pm.currentTransaction().commit(); } catch (Exception ex) { pm.currentTransaction().rollback(); throw new RuntimeException(ex); } finally { pm.close(); } } Chú giải cho việc lưu giữ lâu bền đối tượng Để một Contact được lưu giữ lâu bền, bạn phải nhận biết nó như là một đối tượng có khả năng - lưu giữ lâu bền với chú giải @PersistenceCapable. Sau đó bạn cần phải chú giải tất cả các trường có khả năng lưu giữ lâu bền của nó, như thể hiện trong Liệt kê 9: Liệt kê 9. Contact có khả năng lưu giữ lâu bền package gaej.example.contact.client; import java.io.Serializable; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Contact implements Serializable { private static final long serialVersionUID = 1L; @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; @Persistent private String name; @Persistent private String email; @Persistent private String phone; public Contact() { } public Contact(String name, String email, String phone) { super(); this.name = name; this.email = email; this.phone = phone; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } } Nhờ sự kỳ diệu của lập trình hướng đối tượng và các nguyên lý thiết kế bằng giao diện, bạn có thể thay thế ContactDAOMock ban đầu của bạn bằng ContactJdoDAO mới. GWT GUI sau đó sẽ làm việc với JDO mà không cần thay đổi. Cuối cùng, cái thực sự thay đổi với sự trao đổi này là cách mà DAO được thuyết minh trong dịch vụ, như thể hiện trong Liệt kê 10: Liệt kê 10. RemoteServiceServlet public class ContactServiceImpl extends RemoteServiceServlet implements ContactService { private static final long serialVersionUID = 1L; //private ContactDAO contactDAO = new ContactDAOMock(); private ContactDAO contactDAO = new ContactJdoDAO(); ... Kết luận Trong bài viết ba phần này, tôi đã giới thiệu sự hỗ trợ hiện tại của Máy ứng dụng của Google cho Java dành cho việc lưu giữ lâu bền, nó là một trong những hòn đá tảng của việc phân phối ứng dụng có khả năng mở rộng. Tổng thể những điều phát hiện được là khá thất vọng, mặc dù điều quan trọng là cần nhớ rằng đây là một nền tảng đang phát triển. Các ứng dụng được viết cho bản phát hành xem trước của Máy ứng dụng cho Java được buộc chặt với cơ sở hạ tầng lưu giữ lâu bền của Máy ứng dụng, mặc dù chúng có thể sử dụng JDO hay JPA. Máy ứng dụng cho Java trong phiên bản xem trước của nó cũng cung cấp ít tài liệu hướng dẫn về khung công tác lưu giữ lâu bền của nó và các ví dụ mà Máy ứng dụng cho Java gửi kèm làm cho gần như không thể triển khai thực hiện được các quan hệ dù là đơn giản. Thậm chí nếu việc hiện thực JDO và JPA hoàn toàn là mô hình giả, thì hiện nay hầu như không có khả năng để bạn có thể viết một ứng dụng của Máy ứng dụng cho Java và chuyển nó một cách dễ dàng sang thành một ứng dụng doanh nghiệp dựa trên-DBMS. Ít nhất, bạn sẽ phải làm một số công việc nặng về mã hóa để thực hiện chuyển đổi đó. Hy vọng của tôi về việc lưu giữ lâu bền là nó sẽ hoàn thiện theo thời gian. Nếu bạn thực sự cần phải làm việc với Máy ứng dụng cho Java ngay bây giờ, có thể bạn sẽ muốn bỏ qua các API Java và viết trực tiếp đến API kho lưu trữ dữ liệu mức thấp. Làm việc với nền tảng Máy ứng dụng cho Java là có thể được, nhưng nếu bạn quen làm việc với JPA và/hoặc JDO, thì bạn sẽ phải tìm hiểu khá nhiều, cả do sự trừu tượng hóa có lỗ rò được mô tả ở đầu của bài viết này lẫn do các tính năng hoặc vẫn chưa làm việc tốt hoặc hiện nay chưa có tài liệu hướng dẫn tốt. Thành phần cơ bản và các sự trừu tượng hóa có lỗ rò Những rắc rối với các mối quan hệ JDO trong Máy ứng dụng cho Java Kết luận
File đính kèm:
- Máy ứng dụng của Google cho Java Phần 3 Lưu giữ lâu bền và các mối .pdf