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.

pdf21 trang | Chuyên mục: Java | Chia sẻ: dkS00TYs | Lượt xem: 2029 | Lượt tải: 0download
Tóm tắt nội dung 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, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 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:

  • pdfMá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
Tài liệu liên quan